CAN协议

目录

一、CAN的特点 

二、电气标准

三、帧种类

四、帧格式

五、工作模式

六、通信模式

七、CAN过滤器

八、常见的几种结构体 


一、CAN的特点 

        1)多主控制。在总线空闲时,所有单元都可以发送消息,而两个以上的单元同时开始发送消息时,根据标识符ID决定优先级。两个以上的单元同时开始发送消息时,对各消息 ID 的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。
        2)系统的柔软性。与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。
        3)通信速度较快,通信距离远。最高 1Mbps(距离小于 40M),最远可达 10KM(速率低
于 5Kbps)。
        4) 具有错误检测、错误通知和错误恢复功能。所有单元都可以检测错误(错误检测功能),
检测出错误的单元会立即同时通知其他所有单元(错误通知功能),正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。
        5)故障封闭功能。CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)
还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。
        6)连接节点多。CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没
有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。

二、电气标准

  • CAN有两根线:CAN_H,CAN_L
  • 显性电平对应逻辑 0,CAN_H 和 CAN_L 之差为 2.5V 左右。
  • 隐性电平对应逻辑 1,CAN_H 和 CAN_L 之差为 0V。
  • 在总线上显性电平具有优先权,只要有一个单元输出显性电平,总线上即为显性电平。而隐形电平则具有包容的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平(显性电平比隐性电平更强)。

三、帧种类

  • 数据帧  用于发送单元向接收单元传送数据的帧。
  • 遥控帧  用于接收单元向具有相同 ID 的发送单元请求数据的帧。
  • 错误帧  用于当检测出错误时向其它单元通知错误的帧。
  • 过载帧  用于接收单元通知其尚未做好接收准备的帧。
  • 帧间隔  用于将数据帧及遥控帧与前面的帧分离开来的帧。

PS: 数据帧和遥控帧有标准格式和扩展格式两种格式。标准格式有 11 个位的标识符(Identifier: 以下称 ID),扩展格式有 29 个位的 ID。扩展帧的29位是由标准帧的11位+拓展帧的18位组成

四、帧格式

数据帧一般由 7 个段构成,即:
(1) 帧起始。数据帧开始。标准帧和扩展帧都是由 1 个位的显性电平表示帧起始
(2) 仲裁段。帧优先级。 RTR 位用于标识是否是远程帧(0,数据帧;1,远程帧)
(3) 控制段。表示数据的字节数及保留位的段。IDE 位为标识符选择位(0,使用标准标识符;1,使用扩展标识符)。r0 和 r1 为保留位,必须全部以显性电平发送,但是接收端可以接收显性、隐性及任意组合的电平。DLC 段为数据长度表示段,高位在前,DLC 段有效值为 0~8
(4) 数据段。数据的内容,一帧可发送 0~8 个字节的数据。
(5) CRC 段。检查帧的传输错误的段。 15 个位的 CRC 顺序和 1 个位的 CRC 界定符(用
于分隔的位)组成
(6) ACK 段。表示确认正常接收的段。ACK 槽(ACK Slot)和 ACK 界定符 2 个位组成
(7) 帧结束。表示数据帧结束的段。 7 个位的隐性位组成

SRR 位为代替远程请求位,为隐性位,它代替了标准帧中的 RTR 位。

五、工作模式

(1)睡眠工作模式
        芯片复位后,CAN总线控制器处于睡眠工作模式。该模式下CAN总线控制器的时钟停止工作并处于一种低功耗状态。将CAN_CTL寄存器的SLPWMOD位置1,可以使CAN总线控制器进入睡眠工作模式。当进入睡眠工作模式后,CAN_STAT寄存器的SLPWS位将被硬件置1。将CAN_CTL寄存器的AWU位置1,并当CAN检测到总线活动时,CAN总线控制器将自动退出睡眠工作模式。将CAN_CTL寄存器的SLPWMOD位清0,也可以退出睡眠工作模式。
        由睡眠模式进入初始化工作模式:将CAN_CTL寄存器的IWMOD位置1,SLPWMOD位清0。
        由睡眠模式进入正常工作模式:将CAN_CTL寄存器的IWMOD位和SLPWMOD位清0。

(2)初始化工作模式
        如果需要配置 CAN 总线通信参数,CAN 总线控制器必须进入初始化工作模式。将CAN_CTL
