基于航顺芯片HK32F103的CAN的驱动应用

航顺芯片HK32F103系列是一款功能强大的32bit MCU,内部集成多个通信模块,其中CAN模块支持CAN协议2.0A和2.0B。目前广泛应用的是CAN 2.0B协议,其收发数据速度高达1Mbps,有两种不同长度的ID标识符,一种是11位的,一种是29位的。该CAN协议的主要特点为:
(1) 多主控制:
在总线空闲时,所有的单元都可开始发送消息。
(2) 消息的发送:
        在 CAN 协议中,所有的消息都以固定的格式发送。总线空闲时,所有与总线相连的单元都可以开始发送新消息。两个以上的单元同时开始发送消息时,根据标识符( Identifier 以下称为 ID)决定优先级。 ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各消息ID的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。即多个单元同时开始发送时,发送高优先级 ID 消息的单元可获得发送权。
(3) 系统的柔软性:
        与总线相连的CAN节点没有类似于“地址”的信息。因此在总线上增加CAN节点时,连接在总线上的其它CAN节点的软硬件及应用层都不需要改变。
(4) 通信速度:
        根据整个网络的规模,可设定适合的通信速度。在同一网络中,所有CAN节点必须设定成统一的通信速度。即使有一个CAN节点的通信速度与其它的不一样,此CAN节点也会输出错误信号,妨碍整个网络的通信。不同网络间则可以有不同的通信速度。
(5) 远程数据请求:
        可通过发送“遥控帧” 请求其他CAN节点发送数据。
(6) 错误检测功能·错误通知功能·错误恢复功能:
        所有的CAN节点都可以检测错误(错误检测功能)。
检测出错误的CAN节点会立即同时通知其他所有CAN节点(错误通知功能)。
正在发送消息的CAN节点一旦检测出错误,会强制结束当前的发送。强制结束发送的CAN
节点会不断反复重新发送此消息直到成功发送为止(错误恢复功能)。
(7) 故障封闭:
        CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的CAN节点从总线上隔离出去。
(8) 位填充: CAN通信的同步信息包含于传输数据中,电平的跳转提供了同步信息,如果连续多个相同的总线值出现,这将影响到同步信息的提取。为此CAN采用位填充规则,即在一帧中的帧起始,仲裁场,控制场,数据场和CRC场部分( CRC界定符,应答帧和帧结束除外),当发送器检测到5个具有相同数值的连续位时,将自动插入一个补码位。接收节点收到5个连续位后下一位自动删除。
(9) 连接:
        CAN 总线是可同时连接多个CAN节点的总线。可连接的节点总数理论上是没有限制的。但实际上可连接的节点数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的CAN节点数增加;提高通信速度,则可连接的CAN节点数减少。如下是CAN通信速度和距离对应图:

基于航顺芯片HK32F103的CAN的驱动应用_第1张图片

(9) CAN总线物理框架可以抽象为:
MCU(微处理器) <--> CAN控制器 <--> CAN收发器 <--> CAN数据传输总线(CAN-H,CAN-L)。如下图示:

基于航顺芯片HK32F103的CAN的驱动应用_第2张图片

CAN总线的数据传输线——>两条双向数据线,分为高位﹝CAN-H﹞和低位﹝CAN-L﹞数据线, 为了防止外界电磁波干扰和向外辐射,两条数据线缠绕在一起,要求至少每 2.5cm 就要扭绞一次,两条线上的电位是相反的,电压的和总等于常值。
CAN总线的终端电阻——>防止数据在到达线路终端后象回声一样返回,并因此而干扰原始数据,从而保证了数据的正确传送,终端电阻装在控制单元内。
CAN总线帧类型:
        数据帧-Data frame
        携带数据从发送节点到接收节点。
        分为标准帧(11位标识符)和扩展帧(29位标识符)。

基于航顺芯片HK32F103的CAN的驱动应用_第3张图片

        远程帧-Remote frame
向其他节点请求发送具有同一标识符的数据帧, 远程帧也有标准帧和扩展帧两种格式。

基于航顺芯片HK32F103的CAN的驱动应用_第4张图片

例如CAN节点A需要知道CAN节点B的油温温度,CAN节点A发送一个远程帧给节点B,节点B收到该远程帧后发送一个带油温数据的数据帧给节点A。

航顺芯片MCU型号,料号选型表HK32F030MF4U6,HK32F030MD4P6,HK32F030MJ4M6,HK32F030MG6U6A,HK32F030MF4U6A,HK32F030MD4P6A,HK32F030MJ4M6A,HK32F0301MF4U6,HK32F0301MD4P6,HK32F0301MJ4M6,HK32F0301MG6U6A,HK32F0301MF4U6A,HK32F0301MD4P6A,HK32F0301MJ4M6A,HK32E032R4T5,HK32F04AR8T6,HK32F04AC8T6,HK32F04AC6T6,HK32F04AC4T6,HK32F04AK8T6,HK32F04AK6T6,HK32F04AK4T6,HK32F04AK8U6,HK32F04AK6U6,HK32F04AK4U6,HK32F04AG8U6,HK32F04AG6U6,HK32F04AG4U6,HK32F04AF8P6,HK32F04AF6P6,HK32F04ARBT6A,HK32F04AR8T6A,HK32F04ACBT6A,HK32F04AC8T6A,HK32F04AC6T6A,HK32F04AC4T6A,HK32F04AKBT6A,HK32F04AK8T6A,HK32F04AK6T6A,HK32F04AK4T6A,HK32F04AKBU6A,HK32F04AK8U6A,HK32F04AK6U6A,HK32F04AK4U6A,HK32F04AGBU6A,HK32F04AG8U6A,HK32F04AG6U6A,HK32F04AG4U6A,HK32F04AFBP6A,HK32F04AF8P6A,HK32F04AF6P6A,HK32F04AF4P6A,HK32ASPIN010RBT6,HK32ASPIN010CBT6,HK32ASPIN010KBT6,HK32ASPIN010KBU6,HK32ASPIN010GBU6,HK32ASPIN010FBP6,HK32ASPIN010RBT6A,HK32ASPIN010CBT6A,HK32ASPIN010KBT6A,HK32ASPIN010KBU6A,HK32ASPIN010GBU6A,HK32ASPIN010FBP6A,HK32ASAFE010RBT6,HK32ASAFE010CBT6,HK32ASAFE010KBT6,HK32ASAFE010KBU6,HK32ASAFE010GBU6,HK32ASAFE010FBP6,HK32U3019VET6,HK32U3019VDT6,HK32U3019VCT6,HK32U3019RET6,HK32U3019RDT6,HK32U3019RCT6,HK32H3009VET6,HK32H3009VDT6,HK32H3009VCT6,HK32H3009RET6,HK32H3009RDT6,HK32H3009RCT6,HK32T088RBT6,HK32T088C8T6,HK32HA030RBT6,HK32HA030C8T6,HK32HP103RET6,HK32HP103RCT6,HK32HP103CET6,

航顺芯片MCU型号选型表,替代ST料号,全兼容HK32F030MF4P6替代STM8S003,HK32F0301MF4P6替代STM8S003,HK32F030MG6T6A 替代STM8S003,

HK32F030MF4P6A 替代STM8S003,HK32F0301MG6T6A替代STM8S003,HK32F0301MF4P6A替代STM8S003,

HK32F030R8T6替代STM32F030R8T6,HK32F030C8T6替代STM32F030C8T6,HK32F030C6T6替代STM32F030C6T6,

HK32F030K6T6替代STM32F030K6T6,HK32F030F4P6替代STM32F030F4P6,HK32F030R8T6A替代STM32F030R8T6,

HK32F030C8T6A替代STM32F030C8T6,HK32F030C6T6A替代STM32F030C6T6,HK32F030K6T6A替代STM32F030K6T6,

HK32F030F4P6A替代STM32F030F4P6,HK32F031C6T6替代STM32F031C6T6,HK32F031C4T6替代STM32F031C4T6,

HK32F031K6T6替代STM32F031K6T6,HK32F031K4T6替代STM32F031K4T6,HK32F031K6U6替代STM32F031K6U6,

HK32F031K4U6替代STM32F031K4U6,HK32F031G6U6替代STM32F031G6U6,HK32F031G4U6替代STM32F031G4U6,

HK32F031F6P6替代STM32F031F6P6,HK32F031F4P6替代STM32F031F4P6,HK32F031C6T6A替代STM32F031C6T6,

HK32F031C4T6A替代STM32F031C4T6,HK32F031K6T6A替代STM32F031K6T6,HK32F031K4T6A替代STM32F031K4T6,

HK32F031K6U6A替代STM32F031K6U6,HK32F031K4U6A替代STM32F031K4U6,HK32F031G6U6A替代STM32F031G6U6,

HK32F031G4U6A替代STM32F031G4U6,HK32F031F6P6A替代STM32F031F6P6,HK32F031F4P6A替代STM32F031F4P6,

HK32F042RBT6替代STM32F042RBT6,HK32F042R8T6替代STM32F042R8T6,HK32F042CBT6替代STM32F042C8T6,

