打印
[APM32E1]

CAN基础知识分享

[复制链接]
876|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 鱼香Rose 于 2022-5-31 11:23 编辑

#申请原创# 一、CAN总线基础
1. CAN总线类型


高速CAN:速度快,高速场合,500Kbps-1Mbps           
低速CAN(容错)CAN:抗干扰性强,125Kbps






2. 连接方式&寻址
CAN总线支持多个节点挂载在总线上,CAN总线其实没有主从的概念,每个设备都是一个节点(Node),节点直接可以相互通讯.

节点A广播消息,节点B和节点C都会收到消息;节点B 和 节点C 会根据消息中的标识符,以及B和C中的消息过滤规则进行比较,如果不满足规则,就不接受这条信息。
注意的是:
发送消息的时候,总线必须处于空闲状态;
标识符越小,则消息获取总线的优先级越高;
                 


3. CAN总线电平
CANBUS上的总线电平称为隐性电平和显性电平:
                                    
名称
性质
逻辑
CAN_H
CAN_L
两条线上的电压差
Recessive
隐性
逻辑1
2.5V
2.5V
0V
Dominant
显性
逻辑0
3.5V
1.5V
2V


4. 数据格式
l 数据帧
数据帧以一个显性位(逻辑0)开始,以7个连续的隐性位(逻辑1)结束。CAN总线的数据帧有如下两种:
帧起始:SOF,用于同步, 总线空闲期间的任何隐性到显性的跳变都将引起节点进行 硬同步。只有总线在空闲期间节点才能够发送SOF。
仲裁段(Arbitration Field)(存放ID信息,也决定数据帧发送的优先级)
RTR位:用于区分数据帧和远程帧,数据帧=0,远程帧=1
IDE位:用于区分标准帧和扩展帧,标准帧=0,扩展帧=1
CAN总线遵从“线与”机制:“显性”位可以覆 盖“隐性”位;只有所有节点都发 送“隐性”位, 总线才处于“隐性” 状态。这种“线与”机制使CAN总线呈现显性优先的特性。


控制段(控制数据段的字节数量)
在控制段,r1reserved1)和r0reserved0)为保留位,默认设置为显性位。最主要的是DLCData Length Code)段,它是用二进制编码表示本报文中的数据段包含多少个字节。DLC段由4位组成,DLC3DLC0,表示的数字为0-8.


数据段:0-8个字节长度,由DLC确定。(存放数据 0-8个字节长度)
CRC段:为了保证报文的正确传输,CAN的报文包含了一段15位的CRC校验码,一旦接收端计算出的CRC码跟接收到的CRC码不同,就会向发送端反馈出错信息以及重新发送。CRC部分的计算和出错处理一般由CAN控制器硬件完成,或由软件控制最大重发数; CRC校验码之后,有一个CRC界定符,它为隐性位,DEL,主要作用是把CRC校验码与后面的ACK段隔开。
l 远程帧
用于接收到单元向具有相同ID的发送的单元请求数据的帧,与数据帧相比,远程帧没有数据场。
数据帧和远程帧对比:
3.2波特率:
CAN波特率=APB总线频率/分频系数/TBS1+TBS2+SJY
CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,CAN_Mode_Normal);
假如:
主频72MAPB1时钟二分频,Fpclk1=36M
波特率预分频器系数 CAN_Prescaler 4
波特率即36M/((8+9+1)*4)=500Kbps

3.3 CAN过滤器
CAN控制器每个筛选器组由两个32位的寄存器组成

MARK决定Filter是否起作用,因此想要接收全部报文,直接MARK设置为0就搞定。如果MARK设置了,则相应位过滤器起作用。过滤器的作用就是:相同接收。

                     
例子:
假如我们需要0X0->0x07 的标准数据帧ID,其他过滤。

3.4通信模式
静默模式(侦听模式)
配置寄存器 CAN_BITTIM SILMEN 位置 1,选择静默模式。
发送端在内部直接连接输出端,并且只有 == 1的时候才会发送数据到总线,但是能一直接收。只能向总线发送1,逻辑1是隐性位,它不会影响总线的状态。一般用于测试发送的数据对不对。                                  
环回模式
配置寄存器 CAN_BITTIM LBKMEN 位置 1,选择环回模式。
该模式下,发送的数据直接传到输入端接收,不从总线上接收数据,可以向总线发送所有数据。


静默回环:
该模式可用于“热自检”,不向总线上发送,也不从总线上接收,发送端直接连接内部的接收端

4.CAN功能描述
4.1 CAN发送过程

1、应用程序选择1个空置(CAN_TER寄存器的TME为1)的发送邮箱2、设置标识符,数据长度和待发送数据
3CAN_TIxR寄存器的TXRQ位置’1’进入入挂号状态来请求发送
4挂号状态的邮箱,等待成为最高优先级的邮箱(预定发送状态),一旦CAN总线进入空闲状态,预定发送邮箱中的报文就马上被发送(发送状态)5、邮箱中的报文被成功发送后,它马上变为空置邮箱;硬件相应地 对CAN_TSR寄存器的RQCPTXOK位置1,来表明一次成功发送。

4.2CAN接收过程
1FIFO从空状态开始,在接收到第一个有效的报文后,FIFO状态变为挂号_1(pending_1),硬件相应地把CAN_RFR寄存器的FMP[1:0]设置为’01(二进制01b)。软件可以读取FIFO输出邮箱来读出邮箱中的报文,然后通过对CAN_RFR寄存器的RFOM位设置’1’来释放邮箱,这样FIFO又变为空状态了。
2、如果在释放邮箱的同时,又收到了一个有效的报文,那么FIFO仍然保留在挂号_1状态,软件可以读取FIFO输出邮箱来读出新收到的报文。如果应用程序不释放邮箱,在接收到下一个有效的报文后,FIFO状态变为挂号_2(pending_2),硬件相应地把FMP[1:0]设置为’10(二进制10b)
3、重复上面的过程,第三个有效的报文把FIFO变为挂号_3状态(FMP[1:0]11b);软件必须对RFOM位设置1来释放邮箱,以便FIFO可以有空间来存放下一个有效的报文;否则,下一个有效的报文到来时就会导致一个报文的丢失。

4.3离线恢复--CAN_ABOM                
CAN_TXCAN_RX引脚悬空,可以观察到CAN_ESR寄存器中TEC(发送错误计数)数值增加;后面BOFF标志位置1CAN进入离线状态。

CAN_ITConfig(CAN1,CAN_IT_BOF,ENABLE);               
CAN_ITConfig(CAN1,CAN_IT_ERR,ENABLE);        
CAN_InitStructure.CAN_ABOM=ENABLE,使能CAN总中断和BOF中断,开启ABOM后,CAN通信可以自动恢复。




使用特权

评论回复
沙发
海滨消消| | 2022-5-26 15:09 | 只看该作者
挺不错的基础知识贴,感谢分享

使用特权

评论回复
板凳
WoodData| | 2022-5-26 18:09 | 只看该作者
学习一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

14

帖子

1

粉丝