两种MCU间的串行通信协议设计
引言 Cortex-M3是ARM公司推出的32位处理器,使用了最新一代的ARMv7架构,具有高性能、低功耗和低成本的优点。对那些对功耗与成本敏感、但又要求较高性能的嵌入式应用来说,Correx-M3无疑是最佳解决方案;而对成本要求苛刻、运算能力要求不高的设备来说,嵌入成熟稳定的8051处理器,已经成为了业内的流行做法。目前,越来越多的嵌入式系统同时使用了上述两种MCU,因此如何使Cortex-M3与8051之间可以高效地进行信息交互,是实现设计目标的关键。1 方案设计 要进行信息交互,离不开物理接口。在嵌入式应用中,目前常用的接口有UART、SPI和I2C等串行接口。UART接口只需两根数据线就可以工作,时序控制简单,大部分设备都整合了这种接口。而且,经过电平转换后UART的TTL电平可以转换成RS232电平,RS232接口是计算机标准配置的通信接口,可以通过超级终端查看串口的数据,便于使用PC机对线路进行检测分析。因此,本设计采用UART接口作为Cortex-M3与C51之间的通信接口。 考虑到各种需求,本文设计了一种基于UART接口的,用于Cortex-M3和C51之间的通信协议,使Cortex-M3与C51之间可以高效地进行信息交互。当两个MCU之间需要进行通信的时候,发送方把原始数据下放给通信协议,通信协议按照特定格式把数据打包,通过UART接口发送给对方。接收方收到数据时,MCU运行相应的通信协议,把数据解包,就可以得到发送方的原始数据,将其交付给上层程序。体系结构。
如果使用其他串行接口,原理大体相同,只需对硬件作相应改动,即对接口控制模块稍作修改即可投入使用。 下面以实际工程中某种多媒体系统为例详细说明。该系统采用了以Cortex-M3为内核的STM32处理器和嵌入了C51核的MST776视频处理芯片,使用UART接口进行通信。2 具体实现2.1 硬件设置 具体的器件不同,UART的工作方式也有所区别,主要表现在波特率、停止位、数据字长度等参数上。当两个器件用UART连接时,所有参数必须完全一致,否则通信很容易出错。在此,要特别注意波特率的设置:当线路质量好的时候,波特率可以设置得高点,以获得较高的传输速率;线路质量差的时候,就要减小波特率,以降低误码率。 本设计中,STM32与MST776都整合了UART接口,只需配置少量电阻;同时,线缆长度不超过20 cm,使用环境的电磁干扰小,波特率可以设置为38 400bps,甚至更高。另外,考虑到C51的处理速度较低,因此波特率不应设置得太高,避免造成C51侧数据溢出,进而造成死机。 本设计只需使用两根数据线来实现两个MCU之间的互连,把STM32上选定的UART接口的TX与对端的UART接口的RX相连,把RX与对端的UART接口的TX相连。2.2 软件设计2.2.1数据帧解析 Cortex-M3侧和C51侧采用同样的数据帧格式,以简化编程的难度,增强程序的可移植性。数据帧由起始标识符、数据长度、类型ID、通信内容、循环冗余校验码构成,。
(1)起始标识符 起始标识符的作用主要是用于定界,把不同的数据帧在一连串的数据中分离开来。起始标识符内的数据不能与数据帧中可能出现的任何数据相同,否则会引起歧义,导致定界失败,造成数据错误。在本例中,为2个字节,选用0xFF+0xAA,因为该组合与其他数据具有排他性,不会引起歧义。 (2)数据长度 数据长度的计算方法为,从该位开始,到最后一个数据位结束,也就是CRC校验位之前的一个字节。虽然使用Length位可以表示很长的数据帧,但在应用中应尽量采用短帧,以避免各种干扰因素造成少数数据位出错,导致大量数据无效,影响通信效率。同时,应该设置一个最大发送长度,以便设置超时重传计时器的值。本例采用1个字节,最大帧长为260个字节。 (3)类型ID 根据实际需要,类型ID可以采用1个或多个字节,用于表示该数据帧的作用类型。本例中,采用1个字节,可以表示256种作用类型,例如设备参数帧(如音量)、线路探测帧或应答帧。 (4)
通信内容 通信内容与类型ID结合,表达特定意义。相同的Data,但ID不同的话,表达的信息不一样。根据不同的ID,Data的长度可能会有所不同。 (5)循环冗余校验码 循环冗余校验码用于校验接收到的数据是否在传输过程中出错。本例中采用CRC-16算法,占2个字节,对从起始标识符开始到最后一个通信内容位的所有数据进行运算,把得到的结果附在最后。2.2.2 收发流程 发送流程:将要发送的数据添加起始标识符和长度后,计算CRC-16校验码,附在最后,形成一个完整的数据帧,然后通过UART发送出去。发送完毕后启动超时重传计时器。 接收流程:当接收到一个字节的数据时,根据系统状态采取不同的操作。当数据上交后,上层程序根据类型ID和通信内容来作出相应的响应。具体流程。
2.2.3 线路检测机制 虽然本例中的UART接口是一种有线通信,而且线缆长度不超过20 cm,但仍有可能出现插口松脱、线缆铜芯断裂等情况,造成线路中断。对于转换成RS232电平的应用,虽然RS232的最大传输距离不超过15 m,但如果在恶劣的环境中使用,仍无法完全避免线路发生中断。因此,有效的线路检测机制是必需的。 本设计中,当本端系统状态为Null时,每间隔1 s就发送一个线路探测帧,类型ID=0x00,通信内容=0x55。同时,如果本端在5 s内收不到任何新数据或者线路探测帧,则表明线路中断,向上层程序发送线路中断报告。对于需要交互秒时间信息的应用,线路探测帧可以省略,只检测秒时间信息就可以达到线路探测的目的。2.2.4 校正机制 因为串行通信普遍存在误码的问题,因此简单有效的校正机制是必须的。由于采用的是点到点的串行接口,数据帧都是按照发送的先后顺序到达接收端,不会出现后一帧比前一帧早到的情况,只需要采用CRC-16和简单的ARQ机制,再加上超时重传机制,就可以提供高可靠的数据传输。 接收方收到一个完整的数据帧之后,必须给发送方返回一个ACK帧,该帧的类型ID=0xFF。通信内容根据校验的结果有所不同:校验正确的,Data=1;校验失败的,Data=0。 发送方发送完一个完整的数据帧之后,启动超时重传计时器。如果在计时器超时之前没有收到ACK帧,或者收到的ACK帧的Data为0,就重发上一个数据帧;当收到ACK帧之后,计时器归零。发送方只有在收到Data为1的ACK帧后,才能发送下一个数据帧。当连续超时5次时,表明线路中断,向上层程序发送线路中断报告。 ACK帧和线路检测帧无须应答。发送这两种帧之后,无须设置超时重传计时器。2.2.5 接口控制 接口控制主要管理UART接口的收发,在此采用中断的方式来实现。若有数据需要发送,则必须等发送缓存为空时,才能把数据写入到发送缓存,否则会把旧的数据覆盖掉,造成数据丢失。当数据写入结束后,产生一个发送中断,通知MCU把数据通过UART接口发送出去。当收到一个数据时,UART产生一个中断信号,通知MCU把数据放入接收缓存,保存完成后清除中断信号,等待接收下一个数据。只需修改接口控制部分,就可以适用于不同的硬件接口。3 实验结果以及分析 为了验证本串行通信协议的有效性,连接STM32和MST776的UART接口,在这两个MCU上运行本通信协议,并在线缆上引出两个探测点,使用MAX232芯片进行电平转换,然后接到PC机的RS232接口上,进行数据检测。通过Windows的超级终端,可以在PC机上看到UART接口收发数据的状况。同时,通过JTAG接口可以看到通信协议向上层程序交付的数据。 实验结果表明,本通信协议工作正常,收发数据正确,校正机制和线路检测机制都工作良好。运行本通信协议后,两个MCU都没有出现数据溢出、死机等情况。这表明本文设计的串口通信协议能够实现预期的功能,令Cortex-M3与C51之间可以有效地进行信息交互。结语 本文基于Cortex-M3与C51之间的通信需求,设计了一种基于数据帧的通信协议,使得两个MCU间可以进行有效的信息交互。本设计已经在某型多媒体系统上得到应用,使用效果很好,表现非常稳定。本设计具有良好的可移植性和通用性,在另一个嵌入式项目中,经过对程序的少量修改,也在SPI接口上得到了应用。