本帖最后由 鱼香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上的总线电平称为隐性电平和显性电平:
4. 数据格式 l 数据帧 数据帧以一个显性位(逻辑0)开始,以7个连续的隐性位(逻辑1)结束。CAN总线的数据帧有如下两种: 帧起始:SOF,用于同步, 总线空闲期间的任何隐性到显性的跳变都将引起节点进行 硬同步。只有总线在空闲期间节点才能够发送SOF。 仲裁段(Arbitration Field)(存放ID信息,也决定数据帧发送的优先级) RTR位:用于区分数据帧和远程帧,数据帧=0,远程帧=1 IDE位:用于区分标准帧和扩展帧,标准帧=0,扩展帧=1 CAN总线遵从“线与”机制:“显性”位可以覆 盖“隐性”位;只有所有节点都发 送“隐性”位, 总线才处于“隐性” 状态。这种“线与”机制使CAN总线呈现显性优先的特性。
控制段(控制数据段的字节数量) 在控制段,r1(reserved1)和r0(reserved0)为保留位,默认设置为显性位。最主要的是DLC(Data Length Code)段,它是用二进制编码表示本报文中的数据段包含多少个字节。DLC段由4位组成,DLC3−DLC0,表示的数字为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); 假如: 主频72M,APB1时钟二分频,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、设置标识符,数据长度和待发送数据3、CAN_TIxR寄存器的TXRQ位置’1’进入入挂号状态来请求发送 4、挂号状态的邮箱,等待成为最高优先级的邮箱(预定发送状态),一旦CAN总线进入空闲状态,预定发送邮箱中的报文就马上被发送(发送状态)5、邮箱中的报文被成功发送后,它马上变为空置邮箱;硬件相应地 对CAN_TSR寄存器的RQCP和TXOK位置1,来表明一次成功发送。
4.2CAN接收过程 1、FIFO从空状态开始,在接收到第一个有效的报文后,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_TX和CAN_RX引脚悬空,可以观察到CAN_ESR寄存器中TEC(发送错误计数)数值增加;后面BOFF标志位置1,CAN进入离线状态。
CAN_ITConfig(CAN1,CAN_IT_BOF,ENABLE); CAN_ITConfig(CAN1,CAN_IT_ERR,ENABLE); CAN_InitStructure.CAN_ABOM=ENABLE,使能CAN总中断和BOF中断,开启ABOM后,CAN通信可以自动恢复。
|