寄存器的 IWMOD 位置 1,使 CAN 总线控制器进入初始化工作模式,将其清 0 则离开初始化工作模式。在进入初始化工作模式后,CAN_STAT 寄存器的IWS 位将被硬件置 1。
        由初始化模式进入睡眠模式:CAN_CTL 寄存器的 SLPWMOD 位置 1,IWMOD 位清 0。
        由初始化模式进入正常工作模式:CAN_CTL 寄存器的 SLPWMOD 位和 IWMOD 位清0。

(3)正常工作模式
        在初始化工作模式中配置完CAN 总线通信参数后,将 CAN_CTL 寄存器的IWMOD位清0可
以进入正常工作模式并与 CAN 总线网络中的节点进行正常通信。
        由正常工作模式进入睡眠工作模式:CAN_CTL 寄存器的 SLPWMOD 位置 1,并等待当前数
据收发过程结束。
        由正常工作模式初始化工作模式:CAN_CTL 寄存器的 IWMOD 位置 1,并等待当前数据收发
过程结束。

六、通信模式

(1)静默通信模式
        在静默通信模式下,可以从 CAN 总线接收数据,但不向总线发送任何数据。将 CAN_BT寄存器中的 SCMOD 位置 1,使 CAN 总线控制器进入静默通信模式,将其清0 可以退出静默通信
模式。静默通信模式可以用来监控CAN 网络上的数据传输。

(2)回环通信模式
        在回环通信模式下,由 CAN 总线控制器发送的数据可以被自己接收并存入接收FIFO,同时这些发送数据也送至CAN 网络。将CAN_BT 寄存器中的 LCMOD 位置 1,使 CAN总线控制器
进入回环通信模式,将其清0 可以退出回环通信模式。回环通信模式通常用来进行CAN 通信自测。

(3)回环静默通信模式
        在回环静默通信模式下,CAN 的 RX 和 TX 引脚与 CAN 网络断开。CAN 总线控制器既不从
CAN 网络接收数据,也不向 CAN 网络发送数据,其发送的数据仅可以被自己接收。
将CAN_BT
寄存器中的 LCMOD 位和 SCMOD 位置 1,使 CAN 总线控制器进入回环静默通信模式,将它
们清 0 可以退出回环静默通信模式。回环静默通信模式通常用来进行CAN 通信自测。

(4)正常通信模式
        CAN 总线控制器通常工作在正常通信模式下,可以从 CAN 总线接收数据,也可以向 CAN 总
线发送数据。这时需要将 CAN_BT 寄存器的LCMOD 位和 SCMOD 位清0。

七、CAN过滤器

1)概念

        CAN总线上面存在大量的CAN消息,通过设置过滤器,可以从硬件上过滤掉大部分CAN消息,降低了软件处理负担。

非GD32F30x CL系列产品中,过滤器由14个单元( Bank)组成,它们是bank0到bank13。在GD32F30x CL系列产品中,过滤器包含28个单元,它们是bank0到bank27。每一个过滤器单元有2个寄存器CAN_FxDATA0和CAN_ FxDATA1,它们可以配置为2种位宽:32-bit位宽和16-bit位宽

  • 32-bit 位宽 CAN_FDATAx包含字段:SFID[10:0],EFID[17:0],FF 和FT。
  • 16-bit 位宽 CAN_FDATAx包含字段:SFID[10:0],FT,FF和 EFID[17:15]。

2)过滤器有两种模式:掩码模式和列表模式

  • 掩码模式:对于一个待过滤的数据帧的标识符(Identifier),掩码模式用来指定哪些位必须与预设的标识符相同,哪些位无需判断。
  • 列表模式 :对于一个待过滤的数据帧的标识符(Identifier),列表模式用来表示与预设的标识符列表中能够匹配则通过,否则丢弃。

