目录
简介
SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线。
四根通信线:SCK(Serial Clock)时钟线,MOSI(Master Output Slave Input)主机输出从机输入,MISO(Master Input Slave Output)主机输入从机输出,SS(Slave Select)从机选择
同步(有时钟线),全双工(具有单独的发送和接收线路,因此可以在同一时间发送和接收数据)
支持总线挂载多设备(一主多从)
硬件电路
所有SPI设备的SCK,MOSI,MISO分别连在一起
主机另外引出多条SS控制线,分别接到各从机的SS引脚
输出引脚配置为推挽输出,输出引脚配置为浮空或上拉输入
移位示意图
假设一个时钟时序的上升沿主机移位寄存器左边移出去一位数据通过MOSI引脚,下降沿输入一位数据到从机移位寄存器的右边;同时一个时钟时序的上升沿从机移位寄存器左边移出去一位数据通过MISO引脚,下降沿输入一位数据到主机移位寄存器的右边。最终,8个时钟之后,实现了主机与从机之间的一个字节数据交换。SPI的数据收发,都是基于字节交换,这个基本单元来进行的。如果只想发送数据,仍然调用字节交换的时序,只是在看数据时看自己需要的数据。只想接收数据同理。若只想发送或接收数据就会造成资源浪费现象。
SPI时序基本单元
起始条件:SS从高电平切换到低电平
终止条件:SS从低电平切换到高电平
交换一个字节(模式1)
CPOL = 0:空闲状态时,SCK为低电平
CPHA = 1:SCK第一个边沿移出数据,第二个边沿移入数据
交换一个字节(模式0)
CPOL = 0:空闲状态时,SCK为低电平
CPHA = 0:SCK第一个边沿移入数据,第二个边沿移出数据
模式0与模式1的区别就是模式0的CPHA = 0,模式1的CPHA = 1。在时序上的区别,对比一下,模式0的数据移出移入的时机相比模式1会提前半个时钟,也就是相位提前了。
SPI模式还有模式2,3
I2C通信与SPI通信的比较
由于I2C开漏外加上拉电阻的电路结构,使得通信线高电平的驱动能力比较弱,这会导致通信线由低电平变到高电平的时候,这个上升沿耗时比较长,这会限制I2C的最大通信速度。所以I2C的标准模式只有100kHz的时钟频率,I2C的快速模式也只有400kHz。
相比于I2C,SPI传输的更快。但SPI硬件开销比较大,通信线的条数比较多,所以通信过程中会出现资源浪费的现象。
注:推挽输出:高低电平均有很强的驱动能力,这将使得SPI引脚的上升下降沿非常迅速。而I2C采用开漏输出的下降沿非常迅速,但上升沿变得缓慢。I2C为什么不用速度更快的推挽输出?I2C要实现半双工,经常要切换输入输出,若用推挽输出,可能造成电源短路,损坏芯片;而且I2C又要实现多主机的时钟同步和总线仲裁,这些功能,都不允许I2C使用推挽输出。