1.spi概述
2.spi的硬件电路
- SPI所有通信线都是单端信号,高低电平都是相对GND的电压差,单端信号所有设备都需要共地,主机需要引出VCC与GND给从机供电。
- 时钟线SCK完全由主机掌控,对主机来说,时钟线SCK配置为输出,对所有从机来说,时钟线SCK配置为输入,这样主机的时钟就能同步到各个从机了。
- MOSI,主机输出从机输入,也称DO,主机通过MOSI输出给从机;MISO,主机输入从机输出,也叫DI,从机通过MISO输入主机。
- SS相当于片选, IIC是通过寻址的,SPI通过SS线低电平有效来选择要通信的从机,由主机配置SS线输出低电平,输入到从机,其它从机SS线置高电平。通信结束从机的SS线又置回高电平,想控制几个从机就开几条SS线。
- SPI的输出如SCK,SS,MOSI线都配置为推挽输出,对比IIC开漏输出弱上拉的模式,IIC下降沿快,上升沿不快, 而SPI使用推挽输出,有很高的驱动能力,上升沿与下降沿的速度都很快,所有传输速度就很快。一般SPI都能轻松到达MHz的级别。IIC因为是半双工,既经常要切换输出输入,又要实现多主机的时钟同步与总线仲裁,这些功能不允许IIC使用推挽输出,不然一不小心就电源短路。
- SPI不支持多主机,SPI又是全双工,输出引脚始终是输出,输入始终是输入,基本冲突,可以大胆用推挽输出。但是呢,SPI还是有冲突点的,比如多个从机同时输出的情况,所以要规定一个从机输时其它从机为高阻态,SS低电平时才能恢复为推挽输出。不过写主机的程序可以不用管这个从机的问题。
3.SPI的移位示意图
SPI的移位结构有8位的移位寄存器,有时钟输入端,每来一个时钟,移位寄存器都会向左移位,从机也一样,时钟源是由主机的波动率发生器提供的。波特率发生器的时钟上升沿的时候,移位寄存器都向左移位,就是主机与从机的最高位,分别放到MOSI与MISO线上,下降沿的时候主机与从机都会进行数据采样输入,移出的最高位放到对方的最低位;然后是次高位,循环8个时钟主机与从机就交换一个字节了。
SPI的数据收发原理就是基于字节交换的单元。模式如下:
- 发送一个字节:只发送不接收,主机不去看从机的字节就行;
- 接受一个字节:只接受不发送,主机就抛砖引玉,用0X00或0xFF去跟从机交换字节,对主机交换的字节从机也不管。
- 发送接收同时进行。
4.SPI的时序基本单元
基于SPI的字节交换原理,SPI 的时序就很好理解.
SPI总线的时序模式有4种,取决于极性CPOL与相位CPHL。
模式1模式2都是下降沿采样,模式0模式3是上升沿采样。
其中模式1的时序是跟上面的移位示意图匹配的 (不过很多例程用的是模式0.)
上面SPI的硬件电路说过,MISO在SS高电平的时候是保持高阻态的,下图的时序也体现了。
移位传输,CPHA=1, 所以第一个上升沿主机从机左移位。下降沿时候交换位。
这样经过8个时钟就可以交换一个字节的数据。
交换结束,从机的MISO回到高阻态,如果此时主机的MISO是上拉输入,从机的MISO的电平就是高电平。如果主机的MISO引脚电平不确定,,从机的MISO的电平就不确定,SPI没有硬性规定主机MOSI电平.
5.SPI的时序
SPI的有效数据流是指令码+读写位,而IIC的有效数据流是地址+读写位,是寄存器模式的。
SPI从机的芯片手册中有指令集,什么指令对应什么功能,什么指令后面得跟上什么数据,不同指令有不同的字节长度, 使能失能只需要一个指令,读写数据就要多些字节。
(1)发送指令,向SS线指定的从机发送指令。
(2)指定地址写,向SS指定的设备,发送写指令,然后在指定地址,写入指定数据。
(3)指定地址读,向SS指定的设备,发送读指令,然后在指定地址,读取从机数据。