SPI通信协议
~ SPI和串口都是一种全双工的通信方式:支持同时收-同时发
~ SPI有MOSI(Master Output,Slave Input)和MISO(Master Input,Slave Output);
~ 串口有TX和RX;
~ IIC只有一根数据线;
~ IIC是一种半双工的通信方式:在某一时刻可以接受或发送 不能在同一时刻收发。
SPI的常见通信系统:
SPI的通信时序:
~ 这是一个主机的通讯时序。NSS、SCK、MOSI信号都由主机控制产生,而 MISO 的信号由从机产生,主机通过该信号线读取从机的数据。MOSI与 MISO 的信号只在 NSS为低电平的时候才有效,在 SCK 的每个时钟周期 MOSI和 MISO 传输一位数据。
~ 标号1处,NSS信号线由高变低,是 SPI通讯的起始信号。NSS是每个从机各自独占的信号线,当从机检在自己的 NSS线检测到起始信号后,就知道自己被主机选中了,开始准备与主机通讯。在图中的标号6处,NSS信号由低变高,是 SPI通讯的停止信号,表示本次通讯结束,从机的选中状态被取消。
~ SPI使用 MOSI及 MISO 信号线来传输数据,使用 SCK 信号线进行数据同步。MOSI及 MISO 数据线在 SCK的每个时钟周期传输一位数据,且数据输入输出是同时进行的。(故假设通信的SCK频率为20MHz,故数据每秒传输20MBit。)数据传输时,MSB先行或 LSB先行并没有作硬性规定,但要保证两个 SPI通讯设备之间使用同样的协定,一般都会采用图中的 MSB先行模式。
~ 观察图中的2,3,4,5标号处,MOSI及 MISO 的数据在 SCK 的上升沿期间变化输出,在 SCK 的下降沿时被采样。即在 SCK的下降沿时刻,MOSI及 MISO 的数据有效,高电平时表示数据“1”,为低电平时表示数据“0”。在其它时刻,数据无效,MOSI及 MISO为下一次表示数据做准备。SPI每次数据传输可以 8位或 16 位为单位,每次传输的单位数不受限制。
上图中的时序只是 SPI中的其中一种通讯模式,SPI一共有四种通讯模式,它们的主要区别是总线空闲时 SCK 的时钟状态以及数据采样时刻。他们由“时钟极性 CPOL”和“时钟相位 CPHA”决定。
时钟极性 CPOL是指 SPI通讯设备处于空闲状态时,SCK 信号线的电平信号(即 SPI通讯开始前、 NSS线为高电平时 SCK 的状态)。CPOL=0 时, SCK 在空闲状态时为低电平,CPOL=1 时,则相反。
时钟相位 CPHA是指数据的采样的时刻,当 CPHA=0时,MOSI或 MISO 数据线上的信号将会在 SCK时钟线的“奇数边沿”被采样。当 CPHA=1 时,数据线在 SCK 的“偶数边沿”采样。
我们来分析这个 CPHA=0 的时序图。首先,根据 SCK 在空闲状态时的电平,分为两种情况。SCK 信号线在空闲状态为低电平时,CPOL=0;空闲状态为高电平时,CPOL=1。无论 CPOL=0 还是=1,因为我们配置的时钟相位 CPHA=0,在图中可以看到,采样时刻都是在 SCK 的奇数边沿。注意当 CPOL=0 的时候,时钟的奇数边沿是上升沿,而CPOL=1 的时候,时钟的奇数边沿是下降沿。所以 SPI的采样时刻不是由上升/下降沿决定的。MOSI和 MISO 数据线的有效信号在 SCK 的奇数边沿保持不变,数据信号将在 SCK 奇数边沿时被采样,在非采样时刻,MOSI和 MISO 的有效信号才发生切换。类似地,当 CPHA=1时,不受 CPOL的影响,数据信号在 SCK 的偶数边沿被采样。
由 CPOL及 CPHA的不同状态,SPI分成了四种模式,见表 24-1,主机与从机需要工作在相同的模式下才可以正常通讯,实际中采用较多的是“模式 0”与“模式 3”。
~ 与 I2C外设一样,STM32 芯片也集成了专门用于 SPI协议通讯的外设。
STM32 的 SPI外设可用作通讯的主机及从机,支持最高的 SCK 时钟频率为 f pclk /2(STM32F429 型号的芯片默认 f pclk1 为 90MHz,f pclk2 为 45MHz),STM32F429主频为180M,f pclk1 = 90MHz(APB2的时钟),f pclk2 = 45MHz(APB1的时钟)。完全支持 SPI协议的 4种模式,数据帧长度可设置为 8 位或 16 位,可设置数据 MSB先行(高位先行)或 LSB先行(低位先行)。它还支持双线全双工(前面说明的都是这种模式)、双线单向以及单线模式。其中双线单向模式可以同时使用 MOSI及 MISO 数据线向一个方向传输数据,可以加快一倍的传输速度。而单线模式则可以减少硬件接线,当然这样速率会受到影响。我们只讲解双线全双工模式。
STM32 的 SPI外设还支持 I2S功能,I2S功能是一种音频串行通讯协议,在我们以后讲解 MP3 播放器的章节中会进行介绍。
STM32 的 SPI 架构剖析。
SPI的所有硬件架构都从图中左侧 MOSI、MISO、SCK 及 NSS线展开的STM32 芯片有多个 SPI外设,它们的 SPI通讯信号引出到不同的 GPIO 引脚上,使用时必须配置到这些指定的引脚,关于 GPIO 引脚的复用功能,可查阅《STM32F4xx规格书》,以它为准。
其中 SPI1、SPI4、SPI5、SPI6 是 APB2 上的设备,最高通信速率达 45Mbtis/s,SPI2、SPI3 是 APB1 上的设备,最高通信速率为 22.5Mbits/s。其它功能上没有差异。
时钟控制逻辑
SCK 线的时钟信号,由波特率发生器根据“控制寄存器 CR1”中的 BR[0:2]位控制,该位是对 f pclk 时钟的分频因子,对 f pclk 的分频结果就是 SCK 引脚的输出时钟频率,计算方法见表 24-3。
数据控制逻辑
SPI的 MOSI及 MISO 都连接到数据移位寄存器上,数据移位寄存器的内容来源于接收缓冲区及发送缓冲区以及 MISO、MOSI线。当向外发送数据的时候,数据移位寄存器以“发送缓冲区”为数据源,把数据一位一位地通过数据线发送出去;当从外部接收数据的时候,数据移位寄存器把数据线采样到的数据一位一位地存储到“接收缓冲区”中。通过写 SPI的“数据寄存器 DR”把数据填充到发送缓冲区中,通过 “数据寄存器 DR”,可以获取接收缓冲区中的内容。其中数据帧长度可以通过“控制寄存器 CR1”的“DFF位”配置成 8 位及 16 位模式;配置“LSBFIRST位”可选择 MSB先行还是 LSB先行。
特殊的SSM位,当 SSM 位置 1 时,NSS 引脚输入替换为 SSI 位的值。(软件控制其数据位传输。)
通讯过程
STM32 使用 SPI外设通讯时,在通讯的不同阶段它会对“状态寄存器 SR”的不同数据位写入参数,我们通过读取这些寄存器标志来了解通讯状态。下图是“主模式”流程,即 STM32 作为 SPI 通讯的主机端时的数
据收发过程。
假如我们使能了 TXE 或 RXNE 中断,TXE 或 RXNE置 1 时会产生 SPI中断信号,进入同一个中断服务函数,到 SPI中断服务程序后,可通过检查寄存器位来了解是哪一个事件,再分别进行处理。也可以使用 DMA方式来收发“数据寄存器 DR”中的数据。
初始化结构体:
欢迎加入作者的小圈子
扫描下方左边二维码加入QQ交流群,扫描下方右边二维码关注个人微信公众号并,获取更多隐藏干货,QQ交流群:859800032 微信公众号:Crystal软件学堂
![](https://images.cnblogs.com/cnblogs_com/Liu-Jing/1918101/o_210117135834QQ20201227141844.png)
![](https://images.cnblogs.com/cnblogs_com/Liu-Jing/1781432/o_200606025518o_200415115115qrcode_for_gh_5c7d1da35871_258.jpg)
作者:Liu_Jing bilibili视频教程地址:https://space.bilibili.com/5782182 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在转载文章页面给出原文连接。 如果你觉得文章对你有所帮助,烦请点个推荐,你的支持是我更文的动力。 文中若有错误,请您务必指出,感谢给予我建议并让我提高的你。 |