SPI(Serial Peripheral interface)

串行外围设备接口,全双工,同步。

在芯片的管脚上只占用四根线,主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。

分为主从两种模式,一主一从或者一主多从,主设备提供时钟,从设备接收时钟。(类似与I2c但是不完全相同)

四条信号线

SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)

SPI6

SPI数据的传输

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

  1. 首先拉低对应SS信号线,表示与该设备进行通信
  2. 主机通过发送SCLK时钟信号,来告诉从机写数据或者读数据
    这里要注意,SCLK时钟信号可能是低电平有效,也可能是高电平有效,因为SPI有四种模式,这个我们在下面会介绍
  3. 主机(Master)将要发送的数据写到发送数据缓存区(Memory),缓存区经过移位寄存器(0~7),串行移位寄存器通过MOSI信号线将字节一位一位的移出去传送给从机,,同时MISO接口接收到的数据经过移位寄存器一位一位的移到接收缓存区。
  4. 从机(Slave)也将自己的串行移位寄存器(0~7)中的内容通过MISO信号线返回给主机。同时通过MOSI信号线接收主机发送的数据,这样,两个移位寄存器中的内容就被交换。

SPI只有主从之分,没有读写之分,读和写都是同时进行的。发一个数据必须接受到一个数据,接受一个数据必须发出一个数据。

SPI的四种模式,简单地讲就是设置SCLK时钟信号线的那种信号为有效信号

通信双方必须工作在同一模式下

只要四根信号线连接正确,SPI模式相同,将CS/SS信号线拉低,即可以直接通信,一次一个字节的传输,读写数据同时操作,这就是SPI

缺点:没有指定的流控制,没有应答机制确认是否接收到数据

SPI在HAL库中的使用方法

开启全双工主模式(Full-Duplex Master)硬件NSS关闭(还有很多模式如从机模式,只接受主机模式等根据具体的需要来设置)硬件NSS可以使能其他GPIO口来代替

可通过设置分频来设置波特率

SPI相关函数

和串口相同,SPI也有三种控制方式:轮询,中断,DMA。

1
2
3
4
5
HAL_StatusTypeDef  HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);//发送数据
HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);//接收数据
//轮询的方式
//hspi句柄选择要在那个spi上,*pData你要发送或者接受的数据可以为数组,size为收发字节数,timeout为执行函数的最长时间,超过该时间自动退出

1
2
3
4
5
 HAL_SPI_TransmitReceive_IT(&hspi1, TXbuf,RXbuf,CommSize);
//当接受出现了CommSize个字节的数据后,中断函数会调用SPI回调函数 SPI发送接收一体
//SPI开始通信的时候记得拉低cS电平


SPI1