CAN总线(Controller Area Network Bus)控制器局域网总线 CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线,广泛应用于汽车、嵌入式、工业控制等领域 CAN总线特征: 两根通信线(CAN_H、CAN_L),线路少,无需共地 差分信号通信,抗干扰能力强,用电压差值传递数据 高速CAN(ISO11898):125k~1Mbps, <40m,用处多,着重学 低速CAN(ISO11519):10k~125kbps, <1km 异步,无需时钟线,通信速率由设备各自约定 半双工,可挂载多设备,多设备同时发送数据时通过仲裁判断先后顺序 11位(标准格式)/29位(扩展格式)报文ID,用于区分消息功能,同时决定优先级 可配置1~8字节的有效载荷
广播式(发送者向接收者写入数据,这个lan网络下的其他设备被动接收,可根据ID确定要不要接收)和
请求式(发一个数据就需要先请求再接收)两种传输方式 应答、CRC校验、位填充、位同步、错误处理等特性主流通信协议对比
对比其他串行通信协议:
名称
引脚
双工
时钟
电平
设备
应用场景
UART
TX、RX
全双工
异步
单端
点对点
两个设备互相通信
I2C
SCL、SDA
半双工
同步
单端
多设备
一个主控外挂多个模块
SPI
SCK、MOSI、MISO、
SS
全双工
同步
单端
多设备
一个主控外挂多个模块(高速)
CAN
CAN_H、CAN_L
半双工
异步
差分
多设备
多个主控互相通信
UART
IIC
SPI
CAN 通讯并不是以时钟信号来进行同步的,它是一种半双工异步通讯,只具有CAN_High 和CAN_Low 两条信号线,共同构成一组差分信号线,以差分信号的形式进行通讯。
发送数据时:控制器把要发送的二进制编码通过CAN_Tx 线发送到收发器,然后由收发器把这个普通的逻辑电平信号转化成差分信号,通过差分线CAN_High 和CAN_Low 线输出到CAN 总线网络。
接收数据时:收发器把总线上收到的CAN_High 及CAN_Low 信号转化成普通的逻辑电平信号,通过CAN_Rx 输出到控制器中
怎么确定和哪个从机通信,读写关系确定?
can类似于广播,发送者向信道写入数据,这个lan网络下的其他设备被动接收(可以根据ID确定要不要接收)
两种CAN的连接结构
1.开环总线网络:低速、远距离“开环网络”,它的最大传输距离为1km,最高通讯速率为125kbps,两根总线是独立的、不形成闭环,要求每根总线上各串联有一个“2.2 千欧”的电阻。
低速CAN使用开环总线网络
2.闭环总线网络:高速、短距离“闭环网络”,它的总线最大长度为40m,通信速度最高为1Mbps,总线的两端各要求有一个“120 欧”的电阻。
电阻的作用
1.防止回波反射 尤其是 高频信号、远距离传输的场景 如果不加终端电阻 信号波形会在线路终端反射,进而干扰原始信号 。加了终端电阻 且 阻抗匹配 则电平跳变会比较平稳 2.在没有设备操作时 将两根差分线的电压 “收紧” (收紧为 电平1 呈隐性) 使其电压一致。 收紧:在没有设备操作总线的情况下 电阻就和弹簧一样 将两根线(CAN_H CAN_L) 的电压拉到同一个电平 和I2C的上拉电阻很像。
差分协议
表示逻辑1 时(隐性电平),CAN_High 和CAN_Low 线上的电压均为2.5v,即它们的电压差VH-VL=0V;
表示逻辑0 时(显性电平),CAN_High 的电平为3.5V,CAN_Low 线的电平为1.5V,即它们的电压差为VH-VL=2V。
例如,当CAN 收发器从CAN_Tx 线接收到来自CAN 控制器的低电平信号时(逻辑0),它会使CAN_High 输出3.5V,同时CAN_Low 输出1.5V,从而输出显性电平表示逻辑0。
在原始数据段的前面加上传输起始标签、片选标签和控制标签,在数据的尾段加上CRC校验标签、应答标签和传输结束标签,把这些内容按特定的格式打包好,就可以用一个通道表达各种信号了,当整个数据包被传输到其它设备时,只要这些设备按格式去解读,就能还原出原始数据,这样的报文就被称为CAN 的“数据帧”。
为了更有效地控制通讯,CAN 一共规定了5 种类型的帧:
数据帧的结构
数据帧是在CAN 通讯中最主要、最复杂的报文。
帧起始
SOF 段(Start Of Frame),译为帧起始,帧起始信号只有一个数据位,是一个显性电平(0),它用于通知各个节点将有数据传输。
仲裁段(ID)
当同时有两个报文被发送时,总线会根据仲裁段的内容决定哪个数据包能被传输,这也是它名称的由来。
仲裁段的内容主要为本数据帧的ID 信息(标识符),数据帧具有标准格式和扩展格式两种,区别就在于ID 信息的长度,标准格式的ID 为11 位,扩展格式的ID 为29 位,它在标准ID 的基础上多出18 位。
在CAN 协议中,ID 起着重要的作用,它决定着数据帧发送的优先级,也决定着其它节点是否会接收这个数据帧。CAN 协议不对挂载在它之上的节点分配优先级和地址,对总线的占有权是由信息的重要性决定的,即对于重要的信息,我们会给它打包上一个优先级高的ID,使它能够及时地发送出去。也正因为它这样的优先级分配原则,使得CAN 的扩展性大大加强,在总线上增加或减少节点并不影响其它设备。
如果总线上同时出现显性电平(0)和隐性电平(1),总线的状态会被置为显性电平,CAN 正是利用这个特性进行仲裁。若两个节点同时竞争CAN 总线的占有权,当它们发送报文时,若首先出现隐性电平,则会失去对总线的占有权。
具体方式是当多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性 电平最多的单元可继续发送。
仲裁段ID 的优先级也影响着接收设备对报文的反应。因为在CAN 总线上数据是以广播的形式发送的,所有连接在CAN 总线的节点都会收到所有其它节点发出的有效数据,因而我们的CAN控制器大多具有根据ID 过滤报文的功能,它可以控制自己只接收某些ID 的报文。
回看上图数据帧的结构中的数据帧格式,可看到仲裁段除了报文ID 外,还有RTR、IDE 和SRR 位。
(1) RTR 位(Remote Transmission Request Bit),译作远程传输请求位,它是用于区分数据帧和遥控帧的,当它为显性电平(0)时表示数据帧,隐性电平(1)时表示遥控帧。
(2) IDE 位(Identifier Extension Bit),译作标识符扩展位,它是用于区分标准格式与扩展格式,当它为显性电平时表示标准格式,隐性电平时表示扩展格式。
(3) SRR 位(Substitute Remote Request Bit),只存在于扩展格式,它用于替代标准格式中的RTR 位。由于扩展帧中的SRR 位为隐性位,RTR 在数据帧为显性位,所以在两个ID 相同的标准格式报文与扩展格式报文中,标准格式的优先级较高。
控制段
在控制段中的r1 和r0 为保留位,默认设置为显性位。它最主要的是DLC段(Data Length Code),译为数据长度码,它由4 个数据位组成,用于表示本报文中的数据段含有多少个字节,DLC 段表示的数字为0~8。
数据段
数据段为数据帧的核心内容,它是节点要发送的原始信息,由0~8 个字节组成,MSB 先行。
CRC段(校验段)
为了保证报文的正确传输,CAN 的报文包含了一段15 位的CRC 校验码,一旦接收节点算出的CRC 码跟接收到的CRC 码不同,则它会向发送节点反馈出错信息,利用错误帧请求它重新发送。CRC 部分的计算一般由CAN 控制器硬件完成,出错时的处理则由软件控制最大重发数。
(错误帧的用途:某个设备检测出错误时向其他设备通知错误。当某个设备发现总线上的波形不对,产生错误了,他就会发出错误帧,错误帧可以叠加在数据帧上,并且可以破坏数据帧的数据,意思就是我发现这一帧数据有错,现在我破坏了这个数据,大家都不要用了,这是一种错误处理机制。)
在CRC 校验码之后,有一个CRC 界定符,它为隐性位(1),主要作用是把CRC 校验码与后面的ACK段间隔起来。
ACK段(确认信号)
ACK 段包括一个ACK 槽位和一个ACK 界定符位。类似I2C 总线,在ACK 槽位中,发送节点发送的是隐性位(1),而接收节点则在这一位中发送显性位(0)以示应答。在ACK 槽和帧结束之间由ACK 界定符间隔开。
帧结束
EOF 段(End Of Frame),译为帧结束,帧结束段由发送节点发送的7 个隐性位表示结束
由于CAN 属于异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会像串口异步通讯那样,节点间使用约定好的波特率进行通讯,特别地,CAN 还会使用“位同步”的方式来抗干扰、吸收误差,实现对总线电平信号进行正确的采样,确保通讯正常。
位时序
为了实现位同步,CAN 协议把每一个数据位的时序分解成 位时序分解图所示的SS 段(同步段)、PTS 段(传播时间段)、PBS1 段(相位缓冲段1)、PBS2 段(相位缓冲段2),这四段的长度加起来即为一个CAN 数据位的长度。分解后最小的时间单位是Tq。
1 位分为4 个段,每个段又由若干个Tq 构成,这称为位时序。
1 位由多少个Tq 构成、每个段又由多少个Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。
上图第一张图设定CAN 通讯信号每一个数据位的长度为10Tq,其中SS 段占1Tq,PTS 段占3Tq,PBS1段占3Tq,PBS2 段占3Tq。
信号的采样点位于PBS1 段与PBS2 段之间,通过控制各段的长度,可以对采样点的位置进行偏移,以便准确地采样,例如上图第二第三张图。
CAN通信频率:CAN总线时钟分频 = 42MHz /PSC(不需要+1) = 42 / 6 =7MHz
CAN通信单位时间Tq: 1/ 频率 = 1/ 7MHz = 1/7us
can把每个电平划分为了四个段:SS(起始段,固定一个Tq)、PTS(传播时间段)、PBS1、PBS2(至少两个Tq)
采样在PBS1和PBS2之间完成,PBS1可以延长、PBS2可以缩短(延长缩短的极限是SJW,TIPS:以上所有的值都是多少个单位时间Tq)。利用划分的四段,保证电平变换在SS段完成,采样点在PBS1和PBS2之间。
各段的作用如介绍下:
• SS 段
SS 译为同步段,若通讯节点检测到总线上信号的跳变沿被包含在SS 段的范围之内,则表示节点与总线的时序是同步的,当节点与总线同步时,采样点采集到的总线电平即可被确定为该位的电平。SS 段的大小固定为1Tq。
• PTS 段
PTS 译为传播时间段,这个时间段是用于补偿网络的物理延时时间。是总线上延时总和的两倍。PTS 段的大小可以为1~8Tq。
• PBS1 段
PBS1 译为相位缓冲段,主要用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以加长。PBS1 段的初始大小可以为1~8Tq。
• PBS2 段
PBS2 这是另一个相位缓冲段,也是用来补偿边沿阶段误差的,它的时间长度在重新同步时可以缩短。PBS2 段的初始大小可以为2~8Tq。
通讯的波特率
总线上的各个通讯节点只要约定好1 个Tq 的时间长度以及每一个数据位占据多少个Tq,就可以确定CAN 通讯的波特率。
例如,假设上图中的1Tq=1us,而每个数据位由10 个Tq 组成,则传输一位数据需要时间T=10us,从而每秒可以传输的数据位个数为:
1x10^6/10 = (bps)
这个每秒可传输的数据位的个数即为通讯中的波特率。
取得同步的方法
1.硬同步
节点将自己的位时序种的SS段平移至总线出现下降沿的部分,获得同步
硬同步只是当存在“帧起始信号”时起作用,无法确保后续一连串的位时序都是同步的,而重新同步方式可解决该问题。
2.再同步
前面的硬同步只是当存在帧起始信号时才起作用,如果在一帧很长的数据内,节点信号与总线信号相位有偏移时,这种同步方式就无能为力了。因而需要引入再同步方式,它利用普通数据位的隐性至显性电平的跳变沿来同步。重新同步与硬同步方式相似的地方是它们都使用SS 段来进行检测,同步的目的都是使节点内的SS 段把跳变沿包含起来。
同步的方式分为超前和滞后两种情况,以总线跳变沿与SS 段的相对位置进行区分。
- 相位超前:
假设节点从总线的边沿跳变中,检测到它内部的时序比总线的时序相对超前2Tq,这时控制器在下一个位时序中的PBS1 段增加2Tq 的时间长度,使得节点与总线时序重新同步。
- 相位滞后:
假设节点从总线的边沿跳变中,检测到它的时序比总线的时序相对滞后2Tq,这时控制器在前一个位时序中的PBS2 段减少2Tq 的时间长度,获得同步。
在重新同步的时候,PBS1 和PBS2 中增加或减少的这段时间长度被定义为“重新同步补偿宽度SJW (reSynchronization Jump Width)”。一般来说CAN 控制器会限定SJW 的最大值,如限定了最大SJW=3Tq 时,单次同步调整的时候不能增加或减少超过3Tq 的时间长度,若有需要,控制器会通过多次小幅度调整来实现同步。当控制器设置的SJW 极限值较大时,可以吸收的误差加大,但通讯的速度会下降。
(1) CAN_FilterIdHigh
用于存储要筛选的ID,若筛选器工作在32 位模式,它存储的是所筛选ID 的高16 位;若筛选器工作在16 位模式,它存储的就是一个完整的要筛选的ID。
(2) CAN_FilterIdLow
也是用于存储要筛选的ID,若筛选器工作在32 位模式,它存储的是所筛选ID 的低16 位;若筛选器工作在16 位模式,它存储的就是一个完整的要筛选的ID。
(3) CAN_FilterMaskIdHigh
CAN_FilterMaskIdHigh 分两种情况,当筛选器工作在标识符列表模式时,它的功能与CAN_FilterIdHigh 相同,都是存储要筛选的ID;而当筛选器工作在掩码模式时,它存储的是CAN_FilterIdHigh 成员对应的掩码,与CAN_FilterMaskIdLow 组成一组筛选器。
4) CAN_FilterMaskIdLow
CAN_FilterMaskIdLow 存储的内容也分两种情况,当筛选器工作在标识符列表模式时,它的功能与CAN_FilterIdLow 相同,都是存储要筛选的ID;而当筛选器工作在掩码模式时,它存储的是CAN_FilterIdLow 成员对应的掩码,与CAN_FilterMaskIdHigh组成一组筛选器。
不同模式下各结构体成员的内容:
用库函数CAN_FilterInit 即可把这些参数写入到筛选控制寄存器中。
数据收发流程
封装或者解析相应的数据报,收(判断FIFO缓冲区有没有数据,没数据就收不了),发(返回发送所用的邮箱号,读取和存储报文数据段的内容)
can.c
main.c
到此这篇can 通讯(can通讯协议)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/cjjbc/24079.html