大家好,又见面了,我是你们的朋友全栈君。
CAN接口的介绍:
CAN总线可分为: 高速CAN,低速CAN ,单线CAN。
1.在速度方面高速CAN的传输速率(波特率)在125K~~1Mbps 。低速CAN的速率在125Kbps以下,低速CAN具更好的容错性。单线CAN波特率在33K~~83Kbps.
2.这三种总线之间的最主要区别是物理层。以传输介质和线的数量说,单线CAN只需1条导线,低速容错CAN和高速CAN通过双绞线传输。双绞线能有效减少外部电磁场对信息内部电平的干扰。 还有电平的逻辑的区别,定义逻辑为1称作隐性,逻辑为0称作显性。这个区别可从以下几种情况来说明:空闲时、有效时、睡眠时、唤醒时。这里假设收发器的电源为标准的5V和12V。
当双线CAN的两个导线处于静止状态,两个电平是一样的,大约2.5伏,这个静电平状态就是隐形状态,也称隐性电平,也就是没有任何干扰的时候的状态称为隐性状态。当有信号修改时,CAN_High 线上的电压值变高了,一般来说会升高至少1v;而CAN_Low 线上的电压值会降低一个同样值,也是1v。那么此时,CAN_High 就是 2.5v+1v=3.5v,它就处于激活状态了。而CAN_Low 降为2.5v-1v=1.5v。
2.1 空闲时 (隐性位)
2.2 有效时 (显性位)
2.3 睡眠时
2.4 唤醒时
3.CAN工作原理
当 CAN 总线上的某一个节点或站发送数据时,它以报文的形式广播给网络中所有节点,对每个节点来说,无论数据是否是发给自己的,都对其接收。
每组报文开头的11 位字符为标识符,定义了报文的优先级,这种报文格式成为面向内容的编制方案。同一系统中标识符是唯一的,当几个站同时竞争总线读取时,这种配置十分重要。
CAN 的报文格式有两种,不同之处其实就是识别符长度不同,具有11 位识别符的帧称为标准帧,而还有29 位识别符的帧为扩展帧,CAN 报文有以下4 个不同的帧类型。分别是:
(1) 数据帧:发送帧的节点设备,发送这个帧的目的是为了将某些消息传递给其他节点设备(最常用的帧类型)(帧中的仲裁域中的节点序号,是发送帧的节点设备本身的ID号。)
(2) 远程帧:发送帧的节点设备,发送这个帧的目的是呼叫其他节点设备发送数据(较为常用的帧类型)(帧中的仲裁域的节点序号,是呼叫节点设备的ID号。数据域无内容。)
(3) 错误帧:因为通信中,因为各种因素干扰太多了,总会有可能产生错误,那么出现错误怎么办?
发送帧的节点设备,发送这个帧的目的是发现总线上的帧有错误,提醒总线上的其他设备。(比较少用)
(4) 过载帧:因为通信时,总是两方或者多方通信,所以,发送数据的那一方不知道接收的那一方准备好了没有,所以,过载帧的作用就是接收方(接收节点设备)告诉发送方,接收方还没有准备好接收下一帧的工作,请缓一会。
(5)间隔帧:帧间隔就是上述四种帧的中间,都要有这个帧间隔,去隔离。以达到容易每个帧的类型。如果每个帧都直接连接在一起,变成一坨一坨的数据堆,接收方会非常难解读的。所以帧间隔好比我们文字中的标点符号中的句号一样,起到让通信密文更加易懂。
/**
* struct can_frame – basic CAN frame structure
* @can_id: CAN ID of the frame and CAN_*_FLAG flags, see canid_t definition
* @can_dlc: frame payload length in byte (0 .. 8) aka data length code
* N.B. the DLC field from ISO 11898-1 Chapter 8.4.2.3 has a 1:1
* mapping of the ‘data length code’ to the real payload length
* @data: CAN frame payload (up to 8 byte)
*/
struct can_frame {
canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
__u8 can_dlc; /* frame payload length in byte (0 .. CAN_MAX_DLEN) */
__u8 data[CAN_MAX_DLEN] __attribute__((aligned(8)));
};
can_id定义如下所示,是一个无符号的32位整形数
typedef __u32 canid_t;
can_id数据组织形式如下
/*
* Controller Area Network Identifier structure
*
* bit 0-28 : CAN identifier (11/29 bit)
* bit 29 : error message frame flag (0 = data frame, 1 = error message)
* bit 30 : remote transmission request flag (1 = rtr frame)
* bit 31 : frame format flag (0 = standard 11 bit, 1 = extended 29 bit)
*/
0-28位为标识符,如果是扩展帧,则高11位为标准ID
29位标识是数据帧还是错误消息
30位说明是否是远程帧
31位说明是标准帧还是扩展帧。
以下是在处理can_frame时用到的掩码和标识符:
/* special address description flags for the CAN_ID */
#define CAN_EFF_FLAG 0x80000000U /* EFF/SFF is set in the MSB */
#define CAN_RTR_FLAG 0x40000000U /* remote transmission request */
#define CAN_ERR_FLAG 0x20000000U /* error message frame */
/* valid bits in CAN ID for frame formats */
#define CAN_SFF_MASK 0x000007FFU /* standard frame format (SFF) */
#define CAN_EFF_MASK 0x1FFFFFFFU /* extended frame format (EFF) */
#define CAN_ERR_MASK 0x1FFFFFFFU /* omit EFF, RTR, ERR flags */
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150464.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...