树莓派SPI使用

您所在的位置:网站首页 树莓派怎么接线 树莓派SPI使用

树莓派SPI使用

2023-09-16 19:38| 来源: 网络整理| 查看: 265

 

 

 

截图软件

sudo apt-get install scrot

 scrot -s /home/pi/Desktop/example.png

 

 

 

 

 

 

关于SPI

SPI是串行外设接口(Serial Peripheral Interface)的简写,其实就是一种总线通信协议,该总线以主从方式工作,通常是一个主设备和一个或多个从设备,一般需要4根线来进行数据通信,即SDI(数据输入)、SDO(数据输出)、SCLK(时钟)、CS(片选),相应的,有一套时序逻辑规定了通信过程。一般使用SPI的设备都配备了现成的SPI模块,只需要对相应的寄存器写入指令就可以进行通信了,如果没有SPI接口,也可以软件实现,就是根据时序图手动操作GPIO来实现通信,这就比较费劲了。

树莓派已经带了SPI接口,不过默认是关闭的。执行sudo raspi-config 进入配置页,打开SPI接口。这里写图片描述

也可以使用树莓派的图形化设置工具

设置完后可以执行lsmod 查看是否有spi模块存在

//设置之前 pi@raspberrypi:~ $ lsmod Module Size Used by rfcomm 45056 4 bnep 20480 2 //设置之后 pi@raspberrypi:~ $ lsmod Module Size Used by spidev 20480 0 spi_bcm2835 24576 0

还可以查看在/dev下是否存在spidev0.0和spidev0.1两个文件,这两个文件代表了树莓派SPI模块可以使能两个SPI从设备,也对应了GPIO上的CE0和CE1脚。

 

接线

把模块的引脚接到树莓派的GPIO上, 需要注意这里要分清GPIO引脚号是BCM编号还是实际编号。GND脚和树莓派的GND连接;VCC接到3.3V脚;D0接到树莓派的SCLK脚(第23号脚),即BCM.11脚;D1接到MOSI脚(第19号脚),即BCM.10;RES接到BCM.17脚,即第11号脚;DC接到BCM.22脚,即第15号脚;CS接到CE0脚(第24号脚)。总之,除了RES和DC是可以任意指定GPIO口,其他引脚是必须和树莓派上的指定脚连接的。

这里写图片描述

安装相关库

执行下面的更新内核并安装基本环境,这个不是必须的,一般都已经装好了:

sudo apt-get update sudo apt-get install build-essential python-dev python-pip sudo pip install RPi.GPIO

 

参考:

https://blog.csdn.net/wangzhenyang2/article/details/80299625

https://blog.csdn.net/qq_32481879/article/details/78546851 //need review

https://blog.csdn.net/borntox/article/details/51871480

https://www.cnblogs.com/sankye/p/3955630.html //need review

 

https://blog.csdn.net/TAlice/article/details/83868713?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

一、SPI协议介绍: 1、【SPI基础知识简介】

SPI全称是串行外设接口(Serial Peripheral Interface),是由Motorola提出的一种全双工同步串行通信接口,通信波特率可以高达5Mbps,但具体速度大小取决于SPI硬件。SPI接口具有全双工操作,操作简单,数据传输速率较高的优点,但也存在没有指定的流控制,没有应答机制确认是否接收到数据的缺点。SPI总线只需四条线就可以完成MCU与各种外围器件的通讯:

SCLK:Serial Clock,(串行)时钟 MISO:Master In Slave Out,主设备输入,从设备输出 MOSI:Master Out  Slave In,主设备输出,从设备输入 SS:        Slave Select,选中从设备,片选,片选的其他别称[① CS(Chip Select)芯片选择、②CE(Chip Enable)芯片使能]

2、【SPI相关的缩写或说法】

