两单片机通过 SPI 通信的软件协议设计概述
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 模式可以在对实时性没有严格要求的情况下使用,这种模式下,程序上并不区分Master和Slave。暂且将spi的Master称为P1,将Slave称为P2,P1发送数据的同时P2也将数据发送到P1,两者的数据没有必然联系,双方可以根据数据包中包含的不同信息做相应的处理。。适合用于数据交换的场合。优点:采用全双工方式,协议健壮性比较好,逻辑简单
缺点:适用场合比较少,实时性不高
优点:实时性比较好,协议健壮性比较好,逻辑简单
缺点:适用场合比较少,单工通信
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当前的状态