3)CAN过滤器的四种模式详解 

        a)16位列表模式

        16位宽的列表模式下,FilterIdHigh,FilterIdLow,FilterMaskIdHigh,FilterMaskIdLow这4个16位变量都是用来存储一个标准CAN ID,可以存放4个标准CAN ID了,需要注意地是,此种模式下,是不能处理扩展CANID,凡是需要过滤扩展CAN ID的,都是需要用到32位宽的模式。

        

        b)32位列表模式:

        FilterIdHigh或者FilterIdLow都可以存储一个标准CAN ID(16位),FilterMaskIdHigh和FilterMaskIdLow存储一个扩展CANID(28位)

        

         c)16位掩码模式:

        CAN_FxR1的低16位是作为验证码,对应的16位屏蔽码为CAN_FxR1的高16位,同样的,CAN_FxR2的低16位是作为验证码,对应与CAN_FxR2的高16位为屏蔽码。所以就是FilterIdHigh是验证码,FilterMaskIdHigh是屏蔽码;FilterIdLow是验证码,FilterMaskIdLow是屏蔽码。

        

        

        d)32位掩码模式:

        FilterIdHigh与FilterIdLow合在一起表示CAN_FxR1寄存器,用来存放验证码,而FilterMaskIdHigh与FilterMaskIdLow合在一起表示CAN_FxR2寄存器,用来存放屏蔽码,在32位宽的掩码模式下,既可以过滤标准CAN ID,也可以过滤扩展CAN ID,甚至两者混合这来也是可以的。

                 

4)CAN过滤器总结 

         

八、CAN协议涉及的几个结构体 

(1)CAN初始化配置结构体

typedef struct
{
/*!< 配置CAN外设的时钟分频,可以设置为1-102;它可控制时间片Tq的时间长度*/ 
uint16_t CAN_Prescaler;  
 
/*!< 配置CAN的工作模式:正常、回环、静默以及回环静默模式)*/
uint8_t CAN_Mode;         

/*!< 配置SJW的极限长度,可以被配置为1-4T,CAN重新同步时单次可增加或缩短的最大长度*/
uint8_t CAN_SJW;          

/*!<配置CAN位时序中的BS1段的长度,可以被配置为1-16个Tq长度*/
uint8_t CAN_BS1;         

/*!<设置CAN位时序中的BS2段的长度,它可以被配置为1-8个Tq长度*/
uint8_t CAN_BS2;          

/*!<是否使能TTCM时间触发功能*/  
FunctionalState CAN_TTCM; 

/*!<是否使能ABOM自动离线管理功能,使用自动离线管理可以在节点出错离线后适时自动恢复*/  
FunctionalState CAN_ABOM;  

/*!< 是否使能AWUM自动唤醒功能,使能自动唤醒功能后它会在监测到总线活动后自动唤醒。*/
FunctionalState CAN_AWUM;  

 /*!< 是否使用NART自动重传功能,使用自动重传功能时,会一直发送报文直到成功为止。*/
FunctionalState CAN_NART; 

/*!< 使能RELM锁定FIFO功能,若FIFO溢出时会丢弃新数据;不使能在FIFO溢出时以新数据覆盖旧数据*/
FunctionalState CAN_RFLM;

 /*!< 使能时,以报文存入发送邮箱的先后顺序来发送,否则按照报文ID的优先级来发送。*/
FunctionalState CAN_TXFP; 
} CAN_InitTypeDef;

(2)CAN发送消息结构体

typedef struct
{
//StdId: 本成员存储的是报文的11位标准标识符,范围是0-0x7FF。
uint32_t StdId; 

//本成员存储的是报文的29位扩展标识符,范围是0-0x1FFFFFFF。ExtId与StdId这两个成员根据下面的IDE位配置,只有一个是有效的。
uint32_t ExtId; 

//本成员存储的是扩展标志IDE位,当它的值为宏CAN_ID_STD时表示本报文是标准帧,使用StdId成员存储报文ID;当它的值为宏CAN_ID_EXT时表示本报文是扩展帧,使用ExtId成员存储报文ID。
uint8_t IDE;    

//本成员存储的是报文类型标志RTR位,当它的值为宏CAN_RTR_Data时表示本报文是数据帧;当它的值为宏CAN_RTR_Remote时表示本报文是遥控帧,由于遥控帧没有数据段,所以当报文是遥控帧时,下面的Data[8]成员的内容是无效的。
uint8_t RTR;     

//本成员存储的是数据帧数据段的长度,它的值的范围是0-8,当报文是遥控帧时DLC值为0。
uint8_t DLC;     

//本成员存储的就是数据帧中数据段的数据。
uint8_t Data[8]; 
} CanTxMsg;

 (3)CAN接收消息结构体