HK32F042C8T6替代STM32F042C8T6,HK32F042CBU6替代STM32F042C8T6,HK32F042C8U6替代STM32F042C8T6,

HK32F051RBT6替代STM32F051RBT6,HK32F051R8T6替代STM32F051R8T6,HK32F051CBT6替代STM32F051C8T6,

HK32F051C8T6替代STM32F051C8T6,HK32F051CBU6替代STM32F051C8T6,HK32F051C8U6替代STM32F051C8T6,

HK32F072RBT6替代STM32F072RBT6,HK32F072R8T6替代STM32F072R8T6,HK32F072CBT6替代STM32F072C8T6,

HK32F072C8T6替代STM32F072C8T6,HK32F072CBU6替代STM32F072C8T6,HK32F072C8U6替代STM32F072C8T6,

HK32F072RBT6A替代STM32F072RBT6,HK32F072R8T6A替代STM32F072R8T6,HK32F072CBT6A替代STM32F072C8T6,

HK32F072C8T6A替代STM32F072C8T6,HK32F072CBU6A替代STM32F072C8T6,HK32F072C8U6A替代STM32F072C8T6,HK32F103RBT6替代STM32F103RBT6,HK32F103R8T6替代STM32F103R8T6,HK32F103CBT6替代STM32F103CBT6,HK32F103C8T6替代STM32F103C8T6,HK32F103VBT6A替代STM32F103VBT6,HK32F103V8T6A替代STM32F103V8T6,

HK32F103RBT6A替代STM32F103RBT6,HK32F103R8T6A替代STM32F103R8T6,HK32F103CBT6A替代STM32F103CBT6,HK32F103C8T6A替代STM32F103C8T6,HK32F103VET6替代STM32F103VET6,HK32F103VDT6替代STM32F103VDT6,

HK32F103VCT6替代STM32F103VCT6HK32F103RET6替代STM32F103RET6,HK32F103RDT6替代STM32F103RDT6,

HK32F103RCT6替代STM32F103RCT6,HK32W030CEU6替代NRF52832,HK32U1009VET6替代HK32F103VET6,

HK32U1009VDT6替代HK32F103VDT6,HK32U1009VCT6替代HK32F103VCT6,HK32U1009RET6替代HK32F103RET6,

HK32U1009RDT6替代HK32F103RDT6,HK32U1009RCT6替代HK32F103RCT6,

错误帧-Error frame
        节点检测到错误之后发送错误帧。
                错误标志: 主动错误标志(000000)和被动错误标志(111111)。
                错误界定符:11111111。

        过载帧-Overload frame
        接收节点通知其尚未做好接收准备, 过载标志(过载标志重叠部分)+过载标志界定符。

       
以下是关于CAN帧/报文中各个部分的说明:
帧起始:SOF
0,占用1位。当总线空闲时发送,用于CAN总线上的每个节点的信息同步。
仲裁段:ID+RTR
                ID:
                        表示数据帧的优先级,先发送高位再发送低位。 11位或29位长度。
                RTR(Remote Transmit Request):
                        0: 表示该CAN帧是数据帧。
                        1: 表示该CAN帧是远程帧。
控制段:IDE+r0+DLC
        IDE(IDentifier Extension):
                0: 标准格式。
                1: 扩展格式。
        保留位r0:
                0。
                保留位r1:
                        0。
                DLC(Data Length Code):
                        表示数据域中的字节数,范围0~8.
数据段:Data
CRC段:CRC Sequence+CRC界定符
        CRC polynomial:
x15+x14+x10+x8+x7+x4+x3+1
        CRC界定符:
                1.
ACK段:ACK Slot+ACK界定符
接收到匹配CRC序列的节点会在应答位期间,写0在发送器的隐性位作为回应。
        ACK界定符:
                1.
帧结束:EOF
        1111111,表示数据帧或远程帧的结束。
SRR(Substitute Remote Request):
        1, 扩展帧中代替RTR位.
CAN总线通信机制报文发送
        -载波侦听和带冲突检测协议的多路访问( CSMA/CD)
-发送节点:回读;
接收节点:监听
-线与机制:
所有节点发送1,总线上才是1;有一个节点发送0,总线上就是0,即高电平是隐性位,低电平是显性位。
-总线仲裁:如果有两个或两个以上的节点同时向总线上发送数据,标识符小的获得仲裁,标识符大的退出仲裁(回读和线与)。
例如:
ID1:00000000010
ID2:00000000001

基于航顺芯片HK32F103的CAN的驱动应用_第5张图片

CAN总线通信机制报文接收

