接口/总线/驱动
MCU没有CAN或CAN接口数量不够怎么办?目前市面上有串口转CAN的相关模块或设备,但大家知道串口转CAN是如何实现的吗?转换后的帧格式是如何的?
适用场景
串口转CAN模块在什么时候需要用到呢?一是老产品面临升级,需要用到CAN总线通信,但硬件平台中的MCU没有集成CAN总线的控制器。二是选用的MCU已经包含CAN总线接口,但数量上不能满足项目需求。若出现类似以上两种情况且MCU有闲置串口,则可以选用串口转CAN模块解决。
图1 应用行业
使用方法
该类模块可以很方便地嵌入到具有UART接口的设备中,在不需改变原有硬件结构的前提下使设备获得CAN-bus通讯接口,实现具有UART设备和CAN-bus网络之间的数据通讯。工业级的转换模块内部还包括实现带隔离的CAN和UART转换所必须的模拟和数字器件、光电耦合器、DC/DC变换器、CAN-bus接口等。
图2 产品架构
转换说明
CSM100系列模块提供3种协议转换方式:透明转换、透明带标示转换、自定义协议转换。下面以CSM100系列的模块简述模块的透明转换格式。
该模式下,CSM100接收到一侧总线的数据就立即转换发送至另一总线侧。该模式下的模块数据转换效率最高,能承担较大流量的数据传输。串行帧转CAN帧时,模块将来自串口的数据直接打包,并插入预先配置的CAN帧信息、帧ID一同作为一帧数据发送到总线上。同理,来自CAN总线上的数据将按顺序拆分为字节流发送到串口上,字节流的前几个字节为该CAN帧的信息。
图3 转换方式
说到这,大家肯定有个疑惑,CAN帧的信息及CAN帧ID是如何表示的呢?
帧信息主要用来区分标准帧、扩展帧,长度为1个字节。在“自定义协议转换”中,标准帧固定为 0x00, 扩展帧固定为 0x80; 在“透明转换”“透明带标识转换” 中, 标准帧为 0x0_,扩展帧为 0x8_,其中“_” 代表每个帧中的数据域长度, 范围为 0~8。
标准帧的帧ID拆分为2个字节表示,扩展帧的帧ID拆分为4个字节表示。如果实际配置时给帧ID预留的只有一个字节且帧类型为扩展帧,方向是CAN帧转串行帧,那么将只能得到帧ID的高8位。如果实际配置时给帧ID预留的只有一个字节且帧类型为扩展帧,方向是串行帧转CAN帧,那么将帧ID的高8位正常填充,其他三字节全补零。
图4 帧ID转换说明
假设配置的转换成的CAN报文帧信息为“标准帧”,配置的帧ID1,ID0分别为“0x01,0x23”,串行帧的数据为01,02,03,04,05,06,07,08共8个字节,那么转换格式如图5。CAN报文的帧ID为0x0123(用户配置),帧信息:标准帧(用户配置),串行帧中的数据部分将不作任何修改地转换到CAN报文中。
图5 串行帧到CAN帧
假设CAN报文中帧ID1为0x01,帧ID0为 0x23,数据为0x12,0x34,0x56,0x78,0xab,0xcd,0xef,0xff,则CAN报文和转换后的串行帧如图6。CAN报文的帧信息(0x08)转换到串行帧中的第1个字节(0x08),CAN报文中的ID:0x0123依次转换到串行帧中的第2个字节(0x01)及第3个字节(0x23)。CAN报文的数据域将不作任何修改地转换到串行帧中的数据部分。
图6 CAN帧到串行帧
总结
以上为串口转CAN透明格式下的转换方式,后续笔者将新增透明带标示转换、自定义协议转换以及moudbus转换的内容,欢迎持续关注。
全部0条评论
快来发表一下你的评论吧 !