一、SPI 同步串行通信协议
SPI的全称是Serial Peripheral Interface 同步串行通信协议,是由Motorola公司开发的一种通用数据总线。
四根通信线:SCK (Serial Clock) 、 MOSI(Master Output Slave Input) 、MISO (Master Input Slave Output) 、 SS(Slave Select)。因为他有两根数据线和一根时钟线,所以他是同步全双工的,同时SS线提供了一主多从机制。
二、SPI的硬件电路
SPI的MOSI使用的是推挽输出,有强驱动能力,在波形上表现出快速上升和下降,这也是他相比I2C速度更快的原因。MISO使用浮空输入或上拉输入,在SS片选为高的时候必须为高阻态。
这也是SPI要注意的地方,因为MISO可以连接多个设备,如果使用推挽输出可能会出现一个从机高一个从机低而出现短路问题。
三、SPI的通信原理
SPI的通信主要是通过交换数据的形式来实现的,也就是说如果你想得到一个数据,你必须也要发送一个数据,所以有时你的发送0xff来交换从机的数据。
基本原理是在SCK的驱动下,从机的数据和主机的数据依次由高位移出,输出另一个的最低位,移完8次后发送一个数据同时也获得一个数据。
四、SPI的运行逻辑和波形图
SPI有四种模式,我们最常用的是模式0,但其他模式很简单,只是将电平翻转和顺序变化一下即可,为了兼容更多设备而设计的。
模式0
模式1
模式2
模式3
五、SPI如何实现读写功能
SPI是一种基于指令来控制读写,0x02表示写指令,0x03表示读指令,一般情况下SPI使用的是8位数据,3字节地址的方式。
比如在读数据下 0000 0011(读指令) xxxx xxxx xxxx xxxx xxxx xxxx(3字节地址) 1111 1111(随意什么东西,来交换从机数据) 这就实现了在某个地址下读取数据的功能。