
SPI Serial Peripheral Interface 串行外围设备接口 是一种告诉,全双工,同步的通信总线 MISO MOSI SCL CS SPI的结构框图 ![]() 8个时钟周期,主机和从机移位寄存器中的数据完全交换 硬件上通过4根线连接 主机和从机都有一个串行移位寄存器,主机通过向自己的SPI串行寄存器写入一个字节来发起一次传输 串行寄存器通过MOSI将主机数据传输给从机,同时从机也将自己的串行移位寄存器数据通过MISO传给主机,两个串行移位寄存器中的内容进行交换 外设的读写操作同时完成。若写操作,只需要忽略收到的字节,若读操作,则主机发送8位空字节即可 STM32的SPI模块 3线全双工同步传输 8位或16位帧格式 主或从 可编程的时钟极性和相位 主机和从机均可通过硬件进行NSS管理 可编程的数据顺序,MSB在前或LSB在前 可触发中断的专用发送和接收标志 从选择NSS管理 两种NSS模式: 软件NSS 硬件NSS 软件NSS 通过设置SPI_CR1寄存器的SSM位来使能这种模式 这种模式下NSS引脚可以另作他用。内部的NSS电平可以通过SPI_CR1寄存器进行驱动 硬件NSS 若NSS输出被使能,此时STM32工作为主SPI,并且NSS输出已经通过SPI_CR2寄存器的SSOE位使能,此时NSS引脚被拉低,所有NSS引脚与这个主SPI的NSS引脚相连并配置为硬件NSS的SPI设备,将自动变成SPI设备 若一个SPI设备需要发送广播数据,它必须拉低NSS信号,从而通知其他所有的设备,它是主设备;如果它不能拉低NSS,这意味着总线上有另外一个主设备在通信,这是将产生Hard Fault 若NSS输出被关闭,允许操作于多主环境 时钟信号的相位与极性 通过SPI_CR寄存器的CPOL和CPHA位进行控制 共有4种可能性 CPOL即时钟极性,控制在没有数据传输时的是中能够空闲状态电平,对于主模式和从模式下的设备都是有效的 CPOL为0,表示SCK在空闲时为低电平 CPOL为1,表示SCK在空闲时为高电平 CPHA即数据在上升沿还是下降沿被采集 CPHA为0,表示数据在下降沿被采集 CPHA为1,表示数据在上升沿被采集 ![]() ![]() 使用时,根据对应芯片的Datasheet选择时钟的相位和极性 数据帧格式 由SPI_CR1寄存器的LSBFIRST位进行配置 输出数据可以MSB或LSB 由SPI_CR1寄存器的DFF位可以配置数据帧为8位或16位 状态标志 3个状态标志 发送缓冲器空闲标志TXE 接收缓冲器非空RXNE 忙标志Busy SPI中断 ![]() STM32F103RCT6的SPI1引脚 ![]() SPI模块引脚配置的GPIO模式 ![]() SPI的常用寄存器 SPI控制寄存器1 SPI_CR1 SPI控制寄存器2 SPI_CR2 SPI状态寄存器 SPI_SR SPI数据寄存器 SPI_DR SPI_I2S配置寄存器 SPI_I2S_CFGR SPI_I2S预分频寄存器 SPI_I2SPR 注意:STM32的SPI接口可以配置为支持SPI协议或支持I2S音频协议,默认是SPI模式,可以通过软件切换到I2S模式 STM32的SPI相关固件函数 SPI_I2S_DeInit ![]() SPI_Init ![]() SPI_Cmd ![]() SPI_I2S_ITConfig ![]() SPI_I2S_DMACmd ![]() SPI_I2S_SendData ![]() SPI_I2S_ReceiveData ![]() SPI_DataSizeConfig ![]() SPI_I2S_GetFlagStatus ![]() SPI_I2S_ClearFlag ![]() SPI_I2S_GetITStatus ![]() SPI_I2S_ClearITPendingBit ![]() ———————————————— 版权声明:CodeForCoffee |
经验分享 | SPI传输时为何丢失2个数据?
经验分享 | STM32H7 EXTI + SPI +DMA 双缓冲应用演示
使用Nano板验证驱动SPI串口屏的颜色显示
【经验分享】STM32的SPI的原理与使用(W25Q128附代码)
【STM32C0评测】4、驱动Lorasx126x,实现透传
基于STM32的SPI传输时会丢失数据吗?
基于STM32基础的SPI总线概述
基于STM32的SPI读取数据的最后位出错问题经验分享
基于STM32关闭SPI会导致WRPERR错误的问题分析
基于STM32关闭SPI导致WRPERR错误经验分享