通常SPI通过4个引脚与外部器件相连:
MISO:主设备输入/从设备输出引脚。
MOSI
:
主设备输出/从设备输入引脚
SCK:串口时钟,作为主设备的输出,从设备的输入
NSS:从设备选择。这是一个可选的引脚,用来选择主/从设备。
时序:
SPI有4种工作时序模式:
CPOL表示时钟信号的初始电平的状态,CPOL为0表示时钟信号初始状态为低电平,为1表示时钟信号的初始电平是高电平
。
CPHA来表示在那个时钟沿采样数据,CPHA为0表示在首个时钟变化沿采样数据,而CPHA为1则表示要在第二个时钟变化沿来采样数据
。
-
CPOL=0,CPHA=
0
模式0
-
CPOL=0,CPHA=1 模式1
-
CPOL=1,CPHA=0 模式2
-
CPOL=1,CPHA=1 模式3
模式的设置在
Linux.h
内部工作机理:
SSPSR 是 SPI 设备内部的移位寄存器(Shift Register). 它的主要作用是根据 SPI时钟信号状态, 往 SSPBUF 里移入或者移出数据, 每次移动的数据大小由 Bus-Width 以
及 Channel-Width 所决定.
Linux SPI设备接口函数
1. open/close
打开和关闭设备节点,直接使用open/write就可以了。
2. read/write
读写SPI设备可以直接使用read/write函数,但是每次读或者写的大小不能大于4096Byte。
每次读写,Linux会自动把CS和NSS置高或置低。
3. IOCTL命令
用户空间对spidev设备节点使用IOCTL命令失败会返回-1。
l SPI_IOC_RD_MODE
读取SPI设备对应的spi_device.mode。使用的方法如下:
ioctl(fd,SPI_IOC_RD_MODE, &mode);
其中第三个参数是一个uint8_t类型的变量。
l SPI_IOC_WR_MODE
设置SPI设备对应的spi_device.mode。使用的方式如下:
ioctl(fd,SPI_IOC_WR_MODE, &mode);
l SPI_IOC_RD_LSB_FIRST
查看设备传输的时候是否先传输低比特位。如果是的话,返回1。使用的方式如下:
ioctl(fd,SPI_IOC_RD_LSB_FIRST, &lsb);
其中lsb是一个uint8_t类型的变量。返回的结果存在lsb中。
l SPI_IOC_WR_LSB_FIRST
设置设备传输的时候是否先传输低比特位。当传入非零的时候,低比特在前,当传入0的时候高比特在前(默认)。使用的方式如下:
ioctl(fd,SPI_IOC_WR_LSB_FIRST, &lsb);
l SPI_IOC_RD_BITS_PER_WORD
读取SPI设备的字长。使用的方式如下:
ioctl(fd,SPI_IOC_RD_BITS_PER_WORD, &bits);
其中bits是一个uibt8_t类型的变量。返回的结果保存在bits中。
l SPI_IOC_WR_BITS_PER_WORD
设置SPI通信的字长。使用的方式如下:
ioctl(fd,SPI_IOC_WR_BITS_PER_WORD, &bits);
l SPI_IOC_RD_MAX_SPEED_HZ
读取SPI设备的通信的最大时钟频率。使用的方式如下:
ioctl(fd,SPI_IOC_RD_MAX_SPEED_HZ, &speed);
其中speed是一个uint32_t类型的变量。返回的结果保存在speed中。
l SPI_IOC_WR_MAX_SPEED_HZ
设置SPI设备的通信的最大时钟频率。使用的方式如下:
ioctl(fd,SPI_IOC_WR_MAX_SPEED_HZ, &speed);
l SPI_IOC_MESSAGE(N)
一次进行双向/多次读写操作。使用的方式如下:
structspi_ioc_transfer xfer[2];
……
status= ioctl(fd, SPI_IOC_MESSAGE(2), xfer);
QT调试SPI Demo(Linux下使用):
界面:
链接:https://pan.baidu.com/s/1tnQT_rKr7Gg-U3czuElikQ
提取码:9an5
复制这段内容后打开百度网盘手机App,操作更方便哦