SPI通信
SPI(Serial Peripheral interface)
串行外围设备接口,全双工,同步。
在芯片的管脚上只占用四根线,主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。
分为主从两种模式,一主一从或者一主多从,主设备提供时钟,从设备接收时钟。(类似与I2c但是不完全相同)
四条信号线
SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)

SPI数据的传输
单主设备通信协议,总线中只有一支中心设备能发起通信。当SPI主设备想读/写[从设备]时,它首先拉低[从设备]对应的SS线(SS是低电平有效),接着开始发送工作脉冲到时钟线上,在相应的脉冲时间上,[主设备]把信号发到MOSI实现“写”,同时可对MISO采样而实现“读”
- 首先拉低对应SS信号线,表示与该设备进行通信
- 主机通过发送SCLK时钟信号,来告诉从机写数据或者读数据
这里要注意,SCLK时钟信号可能是低电平有效,也可能是高电平有效,因为SPI有四种模式,这个我们在下面会介绍 - 主机(Master)将要发送的数据写到发送数据缓存区(Memory),缓存区经过移位寄存器(0~7),串行移位寄存器通过MOSI信号线将字节一位一位的移出去传送给从机,,同时MISO接口接收到的数据经过移位寄存器一位一位的移到接收缓存区。
- 从机(Slave)也将自己的串行移位寄存器(0~7)中的内容通过MISO信号线返回给主机。同时通过MOSI信号线接收主机发送的数据,这样,两个移位寄存器中的内容就被交换。
SPI只有主从之分,没有读写之分,读和写都是同时进行的。发一个数据必须接受到一个数据,接受一个数据必须发出一个数据。
SPI的四种模式,简单地讲就是设置SCLK时钟信号线的那种信号为有效信号
通信双方必须工作在同一模式下
只要四根信号线连接正确,SPI模式相同,将CS/SS信号线拉低,即可以直接通信,一次一个字节的传输,读写数据同时操作,这就是SPI
缺点:没有指定的流控制,没有应答机制确认是否接收到数据
SPI在HAL库中的使用方法
开启全双工主模式(Full-Duplex Master)硬件NSS关闭(还有很多模式如从机模式,只接受主机模式等根据具体的需要来设置)硬件NSS可以使能其他GPIO口来代替
可通过设置分频来设置波特率
SPI相关函数
和串口相同,SPI也有三种控制方式:轮询,中断,DMA。
1 | HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);//发送数据 |
1 | HAL_SPI_TransmitReceive_IT(&hspi1, TXbuf,RXbuf,CommSize); |

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Casel!
评论