typedef struct
{
//StdId: 本成员存储的是报文的11位标准标识符,范围是0-0x7FF。
uint32_t StdId; 

//本成员存储的是报文的29位扩展标识符,范围是0-0x1FFFFFFF。ExtId与StdId这两个成员根据下面的IDE位配置,只有一个是有效的。
uint32_t ExtId; 

//本成员存储的是扩展标志IDE位,当它的值为宏CAN_ID_STD时表示本报文是标准帧,使用StdId成员存储报文ID;当它的值为宏CAN_ID_EXT时表示本报文是扩展帧,使用ExtId成员存储报文ID。
uint8_t IDE;    

//本成员存储的是报文类型标志RTR位,当它的值为宏CAN_RTR_Data时表示本报文是数据帧;当它的值为宏CAN_RTR_Remote时表示本报文是遥控帧,由于遥控帧没有数据段,所以当报文是遥控帧时,下面的Data[8]成员的内容是无效的。
uint8_t RTR;     

//本成员存储的是数据帧数据段的长度,它的值的范围是0-8,当报文是遥控帧时DLC值为0。
uint8_t DLC;     

//本成员存储的就是数据帧中数据段的数据。
uint8_t Data[8]; 

//本成员只存在于接收结构体,它存储了筛选器的编号,表示本报文是经过哪个筛选器存储进接收FIFO的
uint8_t FMI; 
}CanRxMsg;

(4)CAN过滤器结构体

typedef struct
{
//CAN_FilterIdHigh成员用于存储要筛选的ID,若筛选器工作在32位模式,它存储的是所筛选ID的高16位;若筛选器工作在16位模式,它存储的就是一个完整的要筛选的ID。
uint16_t CAN_FilterIdHigh;

//CAN_FilterIdLow成员也是用于存储要筛选的ID,若筛选器工作在32位模式,它存储的是所筛选ID的低16位;若筛选器工作在16位模式,它存储的就是一个完整的要筛选的ID。
uint16_t CAN_FilterIdLow;         

// CAN_FilterMaskIdHigh存储的内容分两种情况,当筛选器工作在标识符列表模式时,它的功能与CAN_FilterIdHigh相同,都是存储要筛选的ID;而当筛选器工作在掩码模式时,它存储的是CAN_FilterIdHigh成员对应的掩码,与CAN_FilterIdLow组成一组筛选器。
uint16_t CAN_FilterMaskIdHigh;   

//CAN_FilterMaskIdLow存储的内容也分两种情况,当筛选器工作在标识符列表模式时,它的功能与CAN_FilterIdLow相同,都是存储要筛选的ID;而当筛选器工作在掩码模式时,它存储的是CAN_FilterIdLow成员对应的掩码,与CAN_FilterIdLow组成一组筛选器。
uint16_t CAN_FilterMaskIdLow;     

//本成员用于设置当报文通过筛选器的匹配后,该报文会被存储到哪一个接收FIFO,它的可选值为FIFO0或FIFO1(宏CAN_Filter_FIFO0/1)。
uint16_t CAN_FilterFIFOAssignment;
  
//本成员用于设置筛选器的编号,即本过滤器结构体配置的是哪一组筛选器,CAN一共有28个筛选器,所以它的可输入参数范围为0-27。
uint8_t CAN_FilterNumber;        

//本成员用于设置筛选器的尺度,可以设置为32位长及16位长
uint8_t CAN_FilterScale;          

// 本成员用于设置是否激活这个筛选器(宏ENABLE/DISABLE)。
FunctionalState CAN_FilterActivation;
} CAN_FilterInitTypeDef;

九、CAN2.0协议的由来

        CAN是Controller Area Network的缩写,译为控制器局域网,常称作CAN总线,多用于汽车电子和工业控制。CAN协议最早由博世公司提出,后被多个标准化组织进一步细化。目前CAN总线中使用最广泛的正是CAN 2.0 A/B协议,也称作传统CAN(Classic CAN)。其中CAN 2.0A协议仅支持标帧格式,而CAN 2.0B协议支持标准帧格式(Stand Frame,11位标识符)和扩展帧格式(Extend Frame,29位标识符)CAN 2.0B协议的存在只是为了解决标识符不够用的情况,所以CAN 2.0B和CAN 2.0A一样每个数据帧最多传输8个字节的数据。标准帧和扩展帧可以在同一条CAN总线上传输。仅支持CAN 2.0A的设备会丢弃接收到的扩展数据帧/扩展遥控帧,但是不会报错。

  • 27
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值