先简单说一下,关于SPI中一些常见的说法: SPI的极性Polarity和相位Phase,最常见的写法是CPOL和CPHA,不过也有一些其他写法,简单总结如下: (1) CKPOL (Clock Polarity) = CPOL = POL = Polarity = (时钟)极性 (2) CKPHA (Clock Phase)   = CPHA = PHA = Phase = (时钟)相位 (3) SCK=SCLK=SPI的时钟 (4) Edge=边沿,即时钟电平变化的时刻,即上升沿(rising edge)或者下降沿(falling edge) 对于一个时钟周期内,有两个edge,分别称为: Leading edge=前一个边沿=第一个边沿,对于开始电压是1,那么就是1变成0的时候,对于开始电压是0,那么就是0变成1的时候; Trailing edge=后一个边沿=第二个边沿,对于开始电压是1,那么就是0变成1的时候(即在第一次1变成0之后,才可能有后面的0变成1),对于开始电压是0,那么就是1变成0的时候;

 

3、【SPI总线通信】

①、SPI是[单主设备(single-master )]通信协议,这意味着总线中的只有一支中心设备能发起通信。当SPI主设备想读/写[从设备]时,它首先拉低[从设备]对应的SS线(SS是低电平有效),接着开始发送工作脉冲到时钟线上,在相应的脉冲时间上,[主设备]把信号发到MOSI实现“写”,同时可对MISO采样而实现“读”

 

②、SPI模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响,SPI主模块和与之通信的外设音时钟相位和极性应该一致。 如果CPOL=0,串行同步时钟的空闲状态为低电平;  如果CPOL=1,串行同步时钟的空闲状态为高电平;  时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。  如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;  如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样;

4、【数据传输】

在一个SPI时钟周期内,会完成如下操作:

1) 主设备通过MOSI线发送1位数据,从设备通过该线读取这1位数据;

2) 从设备通过MISO线发送1位数据,主设备通过该线读取这1位数据。

这是通过移位寄存器来实现的。如图所示,主设备和从设备各有一个移位寄存器,且二者连接成环。随着时钟脉冲,数据按照从高位到低位的方式依次移出主设备寄存器和从机寄存器,并且依次移入从设备寄存器和主设备寄存器。当寄存器中的内容全部移出时,相当于完成了两个寄存器内容的交换。

5、【内部工作机制】

SSPSR 是 SPI 设备内部的移位寄存器(Shift Register). 它的主要作用是根据 SPI 时钟信号状态, 往 SSPBUF 里移入或者移出数据, 每次移动的数据大小由Bus-Width 以及 Channel-Width 所决定。

 

二、树莓派40Pin引脚对照图:

三、本次SPI编程要实现的结果:

用排线短接树莓派的19脚和21脚,实现树莓派spi通信的自发自收

四、SPI编程实现: 1、编程思路:

①、使能内核SPI驱动模块抽象出spi设备 ②、利用open系统调用打开spi设备 "/dev/spidev0.0" ③、利用ioctl设置spi设备各项参数 ④、进行读写操作

2、实际操作与代码部分:

①、使能内核SPI驱动 pi@raspberrypi:~ $ sudo raspi-config     弹出系统配置对话框,使能spi,重新启动树莓派,内核加载成功

重启之后可以确认系统已自动加载SPI驱动

pi@raspberrypi:~ $ ls /dev/spidev0.* /dev/spidev0.0      /dev/spidev0.1

这里抽象出两个spi接口设备,但树莓派只引出来一组spi(引脚19、21、23、24),对应的设备文件为/dev/spidev0.0

②树莓派自发自收代码

/********************************************************************************* * Copyright: (C) 2018 wangtao * All rights reserved. * * Filename: spi_own.c * Description: This file * * Version: 1.0.0(11/07/2018) * Author: WangTao * ChangeLog: 1, Release initial version on "11/07/2018 17:15:56 PM" * ********************************************************************************/ #include #include #include #include "SPISet.h" int initSPI() { int spiFd; spiFd=SPISetup(0,500000); //初始化SPI通道0,并设置为最大速度500000hz if(spiFd==-1) { printf("init spi failed!\n"); } } int main() { char tx_Data[10]={1,2,3,4,5,6,7,8,9,10}; //定义读写的数据 char rx_Data[10]={0,0,0,0,0,0,0,0,0,0}; int i=0; initSPI(); //spi的初始化 while(1) { SPIDataRW(0,tx_Data,rx_Data,7); //向总线中写入7个数据 printf("read spi_rx_data is:\n"); //读出总线的数据,引脚19与21短接打印【1,2,3,4,5,6,7,0,0,0】 // 引脚19与21不短接打印【0,0,0,0,0,0,0,0,0,0】 for(i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3