1.介绍
SPI 通信最常用的地方时 单片机访问 Flash 或 Ram,很少用在两个单片机通信上。但是鉴于spi通信的优势,用在两个单片机之间通信时,合理的程序设计,会更好的体现它的优势。在这里提出几种设计方式,同时列举了各自的缺点和优点,需要根据具体情况采用相应的模式并克服缺点。
2.全局分析
采用spi在物理层上已经是采用 Master - Slave 方式,在协议的设计上有了较大的限制,表面上也就是 slave 不能向 Master 自由的发送数据。因为spi总线协议规定,由Master来控制 SCLK 信号,Slave要发送多少个字节以及什么时候发送,Master并不知道,这就是问题所在。
对于有些单片机在Slave状态时,并不知道 Master 何时发送完成,这样也会困扰开发者。
3.全局设计
3.1 采用Ask-Answer 模式
在其他的总线协议中,很常用的一种方式,Master 发送Ask,Slave接收处理,并准备好处理结果,Master 发送无效数据,目的是取回Slave的数据。
优点:协议健壮性比较好,逻辑简单
缺点:没有体现SPI 全双工的优势
3.2 采用Peer-Peer 模式
优点:采用全双工方式,协议健壮性比较好,逻辑简单
缺点:适用场合比较少,实时性不高
3.3 采用Master-Master 模式
优点:实时性比较好,协议健壮性比较好,逻辑简单
缺点:适用场合比较少,单工通信
3.4 带预知和状态的Master-Slave 模式
带预知和状态,意思是Master发送数据包时,包含下一次数据交换时Master要请求的数据内容,这样Slave在处理Master传来的数据之后,就开始准备数据下次交换的数据;同时,Slave准备数据时,同时包含了Slave的状态、错误等,供Master判断下一步进行哪一种数据交换。整体上来说,Master 根据Slave的状态,发起通信,并通知Slave下一次通信类型,而Slave在回答Master时,同时也把状态信息发送到 Master。
数据结构也比较简单,可以参考如下:
HEADER 作为固定的开头
PACKET TYPE 为当前的数据包类型
NEXT PACKET TYPE 为下一次通信的数据包类型
DATA LEN 为后面的数据长度
DATA 表示数据
Slave 的数据包可以设计如下:
STATUS 为Slave当前的状态