参考:
CAN总线协议_stm32_mustfeng-GitCode 开源社区
0. 简介
隐形和显性波形
整帧数据表示
1. 字节描述
CAN数据帧标准格式 | |||
域段 | 域段名 | 位宽:bit | 描述 |
帧起始 | SOF(Start Of Frame) | 1 | 数据帧起始标志,固定为1bit显性('b0) |
仲裁段 | dentify(ID) | 11 | 本数据帧的ID信息,ID信息的作用:①如果同 时有多个节点发送数据时,作为优先级依据(仲 裁机制);②目标节点通过ID信息来接受数据 (验收滤波技术) |
RTR | Remote Transmission Requ est BIT | 1 | RTR标识是否是远程帧(0,数据帧;1,远程 帧),在数据帧里这一位为显性('b0 |
IDE | dentifier Extension Bit | 1 | DE用于区分标准格式与扩展格式,在标准格式中 IDE位为显性(‘b0),在扩展格式里IDE位为隐 性('b1) |
R0 | 保留位 | 1 | 1bit保留位,固定为1'b0 |
DLC | data length | 4 | 由4位组成,MSB先行(高位先行),它的二进 制编码用于表示本报文中的数据段含有多少个字 节,DLC段表示的数字为0到8,若接收方接收到 9~15的时候并不认为是错误 |
数据段 | data | 0~64 | 据帧的核心内容,它由0~8个字节(0~64位)组 成,MSB先行 |
CRC段 | CRC | 15 | 段用于检查帧传输错误,发送方以一定的方法计 算包括:帧起始、仲裁段、控制段、数据段;接 收方以同样的算法计算CRC值并进行比较,如果 不同则会向发送端反馈出错信息,重新发送;计 算和出错处理一般由CAN控制器硬件完成或由软 件控制最大重发数。 |
CRC界定符 | 1 | CRC界定符(用于分隔的位),为隐性位(1'b 1),主要作用是把CRC校验码与后面的ACK段 间隔起来 | |
A C K 槽 | ACK slot | 1 | 在ACK槽位中,发送端发送的为隐性位,而接收 端则在这一位中发送显性位以示应答;发送ACK/ 返回ACK这个过程使用到回读机制,即发送方先 在ACK槽发送隐性位后,回读到的总线上的电平 为显性0,发送方才知道它发送成功了,不用重发 |
ACK界定符 | 1 | 在ACK槽和帧结束之间由ACK界定符间隔开, 为隐性位 | |
帧结束 | EOF | 7 | 由发送端发送7个隐性位表示结束 |
2. 波形测试
空闲波形
空闲状态下是隐性电平,如图所示2条线都是高电平,大概都在2.5V左右,符合空闲波形解释。
也就是在这个时候,CAN盒子能识别到CAN总线是正常的。
想起来之前跑不起来时候的波形是低电平,说明是硬件问题。
通信波形
在CAN收发器端的整体波形
在CAN收发器端,放大之后看到电压,CAN_H 3V左右,CAN_L 1.6V左右
3. 波形分析
在上位机发送数据MCU仅接收数据的情况下:
因为逻辑分析仪无法完全显示差分信号(两根都是高电平的信号),于是使用MCU端引脚来测量RX/TX信号。可以看到右边解析的CAN数据都是正确的。其中0信号线接的是PE4表示RX,1信号线接的PE5表示TX。
GPIO_DRV_SetMuxModeSel(PORTE, 4U, PORT_MUX_ALT5); /* CAN0_RX */
GPIO_DRV_SetMuxModeSel(PORTE, 5U, PORT_MUX_ALT5); /* CAN0_TX */
GPIO_DRV_SetMuxModeSel(PORTE, 10U, PORT_MUX_ALT5); /* 配置收发器standby功能*/
第一个字节0,因为有连续5个0,在中间插了个1,导致第一帧有10个数据位。
其他数据位都正常,就不都发上来了
CRC15位,中间插了一个1,导致有16位
CRC界定符是1位,ACK+ACK界定符共2位
结束符7位
在SOF和CRC之间才需要填充,因此后面7位1不用加相反电平。