STM32 CAN知识总结
一、CAN物理特性
can总线显性为0,隐形为1,类似线与的特点
二、CAN帧有五种:数据帧、远程帧、错误帧、过载帧、 帧间隔。其中数据帧最为常见
CAN数据帧结构上由7个段组成
CAN总线ACK应答机制:确认数据是否正常接收,所谓正常接收是指不含填充错误、格式错误、 CRC 错误。发送节点将此位为1,接收节点正常接收数据后将此位置为0;(1 bit)
三、帧仲裁
当多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送
四 、CAN过滤器
过滤器一共有4种工作模式:32位宽的掩码模式,32位宽的列表模式, 16位宽的列表模式,16位宽的掩码模式
以下代码为CAN过滤器设置代码例子:该例子只会接收ID为Can_Address的数据帧
CAN_FilterInitStructure.CAN_FilterNumber=0; //过滤器0
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //掩码模式
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽
CAN_FilterInitStructure.CAN_FilterIdHigh=Can_Address<<5; //验证码(ID)左移5为的原因是CAN_FilterIdHigh包含的是STD[0~10]和EXID[13~17],标准CAN ID首先应左移5位后才能对齐.EXID[13~17]是5位
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff;//都不屏蔽
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//激活过滤器0
CAN_FilterInit(&CAN_FilterInitStructure); //滤波器初始化
五 、CAN波特率
STM32单片机中CAN的波特率主要由4个参数共同决定。他们分别是重新同步跳跃时间单元(tsjw)、时间段1的时间单元(tbs1)、时间段2的时间单元(tbs2)、波特率分频器(brp)。对应到STM32单片机的库函数中,分别对应的是CAN_SJW、CAN_BS1(即tbs1+1)、CAN_BS2(即tbs2+1)、CAN_Prescaler等4个参数。库函数中只需完成这4个参数的设定即可。比如设置CAN_SJW=1tq,CAN_BS1=6tq,CAN_BS2=1tq,CANPrescaler=9,则波特率=36M/[(1+6+1)*9]=500Kbps。(APB1总线时钟(PCLK1)=36M)