基于航顺芯片HK32F103的CAN的驱动应用_第6张图片

        如果总线上有数据正在发送,所有节点都会接收总线数据,只有通过接收节点的报文过滤规则才能被节点接收进控制器。

基于航顺芯片HK32F103的CAN的驱动应用_第7张图片

       
CAN的错误状态:
主动错误状态:主动错误状态是可以正常参加总线通信的状态。处于主动错误状态的单元检测出错误时,输出主动错误标志。
    被动错误状态: 被动错误状态是易引起错误的状态。 处于被动错误状态的单元检测出错误时,输出被动错误标志。处于被动错误状态的单元即使检测出错误,而其它处于主动错误状态的单元如果没发现错误,整个总线也被认为是没有错误的。
  总线关闭状态:总线关闭态是不能参加总线上通信的状态。信息的接收和发送均被禁止。

基于航顺芯片HK32F103的CAN的驱动应用_第8张图片

错误类型:

基于航顺芯片HK32F103的CAN的驱动应用_第9张图片

现在,我们以航顺芯片的HK32F103VET6(LQFP-100)为例来说明CAN通信的驱动实现。HK32F103VET6是航顺芯片的一款功能强大的32位MCU,内部集成CAN控制器,因此进行CAN通信时,只需要外接一个CAN收发器。
由HK32F103芯片的datasheet,如下截图我们得知,CAN的发送引脚为PA12,接收引脚为PA11。

基于航顺芯片HK32F103的CAN的驱动应用_第10张图片

基于航顺芯片HK32F103的CAN的驱动应用_第11张图片

由HK32F103芯片的用户手册,如下截图,得知需要把CAN的发送引脚PA12设置为推挽复用输出,CAN的接收引脚PA11设置为浮空输入或上拉输入。

基于航顺芯片HK32F103的CAN的驱动应用_第12张图片

详细的GPIO配置,依据该芯片的用户手册的表8-1:

基于航顺芯片HK32F103的CAN的驱动应用_第13张图片

因此,软件中对引脚的设置如下:

基于航顺芯片HK32F103的CAN的驱动应用_第14张图片

这里,我们使用TJA1050作为CAN收发器,原理示意图如下:

基于航顺芯片HK32F103的CAN的驱动应用_第15张图片

将CAN_D连接HK32F103VET6芯片的引脚PA12,CAN_R连接HK32F103VET6芯片的引脚PA11,CANL和CANH接外部CAN总线(即前文提到的CAN-L和CAN-H)。
软件驱动方面,首先应该使能CAN模块的时钟,如下:

基于航顺芯片HK32F103的CAN的驱动应用_第16张图片

HK32F103VET6芯片CAN模块(后续我们简称其为bxCAN)有3个主要的工作模式:初始化、正常和睡眠模式。在硬件复位后,bxCAN 工作在睡眠模式以节省电能,同时 CANTX 引脚的内部上拉电阻被激活。软件通过对 CAN_MCR 寄存器的INRQ或SLEEP 位置’1’,可以请求 bxCAN 进入初始化或睡眠模式。一旦进入了初始化或睡眠模式,bxCAN 就对 CAN_MSR 寄存器的 INAK 或 SLAK 位置’1’来进行确认,同时内部上拉电阻被禁用。当INAK 和 SLAK 位都为’0’时,bxCAN 就处于正常模式。在进入正常模式前,bxCAN 必须跟 CAN 总线取得同步;为取得同步,bxCAN 要等待 CAN 总线达到空闲状态,即在 CANRX 引脚上监测到 11 个连续的隐性位。
因此我们需要把CAN模块设置为初始化模式,如下:

基于航顺芯片HK32F103的CAN的驱动应用_第17张图片

在初始化模式设置成功之后,根据具体应用的要求,设置自动离线(Bus-Off)管理、自动唤醒模式、是否禁止报文自动重传、接收FIFO锁定模式、发送 FIFO 优先级等,如下示例:

基于航顺芯片HK32F103的CAN的驱动应用_第18张图片

基于航顺芯片HK32F103的CAN的驱动应用_第19张图片

CAN通信过程中,很重要的一点是设置通信速率,bxCAN的通信速率设置依据HK32F103VET6用户手册中的:

基于航顺芯片HK32F103的CAN的驱动应用_第20张图片

我们现在要设置500Kbps的通信速度,那么需要设置APB时钟频率为36MHz,还需要设置位BRP=3,TS1=8,TS2=7,如下:

基于航顺芯片HK32F103的CAN的驱动应用_第21张图片

至此,CAN初始化中几个重要特性已经设置好,可以把CAN模块设置位正常模式,以便正常地发送报文。从初始化模式切换为正常模式的设置,如下:

基于航顺芯片HK32F103的CAN的驱动应用_第22张图片

报文的发送,其核心在于正确操作CAN_TIxR、CAN_TDTxR、CAN_TDLxR、CAN_TDHxR寄存器,如下为例,发送标准格式的ID=0x12的8字节长度的CAN数据帧报文。

基于航顺芯片HK32F103的CAN的驱动应用_第23张图片

基于航顺芯片HK32F103的CAN的驱动应用_第24张图片

并通过对应的状态寄存器检查发送成功与否:

基于航顺芯片HK32F103的CAN的驱动应用_第25张图片

某个CAN节点要接收哪些CAN报文,由其CAN接收规则(或者称为接收过滤器)设定。在接收到有效的报文之前,应该先设置好其接收规则。为此,HK32F103VET6的bxCAN 控制器为应用程序提供了 14 个位宽可变的、可配置的过滤器组(13~0),以便只接收那些软件需要的报文。硬件过滤的做法节省了 CPU 开销,否则就必须由软件过滤从而占用很大的 CPU开销。每个过滤器组x由2个32位寄存器,CAN_FiR1和CAN_FiR2【(CAN_FiRx) (i=0..13; x=1..2)】,组成。
每个过滤器组的位宽都可以独立配置,以满足应用程序的不同需求。根据位宽的不同,每个过滤器组可提供:
• 1 个 32 位过滤器,包括:STDID[10:0]、EXTID[17:0]、IDE 和 RTR 位
• 2 个 16 位过滤器,包括:STDID[10:0]、IDE、RTR 和 EXTID[17:15]位
此外过滤器可配置为,屏蔽位模式和标识符列表模式。
在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。
在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用 2 个标识符寄存器。接收报文标识符的每一位都必须跟过滤器标识符相同。
过滤器组可以通过相应的 CAN_FM1R 寄存器配置。在配置一个过滤器组前,必须通过清除 CAN_FAR寄存器的 FACT 位,把它设置为禁用状态。通过设置 CAN_FS1R 的相应 FSCx 位,可以配置一个过滤器组的位宽,请参见下图。通过 CAN_FM1R 的 FBMx 位,可以配置对应的屏蔽/标识符寄存器的标识符列表模式或屏蔽位模式。

基于航顺芯片HK32F103的CAN的驱动应用_第26张图片

我们以常用的一个32位过滤器+标识符屏蔽的方式为例进行说明。

如上图,“映像”行中,RTR对应CAN_FiRx的bit1,IDE对应CAN_FiRx的bit2,EXID对应CAN_FiRx的bit3-bit20,STID对应CAN_FiRx的bit21-bit31。结合前文仲裁段和控制段所述,RTR为0时表示该CAN帧是数据帧,为1时表示该CAN帧是远程帧;IDE为0时表示该CAN帧是标准格式,为1时表示该CAN帧是扩展格式。标准格式下只用到STID位,扩展格式下还会用到EXID位。在32位过滤器+标识符屏蔽的方式应用中,“ID”行中,即CAN_FiR1寄存器用于设置CAN报文的ID、IDE、RTR。“屏蔽”行中,即CAN_FiR2寄存器用于设置接收报文过程中,是否比较ID、IDE、RTR这些对应的各个位,为0时表示“不用关心”,为1时表示“必须匹配”。以RTR为例,当设置CAN_FiR2的RTR为1“必须匹配”,且CAN_FiR1时RTR为0时,表示只接收数据帧,不接收远程帧;而当设置CAN_FiR2的RTR为0时“不用关心”,表示无论是数据帧还是远程帧,都会进行接收。
下面,我们开始说明过滤器的具体设置。
首先应该设置过滤器组工作在初始化模式并暂时禁用过滤器,如下:

基于航顺芯片HK32F103的CAN的驱动应用_第27张图片

接着设置过滤器的位宽是单个32位,及工作在标识符屏蔽位模式下,如下:

基于航顺芯片HK32F103的CAN的驱动应用_第28张图片

假设我们现在只需要接收两条CAN标准数据帧,且其ID分别为00000000000和00000000001,那么应该设置IDE为0,RTR为0,CAN_FiR1为0,CAN_FiR2为0xFFC00006,如下:

基于航顺芯片HK32F103的CAN的驱动应用_第29张图片

接着设置接收到的报文存放于哪个FIFO,这里我们存放到FIFO 0,如下:

基于航顺芯片HK32F103的CAN的驱动应用_第30张图片

最后重新激活过滤器和设置过滤器工作在正常模式:

基于航顺芯片HK32F103的CAN的驱动应用_第31张图片

你可能感兴趣的:(网络)