SPI通信协议由摩托罗拉公司于20世纪80年代中期开发而成,包括SD卡、液晶显示器、一般闪存等等都在使用SPI进行通信。
SPI作为串行通信接口脱颖而出的原因很多,全双工比I2C传输速率更高,推挽输出接口能够减少走线分叉,能够保证在高速传输下信号的完整性,传输协议更加灵活,信息帧大小可以任意调节,不需要上拉电阻,功耗可以更低,外围电路和软件配置都更简单。
同时SPI的缺点也很明显,SPI通常仅支持一个主设备,传输距离短,一般只适合板内信号传输,没有硬件级别的错误检查协议,无法内部寻址,多重设备时需要额外的片选信号线。
SPI总线包括四条逻辑线
SPI有两种接线方式,第一种是常规的独立从机配置,每个从机都需要一条单独的CS线,当主机要和特定的从机进行通讯时,将相应的CS信号线拉低,并保持其他CS信号线为高。
同时因为从机的MISO引脚在同一条信号线上,因此要求未被选择的从机的MISO引脚要配置为高阻态输出。
SP的第二种接线方式为菊花链配置,我们一般将信号线以串行的方式从一个设备依次传到下一个设备,直到数据到达目标设备的数据传输方式称为菊花链。
菊花链最大的缺点是如果从机出现单点故障时,低于该设备优先级的从机就掉线了,距离主机越远的从机获得服务的优先级就越低。如果需要设置从线检测器并安排好从今优先级。
如果某个从机超时并及时处理,防止单点故障造成整个链路崩溃。
菊花链模式充分使用了SPI移位寄存器的功能,每个从机在下一个时钟周期将输入数据复制到输出。
SPI可以根据时钟极性CKP和时钟向性CKE配置前四种模式。
CKP用来配置时钟的默认状态,CP=0时空闲电平为低,电平0,CKP=1时空闲电平为高,电平1。
CKE用来配置在哪个时钟边沿进行数据采样,CKE=0时,在时钟信号SCK的第一个跳变沿采样,CT=1时,在时钟信号SCK的第二个跳变沿采样。
SPI是一种同步通信的总线协议,数据线根据不同的配置在时钟的上升沿或下降沿进行采样。
SPI通信的持续过程如下,主机先将对应从机的CS信号拉低,通知从机开始建立连接,数据接收端检测到时钟的边缘信号之后,就立即开始读取数据线上的信号。
因为SPI是全双工的,主机在发送数据的同时也在接收数据,主机可以通过查询的方式来判断从机是否有数据需要发送,如果有,主机会继续发送数据来获取从机想要发送的数据,之后从机只需要丢掉这些无效数据即可。