目录
SPI是高速全双工同步串行通信接口,主要应用在 EEPROM,FLASH,实时时钟,AD 转换器,还有数字信号处理器和数字信号解码器之间。
SPI主要有四根线
MOSI、MISO、SCK、CS。
主机和从机都有一个串行移位寄存器,主机通过向它的 SPI 串行寄存器写入一个字节来发起一次传输,寄存器通过 MOSI 信号线将字节传送给从机,从机也将自己的移位寄存器中的内容通过 MISO 信号线返回给主机。这样,两个移位寄存器中的内容就被交换。外设的读和写是同步完成的!如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。
STM32有三个SPI模块。SPI1在APB1时钟下,SPI2和SPI3在APB2时钟下。大容量产品支持SPI协议和I2S音频协,默认工作在SPI方式。
其他的引脚没什么好说的,主要是NSS引脚,见前文《STM32-SPI的NSS详解》
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边沿采样 |
控制寄存器的LABFIRST位可以设置为MSB在先或LSB在先。控制寄存器的DFF位可以设置为8位数据或16位数据。
主模式和从模式的发送和接收过程一致。一般我们使用的模式为主模式!
发送数据:
当写入数据至发送缓冲器时,发送过程开始。在发送第一个数据位时,数据字被并行地(通过内部总线)传入移位寄存器,而后串行地移出到MOSI脚上;MSB在先还是LSB在先,取决于SPI_CR1寄存器中的LSBFIRST位的设置。数据从发送缓冲器传输到移位寄存器时TXE标志将被置位,如果设置了SPI_CR1寄存器中的TXEIE位,将产生中断。
接收数据
当数据传输完成时,传送移位寄存器里的数据到接收缓冲器,并且RXNE标志被置位,读SPI_DR寄存器将清除RXNE位。