目录
前言
本期我们就开始学习stm32本身的SPI外设,这是属于硬件自身的功能,在我们前面学习过的I2C中,stm32也是本身就有I2C外设的资源的。本期是介绍stm32中SPI外设的相关理论知识,下一期我们再进行关于硬件SPI的实践项目编程。(视频:[11-4] SPI通信外设_哔哩哔哩_bilibili)
一、SPI外设
1.基本概念
- STM32内部集成了硬件SPI收发电路,可以由硬件自动执行时钟生成、数据收发等功能,减轻CPU的负担
- 可配置8位/16位数据帧、高位先行/低位先行
- 时钟频率: fPCLK / (2, 4, 8, 16, 32, 64, 128, 256)
- 支持多主机模型、主或从操作
- 可精简为半双工/单工通信
- 支持DMA
- 兼容I2S协议
- STM32F103C8T6 硬件SPI资源:SPI1、SPI2
这里补充一下,对于stm32C8T6的两个SPI所对应的总线是不同的,SPI1是挂在APB2上,对应的时钟频率72MHz,SPI2挂载到APB1上,对应的时钟频率是36MHz。
2.SPI结构
对于下面SPI的框图我们可以分两个部分来去看,先看到左上角这部分,这里有两个输入输出口分别是MISO和MOSI,其中这两个口中间是有交叉的,这是因为当stm32为从机的时候会走中间交叉部分的功能,也就是MISO变为输出口,MOSI变为输入口,反过来的,当然正常的话我们的stm32都是作为主机的,所以中间交叉的部分不用去看。
另外一点就是看到旁边的移位寄存器这部分,在数据发送和接收的过程中,每次从右边移出一位数据到MOSI,然后MISO会从左边移入一位数据,数据整体是向右移动的,这不难看出是一种低位先行的。对于控制移位寄存器移位的方向(低位先行/高位先行)旁边有一个控制位来去控制的。还有就是当一个字节的数据发送完成之后,同时移位寄存器里面的数据也是接收完成了的数据,这时候会产生一个RXNE标志位表示数据接收完成,这时候移位寄存器的数据就会转移到接收缓冲器中,最后接收缓冲器的数据再转移到其他地方,如果不及时拿走,那下次的数据会直接覆盖掉原来接收缓冲器的数据。然后就是新的一轮置换数据的操作,这时候发送缓冲器就会把里面的数据转移到移位寄存器里面,然后会有一个TXE标志位告诉移位寄存器OK啦可以开始与从机置换数据了,发送缓冲器数据一但转移到了移位寄存器,就立马会有新的数据写入到发送缓冲区。
然后我们看到另外一个主控电路的部分,也就是旁边这些指令操作的部分,这些就是我们要去配置的指令,到时候代码会去通过结构体的初始化来去配置的。波特率发生器是配置波特率的,也就是数据发送和接收的速度,一般是有总线的时钟分频后的频率。
结构功能简化图如下:
这里我们可以去对比一下前面学过的I2C协议和USART传输协议的异同之处,SPI是属于同步全双工的传输协议,发送数据的同时也可以接收数据,这一点跟USART是一样的,USART也是有两条线独立进行发送和接收,所以我们可以看到SPI和USART的结果图很相似,都是接收和发送的数据寄存器独立分开的,不同的就是SPI接收和发送数据都是使用同一个移位寄存器;对于半双工的I2C协议,这是只能单独执行发送或者接收,所以其发送和接收的数据寄存器是都是一起的,只有一个数据寄存器,同样移位寄存器也是只有一个。
二、传输模式
1.连续传输
对于连续传输的是中间没有间隙的传输方式,这种是当完成一个字节的置换后立马就进行下一个字节的置换操作,一气呵成,不过连续传输的模式相对复杂,对配置要求比较高,如果有高速率传输这方面需要的话才会去使用到连续传输模式。下图展示的是模式3的SPI连续传输模式的过程。
2.非连续传输
非连续传输就是每次置换完了一个字节之后,中间就会有一个间隔时间,这种非连续模式传输一般情况是对于传输速率比较低的时候使用的,我们主要是用到非连续传输来作为示例来写代码,步骤也是相对比较简单。下图展示的是模式3的SPI非连续传输的过程时序。
3.软硬件时序图
软件SPI时序
硬件SPI时序
对比上面两个时序我们可以看出,软件的SPI时序图在置换数据的过程是稍微滞后SCK的,也就是相较于硬件没有去紧贴SCK边沿触发,这方面我们也是在前面提到过,软件本身就是通过软件本身来去设置来去交换数据,软件本身代码执行是有一定的先后顺序的,所以相较于硬件来说效果肯定是没硬件自动执行的效果要好的。
以上就是本期的全部内容了,我们下次见!
今日壁纸: