SPI接口:原理;从设备slave如何主动给主设备master发数据?
最近在学习SPI接口,了解了基本原理:
SPI全拼Serial Peripheral interface(串行外围设备接口),是由Motorola(摩托罗拉)定义,是一种高速的,全双工,同步的通信总线,且只需要四根引脚线。
4根线的定义:
几种数据采集模式:
工作流程:
- 1.master 拉低CS
- 2.master开始供应 CLK
- 3.第一个高电平的上升沿数据开始进行采集。
- 4.MO/MI的数据发出。
- 5.MI/MO采集数据。
- 6.重复3~5
SPI优与缺点
优点
- 支持全双工通信
- 通信简单
- 数据传输速率块
缺点
- 没有指定的读写方向控制
- 没有应答机制确认是否接收到数据
- 没有指定的流控制
问题一:从设备如何主动向主设备发送数据
从 SPI 的硬件结构来看,其标准配置仅有 4 根信号线(MOSI、MISO、SCLK、SS/CS),且主设备控制着片选信号(SS/CS)和时钟信号(SCLK)。如果SS和SCLK一直都使能,从设备可以随时给主设备发送数据。当休眠的时候,从设备需要主动向主设备发送数据时,面临着一个难题:如何通知主设备打开 SS/CS 信号并供应时钟信号,以便进行数据传输?
经过查阅大量资料和与同事交流,发现一种可行的解决方案是增加一根额外的信号线,例如中断信号线(INT)。当从设备有数据需要发送时,通过拉动 INT 信号线向主设备发出通知。主设备接收到中断信号后,拉低片选信号(CS),并开始供应时钟信号(SCLK),从而建立起从设备向主设备的数据传输通道。
问题#2:没有应答机制确认是否接收到数据
SPI 协议规范假设从设备一定能够正确接收到数据,然而在实际应用中,由于各种干扰因素的存在,数据传输错误是难以避免的。但 SPI 协议既没有提供数据校验机制来检测数据传输错误,也没有应答机制来确认数据是否被成功接收,更没有流控制机制来协调主从设备之间的数据传输节奏。
针对这一问题,目前可以考虑以下几种解决方案:
- 软件层面实现校验:在应用层添加数据校验算法,如循环冗余校验(CRC)等。主设备在发送数据时,同时计算数据的校验值并一同发送给从设备。从设备接收到数据后,也进行相同的校验计算,并将计算结果与接收到的校验值进行比较,以此判断数据是否传输正确。如果校验不通过,从设备可以通过某种方式通知主设备重新发送数据。
- 引入自定义应答协议:在 SPI 通信的基础上,设计一套自定义的应答协议。例如,主设备发送完一帧数据后,等待从设备返回一个特定的应答信号。从设备在正确接收到数据后,发送一个确认应答;如果接收数据出错,则发送一个错误应答。主设备根据从设备的应答信号来决定是否继续发送下一帧数据或进行重发操作。
- 结合硬件流控制:如果硬件条件允许,可以考虑在系统中增加硬件流控制机制。例如,利用额外的信号线来实现数据的暂停和继续传输控制。当从设备处理不过来数据时,通过特定的信号通知主设备暂停发送数据;当从设备处理完当前数据后,再通知主设备继续发送。