CAN采用的是差分信号:由两根线组成CANH和CANL。
按照定义:CANH-CANL
CANL-CANH>0.9v时为显性,逻辑电平为低。
CAN总线与IIC一样采用线与,在总线上显性电平具有优先权,当同时出现显性信号和隐性信号时,总线上为显性数据即0。
通信过程:
由于CAN通信只有两根数据线,没有时钟线所以并不知道数据
是什么时候开始发送什么时候开始接收,不像IIC有SCL时钟线,SPI有CS片选信号,那么每个ECU是怎么知道CAN总线上的数据是发给自己呢,CAN有一套复杂的协议。
空闲状态:在CAN协议中,在总线上出现连续的11位隐性电平(电压差
像前面说的CAN采用的是线与通信,当所有总线上的单元都发送隐性信号,才说明总线是空闲的。
开始数据传输:
每次数据传输前,节点都会监听总线的状态,如果说总线为空闲状态,那么就会发送自己的数据包,数据包包括本身的ID信息或者其他控制指令,也称之报文。当报文传输到其他节点时,其他节点就得按照固定格式去解读数据包。这里固定格式即整车厂会定义好CAN Communication Matrix(后续有时间会单独出一篇关于通信矩阵的应用)。
其实可以简单的理解CAN Communication Matrix就是定义报文标识符和信号值描述对每一帧数据的解析。
报文格式:起始标签、识别标签、控制标签、数据段、CRC校验标签、应答标签、结束标签。
标准帧的报文由:起始位、识别码、控制码、数据码、CRC、ACK、结束位
CAN2.0B
CAN FD:
CAN 2.0B:
起始位:信号为显性信号(0)
识别码:11位ID 表明报文的含义和优先级(标准11id,扩展29位ID)
RTR远程传送请求位(0:数据帧,1:远程帧)
SRR远程帧恒为1(CANFD的SRR刚好对上CAN2.0B的RTR)标准帧优先级高于扩展数据帧
IDE:该标志用于区分标准帧还是扩展帧(1:扩展帧,0:标准帧)标准帧优先于扩展帧
r:保留位
IDextension:扩展帧的扩展ID
FDF:用于区分普通CAN报文和CAN FD报文。CAN报文,FDF=0;CAN FD报文,FDF=1
DLC:数据长度
data field:标准帧最大8byte,扩展帧最大64 byte
CRC:循环冗余校验码,校验报文是否正确。(数据段的CRC(循环冗余校验)通常由硬件自动计算和填充。)
ACK:0为接收应答,1:未应答(当一个节点发送一帧数据后,其他节点会在一定时间内检测到这一帧,并发送一个ACK信号0,表示它已成功接收到数据。)
EOF:帧结束(7bit 连续隐性)
远程帧:
数据传输是由数据源节点(例如,传感器发出数据帧)自主完成的。但也可能存在目标节点向源节点请求发送数据的情况。要做到这一点,目标节点需发送一个远程帧,其中的标识符应与所需数据帧的标识符相匹配。随后,相应的数据源节点会发送一个数据帧以响应远程帧请求。
远程帧 与数据帧存在两点不同:
1)远程帧的 RTR 位为隐性状态;
2)远程帧没有数据字段。
位填充与错误帧
当CAN节点发送 逻辑电平(显性dominant或隐性recessive)相同的五bit时,它必须发送一bit相反电平。 CAN接收 节点会自动删除这个新增的额外bit。
当带有相同标识符的数据帧和远程帧同时发出时,数据帧将赢得仲裁,因为其标识符后面的 RTR 位为显性。这样,可使发送远程帧的节点立即收到所需数据。
主动错误帧
主动错误标志由 6 个连续的显性位构成,这种位序列主动打破了位填充规则,所有其他节点在识别到所生成的位填充错误后,会自行产生错误帧,称为错误反射标志。错误标志字段因此包含 6 到 12 个连续显性位 (由 1 个或多个节点产生)。错误定界字段 (8 个隐性位)为错误帧划上句号。