目录
1 SPI概述
SPI是高速全双工同步串行通信接口,主要应用在 EEPROM,FLASH,实时时钟,AD 转换器,还有数字信号处理器和数字信号解码器之间。
1.1 接口
SPI主要有四根线
MOSI、MISO、SCK、CS。
- MISO:主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。
- MOSI:主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。
- SCK:串口时钟,作为主设备的输出,从设备的输入
- CS:片选引脚,一般由主设备控制。
1.2 通信方法
主机和从机都有一个串行移位寄存器,主机通过向它的 SPI 串行寄存器写入一个字节来发起一次传输,寄存器通过 MOSI 信号线将字节传送给从机,从机也将自己的移位寄存器中的内容通过 MISO 信号线返回给主机。这样,两个移位寄存器中的内容就被交换。外设的读和写是同步完成的!如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。
1.3 STM32 SPI概述
STM32有三个SPI模块。SPI1在APB1时钟下,SPI2和SPI3在APB2时钟下。大容量产品支持SPI协议和I2S音频协,默认工作在SPI方式。
- 3线全双工同步传输
- 带或不带第三根双向数据线的双线单工同步传输
- 8或16位传输帧格式选择
- 主或从操作
- 支持多主模式
- 8个主模式波特率预分频系数(最大为Fpclk/2)
- 从模式频率 (最大为Fpclk/2)
- 主模式和从模式的快速通信
- 主模式和从模式下均可以由软件或硬件进行NSS管理:主/从操作模式的动态改变
- 可编程的时钟极性和相位
- 可编程的数据顺序,MSB在前或LSB在前
- 可触发中断的专用发送和接收标志
- SPI总线忙状态标志
- 支持可靠通信的硬件CRC
- 在发送模式下,CRC值可以被作为最后一个字节发送
- 在全双工模式中对接收到的最后一个字节自动进行CRC校验
- 可触发中断的主模式故障、过载以及CRC错误标志
- 支持DMA功能的1字节发送和接收缓冲器:产生发送和接受请求
2 功能详述
2.1 NSS引脚详解
其他的引脚没什么好说的,主要是NSS引脚,见前文《STM32-SPI的NSS详解》
2.2 时钟信号的相位和极性
SPI_CR寄存器的CPOL(时钟极性)和CPHA(时钟极性)。
如果CPOL被 清’0’,SCK引脚在空闲状态保持低电平;如果CPOL被置’1’,SCK引脚在空闲状态保持高电平。
如果CPHA(时钟相位)位被置’1’,SCK时钟的第二个边沿进行数据位的采样,数据在第二个时钟边沿被锁存;如果CPHA位被清’0’,SCK时钟的第一边沿进行数据位采样,数据在第一个时钟边沿被锁存。
能够组合成四种可能的时序关系
| CPHA=0 | CPHA=1 | |
| CPOL=0 | SCK空闲低,第一SCK边沿采样 | SCK空闲低,第二SCK边沿采样 |
| CPOL=1 | SCK空闲高,第一SCK边沿采样 | SCK空闲高,第二SCK边沿采样 |
2.3 数据帧格式
控制寄存器的LABFIRST位可以设置为MSB在先或LSB在先。控制寄存器的DFF位可以设置为8位数据或16位数据。
2.4 主/从模式的数据发送和接收过程
主模式和从模式的发送和接收过程一致。一般我们使用的模式为主模式!
发送数据:
当写入数据至发送缓冲器时,发送过程开始。在发送第一个数据位时,数据字被并行地(通过内部总线)传入移位寄存器,而后串行地移出到MOSI脚上;MSB在先还是LSB在先,取决于SPI_CR1寄存器中的LSBFIRST位的设置。数据从发送缓冲器传输到移位寄存器时TXE标志将被置位,如果设置了SPI_CR1寄存器中的TXEIE位,将产生中断。
接收数据
当数据传输完成时,传送移位寄存器里的数据到接收缓冲器,并且RXNE标志被置位,读SPI_DR寄存器将清除RXNE位。