CAN 通讯
CAN 是Controller Area Network 的缩写,是用于在单片机间通讯使用,在使用CAN通讯时,需要连接到CAN收发器进行数据的转写,将单片机的普通信号转写为差分信号。

上图是型号为SN65HVD232D的CAN收发器(CAN Bus Transceivers) 的示意图
- CANH 为高电平信号线
- CANL 为低电平信号线
- D 为输入线
- R 为输出线
单片机将发送信号发送到D口,再由 CANL和CANH 发出。外部信号发送到CANL和CANH,再从R口发送给单片机
信号的传输
!!图片
我们给 CAN 收发器发送数据时,它会将其转换为差分信号
- 当我们给D 口发送 高电平 时,CANH 和 CANL 都会输出2.5V,压差为0V,是隐性电平,表示逻辑1
- 当我们给D 口发送 低电平 时,CANH 会输出3.5V,而CANL 会输出1.5V,压差为2V,是显性电平,表示逻辑0
同样,CAN 收发器也可以将差分信号转换为数据给单片机
标准数据帧

- 起始位(SOF):数据开始传输,一定为0
- 识别码(ID):目标设备,同时决定数据发送的优先级,数字越小越优先(i.e. 先有0)
- RTR位(Remote Transmission Request Bit):远程输入请求,数据帧为0,远程请求帧为1
- 控制码:
- IDE位(Identifier Extension Bit): 标识符拓展位,用于区分标准格式和拓展格式,标准格式为0(识别码有11位),拓展格式为1(识别码有29位)
- 空闲位/预留位:为0
- DLC位:数据长度代码,代表了后面的数据位的字节(Bytes)数
- 数据码:数据
- CRC位:循环冗余校验位
- 15位CRC校验码:接收端根据前面的数据计算CRC校验码,如果计算结果于收到的不一样,则数据有误,会请求再次发送
- 1位CRC界定符:与后续内容分隔
- ACK确认槽:发送端为逻辑1,接收端回复逻辑0
- ACK界定位:一定为1
- 结束位(EOF):7位,都为1
差分信号的优势
- 抗干扰能力强,因为两跟信号线会受到相同的干扰从而抵消掉干扰。