SPI内部功能框图
摘自参考手册的原理图
简化后的图
宏观示意图
主从机通信示意图
SPI_DR寄存器
如果只有一个 DR 寄存器,那么就无法实现全双工通信,所以,SPI 在设计的时候,就会让 DR 寄存器对应两个缓冲区(其实也是两个不可显寄存器),一个用来写 (发送缓冲),一个用来读 (接收缓冲)。
只有一个DR寄存器是如何处理两个缓冲区的数据的呢?
意法半导体的做法是采用一种 "地址复用" 策略,用同一个地址,根据不同的操作类型,访问不同的缓冲区,从而达到节省物理地址的目的。
我们可以这样理解,在DR寄存器处有一个开关,当你要进行写操作的时候,就接到写缓冲区,当你要进行读操作的时候,就接到读缓冲区。
发送过程
数据移入移位寄存器
注意看红色框部分
发送一位
接收
如此循环
对SPI通信的本质建模(可直接看这个)
Master和Slave的数据组成了一个队列。
SPI 通信的本质,就是一个队列,从队列头部移出数据,移出的数据,再入到队列尾部,循环移位 8 次,就可以完成 8 与 8 比特位的数据交换。 这个过程需要两步:
- 移出队列头部的数据
- 将数据移动到队列尾部 时钟 SCK 是指挥棒,所以一个周期需要两个边沿来控制这个步调
结论
由动态通信过程我们能感受到,全双工是 SPI 的基本特性,数据交换是 SPI 的通信本质。