一、SPI简介
spi是由Motorola公司开发的一种通用数据总线,它由4根线组成,分别是SCK、MOSI、MISO和SS,它支持同步、全双工的模式,支持一主多从。
相较于IIC,SPI通信协议通信速度更快,由于IIC上拉电阻的原因,导致其高电平驱动能力较弱,这就会导致从低电平转换到高电平的时间较长,导致其通信速率下降。
二、硬件电路
- 所有SPI设备的SCK、MOSI、MISO分别接在一起。
- 主机另外引出多条SS线,分别接在各个从机的SS引脚。
- 输出引脚配置为推挽输出,输入引脚配置为浮空或者上拉输入。
从这个图中我们可以看出,SCK时钟线由主机引出接入从机中,MOSI是主机输出从机输入,而MISO是主机输入从机输出,SS分别接在各个从机设备中。相对于IIC来说,SPI线更多,但是输入和输出是分开的两根线,控制线也是单独引出的,不需要像IIC一样需要寻址。但是SPI一次也只能控制一个从机设备,否则就会造成数据冲突。
接下来我们详细了解一下SPI的工作原理:
上图中SCK代表时钟线,分别接入主机和从机中,这样保证了同步的工作模式。既然有时钟,那么在时钟上升沿时,主机中的移位寄存器(高位先行)通过MOSI向从机发送1,而从机同样通过MISO向主机发送0,在时钟的下降沿,主机读取MISO中的数据0,从机读取MOSI的数据1, 从而完成“互换”。而SPI本质就是互换数据。那么互换,在单独接收和发送的时候呢?这个时候我看通过看SPI的官方协议可知,单独接收和发送也是互换数据,只不过这个时候一方会发送0x00或者0xFF。
三、时序单元
- 起始条件:SS从高电平转换到低电平。
- 终止条件:SS从低电平转换到高电平。
接下来我们看上面的时序图:
- 在SS从高电平转换到低电平的时候,代表传输开始,这时在时钟的变化周期中就会进行数据“移出和移入”。我们运用的最多的模式是在SCK的第一个边沿移出数据,第二个边缘移入数据,也就是数据采样。但是在图中我们可以看到MISO两端是居于高低电平之间的。这个代表高阻态。
- 为什么要有高阻态呢?我们知道在选择从机的时候,我们SS要置为低电平,这个时候为了防止数据冲突,在SS高电平的时候,从机的MISO要置为高阻态,这样就可避免数据冲突。
- SPI还有其他的时序逻辑,这里我们不予讨论。
四、时序逻辑
在分析时序逻辑之前,我们先要知道,SPI交换数据过程中,第一个数据一般都是指令码,在对应的从机中一般都会有指令集用于对应,比如我们经常用到的写数据,写数据使能,写数据失能等。比如在写数据失能和使能的时候,我们只需要向其发送一个字节的指令码即可。但是在写数据的时候,我们就需要给指令码之后继续发送写入的信息。知道这个之后我们来分析一下时序:
这里我们抓取一段波形来分析一下:
- 在SS高电平进入低电平的时候,时序开始。
- SCK时钟周期变化的时候,上升沿进行数据采样,下降沿变换数据,我们可以看到在一个周期内完成了一次数据的变换0x06。
知道了逻辑之后,我们便可正常使用SPI通信了。但是需要注意的是,不同从机芯片的指令规定一般都是不同的,这个需要我们根据数据手册来对应去开发。比如项目中用到的W25Q64芯片,我要写数据的时候,一般先是写使能,然后写数据指令,在W25Q64的芯片手册的规定,在写数据之林之后的字节是地址高位,然后依次地址低位,在地址发送完毕之后,在跟着的要写入的数据。这个需要注意一下。