https://elearning.vector.com/ !!!
https://www.zhihu.com/column/c_137983690!!!
参考
https://space.bilibili.com/32091809/search/dynamic?keyword=CAN
https://www.bilibili.com/video/BV1wf4y1r7jg/?spm_id_from=333.337.search-card.all.click&vd_source=7155082256127a432d5ed516a6423e20
https://blog.csdn.net/weixin_44793491/article/details/107298426
https://www.bilibili.com/video/BV1Dq4y1J7WA?p=2&vd_source=7155082256127a432d5ed516a6423e20
https://www.bilibili.com/video/BV1d7411i7Ey/?spm_id_from=333.337.search-card.all.click&vd_source=7155082256127a432d5ed516a6423e20
https://www.bilibili.com/video/BV1cT411S733/?spm_id_from=333.337.search-card.all.click&vd_source=7155082256127a432d5ed516a6423e20 没细看 写的挺好的
下面的没看
https://www.bilibili.com/video/BV1HJ411a7AN/?spm_id_from=333.337.search-card.all.click&vd_source=7155082256127a432d5ed516a6423e20
https://www.bilibili.com/video/BV1RM411h7tN/?spm_id_from=333.337.search-card.all.click&vd_source=7155082256127a432d5ed516a6423e20
https://www.bilibili.com/video/BV1Fz4y1F73h/?spm_id_from=333.337.search-card.all.click&vd_source=7155082256127a432d5ed516a6423e20
https://www.bilibili.com/video/BV1pc411c7BB/?spm_id_from=333.999.0.0&vd_source=7155082256127a432d5ed516a6423e20
https://www.bilibili.com/video/BV1wv411V7NX/?spm_id_from=333.337.search-card.all.click&vd_source=7155082256127a432d5ed516a6423e20
https://www.bilibili.com/video/BV1HY411D7Ar/?spm_id_from=333.337.search-card.all.click&vd_source=7155082256127a432d5ed516a6423e20
高速CAN
终端电阻
终端电阻,是一种电子信息在传输过程中遇到的阻碍,高频信号传输时,信号波长相对传输线较短,信号在传输线终端会形成反射波,干扰原信号,所以需要再传输线末端加终端电阻,使信号到达传输线末端后不反射;对于低频信号则不用
低速CAN
逻辑信号
0: 显性(位)
1:隐性(位)
总线物理信号
高速CAN
CAN_H=2.5V, CAN_L=2.5V:隐性
CAN_H=3.5V, CAN_L=1.5V:显性
低速CAN
CAN_H=0.3V, CAN_L=4.7V:隐性
CAN_H=3.6V, CAN_L=1.4V:显性
完成控制器间信号的传送,把各种信息转化为可以传输的物理信号并且将这些信号传输到目标控制器中
就是规定不同的控制器之间进行数据传输时,需要用什么样的介质进行连接
就是二进制数据
节点结构
收发器
**数字信号 <–> 物理信号(CAN_H/CAN_L)**两者之间的转换采用差分电平信号
属于OSI模型中的物理层
也就是电压信号(值)<–> 二进制数字信号,也就是逻辑电平与物理电平的转换
控制器
基于二进制解析成CAN报文格式
基于二进制进行CAN报文的编码和解码
MCU
直接对CAN报文进行运算
逻辑信号
0: 显性(位)
1:隐性(位)
总线物理信号
高速CAN
CAN_H=2.5V, CAN_L=2.5V:隐性
CAN_H=3.5V, CAN_L=1.5V:显性
低速CAN
CAN_H=0.3V, CAN_L=4.7V:隐性
CAN_H=3.6V, CAN_L=1.4V:显性
定义一套具体的协议
编码、访问机制、同步机制、数据保护、数据流控制等
广播形式
- ID标识符匹配原则; 报文过滤机制
ID过滤,是在控制器中完成的
发送的报文必须接受,否则是发不出去的
总线上的节点,在向总线上发送报文的时候,需要线检测总线的状态,只有总线处于空闲的状态的时候才能发送
当总线上出现连续11个逻辑1(隐性位),认为是空闲的
多个CAN节点并介到同一总线时,只要其中一个节点输出低电平,总线就为低电平
显性位(逻辑0)是可以覆盖隐性位(逻辑1)的
当所有节点输出高电平(逻辑1),总线才为高电平(逻辑1),也就是只有所有的节点都发送隐性位(逻辑),总线上才是隐性位(逻辑1)
因为0和任何数与都是0
多节点传输的时候,需要进行ID仲裁,如何再判断总线状态的时候,在仲裁后进继续发送或转为接收模式,就需要回读机制
每个节点在向总线上发送一个位的时候,都会在总线上读取一个电平,来判断总线上与自己发送的电平是否一致,如果一致就继续发送,如果不一致就不发送
这里边有一个错误的机制:如果发送到总线上是0,但是回读到的是1,那么就是一个错误
NRZ不归零编码
针对仲裁场ID和数据场,如果出现连续11个隐形位(逻辑1)时,使用位填充的方法进行同步:采用填充位在连续5个相同位后插入一个相反位,产生跳变沿,用于同步(这里是CAN控制器自己去填充)
对于接收节点,那么会清除连续5个位后的相反位
竞争:多个节点同时要发送数据
仲裁发生在仲裁段
采用“线与”机制
ID值越小,优先级越高
仲裁失败进入“只听”模式
一般在CAN接收中断服务函数中,处理CAN消息
异步串行通信:采样点按约定的频率采样数据,根据波特率采样
为减少波特率的误差带来的通信错误
解决:CAN总线规定信号的跳变沿时刻进行同步,将误差累积限制在两个跳变沿
问题:发送多个相同位时没有跳变沿用于同步,会导致误差不断累计
解决:使用位填充的方法进行同步:采用填充位在连续5个相同位后插入一个相反位,产生跳变沿,用于同步(这里是CAN控制器自己去填充)
采样点/位
一个位时间=1/波特率
位时间:同步段、传播段、相位缓冲段1、相位缓冲段2
1位时间=10时间份额
- 同步段SS:1时间份额
- 传播段PTS:1时间份额
- 相位缓冲段1 PBS1:4时间份额
- 相位缓冲段2 PBS2:4时间份额
一个时间份额:Tq(由晶振时间分频而来)
采样点:规定在第x个时间份额后进行采样,采样点是指读取总线电平,并将读到的电平作为位值的点
根据位时序可以计算出CAN通信的波特率
注意:正确采样的前提:节点监测到总线上信号的跳变在SS段内(同步段内),表示节点和总线的时序时同步的,在同步的条件下,采样点的电平才是该的电平
硬件同步
节点通过CAN总线发送数据,一开始发送帧起始信号,总线上的其他节点会检测帧起始信号在不在位数据的SS段(数据同步段),判断内部时序与总线是否同步
再同步
利用隐形位到显性位的边沿进行再同步
初始化模式
对寄存器进行配置需要进入初始化模式
正常模式
CAN总线同步,开始接收和发送
睡眠模式
默认处于睡眠模式,CAN总线空闲
静默模式
只向总线发送1,不发送0
能从总线接收数据
用于统计总线的流量
环回模式
自发自收
发送的数据直接到输入,且总线可以检测接收数据
不能从总线接收数据
用于自检
环回静默模式
发送的数据直接到输入,且总线不可以检测接收数据
不能从总线接收数据
用于自检,不影响总线
CAN内核
包括各种控制、状态、配置寄存器,可以配置模式、波特率
发送节点向接收节点传送数据,使用最多
接收节点向某个发送节点请求数据(发送节点让另外一个节点反馈数据的时候)
当总线、某节点检测出错误时向其他节点通知错误的帧
接收节点向发送节点通知自身接收能力的帧(接收节点通知其尚未做好准备接收)
数据帧或远程帧与前面的帧分离的帧
帧起始(1位):显性位SOF,标识一个数据帧的开始,用于同步;只有在总线空闲期间,节点才能发送SOF(在总线空闲的时候,发送节点发出帧起始;其他接收节点从这个帧起始位进行同步(用于减少累计误差))
ID(11位):标识符,唯一确定一条报文,表明报文的含义,可以包括报文的源地址、目标地址;用于确定报文的仲裁优先级(ID数值越小,优先级越高);在接收时用于ID过滤
SRR(1位):无实际意义,SRR永远置1
IDE(1位):用于区分标准帧和扩展帧:标准帧IDE=0(11位ID),扩展帧IDE=1(29位ID)
Extended ID(18位):如果IDE=1,也就是29-11=18
RTR位(1位):区分数据帧和远程帧(由于芯片性能的提高,远程帧很少使用了):数据帧RTR=0; 远程帧RTR=1
标准帧和扩展帧之间的仲裁
如果前11位全都相同,那么使用RTR位进行仲裁???
- r1(1位):保留位,显性电平0填充
- r0(1位):保留位,显性电平0填充
- DLC(4位):数据场包含数据的字节数
- 数据场(0-8个字节):实际CAN数据发送的内容,是可变的
- CRC(15位):进行CRC校验,CRC位之前的所有数据位(从帧起始,到数据场中的最后一位)根据一定规则进行校验checksum
- DEL(1位):CRC界定符,在CRC界定符之前 从SOF开始,到DEL之前进行位填充,显性位电平0
对于校验场,发送节点会计算一次,接收节点也会校验一次,在接收的过程中,如果发现接收到的校验场和自己实际计算出的校验场不一致,就会发生校验场错误
CRC校验
- ACK(1位): 确定报文被至少一个节点正确接收(发送节点ACK置1(隐性电平),接受方正确接收报文,则将ACK位置0(显性电平)),发送节点查看ACK位从以隐性变显性,知道有节点接收数据,如果没有节点接收,则报相应的错误帧
- DEL(1位):界定符,隐性位电平1
发送节点发送一帧报文后, 会将应答场中的ACK置为1,(发送节点在发出的时候ACK是1),当任何一个节点正确接收了这个发送节点的报文,接收就会把ACK的位置置位0(也就是接收节点会发送一个0到总线上去),也就是发送节点发送的ACK必定是1,但是回读的时候是0(一定要读到0,才表示正确发送了),如果回读到时1,那么就是出错,那么发送节点就会发送一个错误帧到总线上,表示应答错误(因为所有的报文必须要有节点接收,才能表示发送成功)
- EOF(7位):连续7个隐性位
- ITM(3位):连续3个隐性位
- ITM之后,总线会进入空闲状态,此时其他节点可以发送报文,如果节点检测到11个连续的隐性位,就认为总线进入空闲阶段(1+7+3)
- 标准帧
- 扩展帧
利用计数器进行状态转换
- 发送错误计数器TEC
- 接收错误计数器REC
设备正常参与总线通信,检测到错误时发送主动错误标识
设备正常参与总线通信,检测到错误时发送被动错误标识
数据帧的收发被禁止,脱离总线
https://www.zhihu.com/question/480979783/answer/2768261261
https://zhuanlan.zhihu.com/p/534097312?utm_id=0
https://baijiahao.baidu.com/s?id=1656396925096307630&wfr=spider&for=pc
CAN总线报文的livecounter是用于检测报文的完整性和正确性的一个计数器。它的作用是在报文中添加一个计数器字段,用于记录报文的发送次数。通过比较接收到的报文的livecounter值和上一次接收到的报文的livecounter值,可以判断报文是否丢失或重复。
工作原理如下:
发送端在每次发送报文时,会将livecounter的值加1,并将该值添加到报文中。
接收端在接收到报文后,会比较接收到的报文的livecounter值和上一次接收到的报文的livecounter值。
如果接收到的报文的livecounter值比上一次接收到的报文的livecounter值大1,说明没有报文丢失。
如果接收到的报文的livecounter值和上一次接收到的报文的livecounter值相同,说明报文重复。
如果接收到的报文的livecounter值比上一次接收到的报文的livecounter值小,说明有报文丢失
在汽车电子中,CAN总线报文livecounter的作用和工作原理如下:
Live Counter报文用于监视CAN总线活动状态。通过发送Live Counter报文,CAN总线上的节点可以定期接收总线活动信息,从而了解总线状态。这有助于诊断总线上的问题,例如总线故障或节点故障。
Live Counter报文的工作原理是,在CAN总线上,当有节点发送或接收数据时,Live Counter报文的计数器会递增。其他节点通过读取Live Counter报文的计数器值,可以了解当前总线的活动状态。如果计数器值长时间不变,可能表示总线处于空闲状态;如果计数器值不断递增,则表示总线处于活动状态。
此外,通过比较不同节点的Live Counter报文计数器值,可以判断总线上哪个节点处于活动状态。这有助于诊断总线上的节点故障。
总之,CAN总线报文livecounter的作用是监视CAN总线活动状态,并通过计数器值的变化了解总线状态。其工作原理基于节点发送或接收数据时计数器的递增,为故障诊断和系统监测提供了重要信息。