本帖最后由 我的学号 于 2023-2-12 23:31 编辑
由于本次测评会使用到 IMOTION2GO 套件的 UART 外设,这里简单做个笔记
主要参考官方文档 <How_to_Use_iMOTION_Configurable_UART-ApplicationNotes>
最新的 MCE 支持两种 UART 模式,一种为官方预定义的用户模式(User Mode UART),最多可支持 1 主15 从通信网络,每个节点以 1ms 的时间通信;
另一种模式允许用户通过调用 UART API 的方法定制自己的通信方式(Configurable UART function),这种模式又可分为 Buffer Mode UART 和 FIFO Mode UART,
前者只简单通过固件获取网络层数据,后者允许用户操作网络层的数据;使用到的 API 如下:
T038 UART 模块结构如下:
由图可知 UART0 和 UART1 两个串口,使用 UART_DriverInit() 可以设置 UART 通道,波特率,位数,停止位,奇偶检验位等
使用 UART 的Buffer Mode 时 MCE 固件会完成物理层,数据链路层和网络层时序相关部分,用户仅只关注网络层数据即可,其限制是只能通信固定字节内容;
如下为 Buffer Mode 的内部状态机:
该模式有 START, RECEIVE, DELAY 和 TRANSMIT 四种模式,模式之间可通过 FRAME_FLAG 进行跳转;在定时时间内接受自足够数据后会进入数据发送状态
如下为主机发送给从机单帧数据:
一帧数据由 9 个字节组成,以 0xA5 作为帧头,这个数据可以在 UART_BufferInit() 中定义;
第二帧为处理指令,1 表示启动电机,设置速度,2 表示停止电机,3 表示获取状态信息
第三四帧以两字节小端格式定义电机的目标速度
第五~八 帧为数据0,填充作用
第九帧为数据校验和,计算方法为 -1*(Byte1+Byte2+...Byte8)
如下为从机反馈回主机的单帧数据:
一帧数据同样由 9 个字节组成,以 0xA5 作为帧头,这个数据可以在 UART_BufferInit() 中定义;
第二三帧以两字节小端格式定义电机的目标速度
第四帧为标识速度指令,1 表示启动电机,2 表示停止电机
第五帧标记PFC 状态,1 表示开启,0 表示停止
第六~八 帧为数据0,填充作用
第九帧为数据校验和,计算方法同样为 -1*(Byte1+Byte2+...Byte8)
当主节点的校验和失败,从节点 MCE 会发送如下错误帧:
一帧数据由 9 个字节组成,以 0xA5 作为帧头,这个数据可以在 UART_BufferInit() 中定义;
第二帧为上次接收数据的正确校验和
第三四帧为固定数值 0xEE, 表示该帧为错误帧
第五帧为校验和,与第二帧一样,为上次接收数据的正确校验和
第六~九帧为数据0,填充作用
结合文档例程理解更佳
另一种通信方式,FIFO MODE 的结构如下:
由图可见发送和接受都有各自的FIFO , 该模式的优点是使用更自由,不需要固件底层的参与;允许单接受或单发送的用法
但比起 Buffer Mode 更复杂,在写脚本程序时需要用户注意网络层的时序要求
同样文档也给出了参考例程,数据帧格式和前边的介绍一致,不同之处是用了 UART_TxFifo() 替代 UART_TxBuffer()
如下为 Buffer Mode 和 FIFO Mode 的综合对比:
再有就是使用 FIFO Mode 会Buffer Mode 占用更多的RAM 资源,这是因为需要有顺序地放置接收FIFO 收到的数据
如下为 Buffer Mode 的使用限制:
如下为 FIFO Mode 的使用限制:
综合考量,需要注意如下问题:
如果接受数据超过 9 Byte,使用 FIFO Mode, 但不能超过 31 Byte
做 Class B 测试时,需要注意过高的 CPU load 会导致失败
可以用 BufferMode 完成半双工通信
只能通过轮询的方法检查一帧数据的收发是否完成
FIFO Mode 支持变化的数据帧长度
Configurable UART 完成数据传送后没有传回 API 函数做标示