HC32 CAN通信

本文详细介绍了HC32CAN通信的HCCAN结构与STM32的差异,强调了波特率设定中时间片段的特殊性以及筛选器配置的注意事项。在设置CAN波特率时,需注意HC的非标准时间片段参数,并遵循手册要求。筛选器部分,HC的筛选器模式与ST32有所不同,特别是掩码模式的对比逻辑。此外,还提到了CAN发送过程中可能出现的发送错误和数据丢失问题,以及可能的解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HC CAN简介和ST对比

  • HC CAN
    在这里插入图片描述
    手册里面明确写出有两种不同类型的缓冲器,PTB 优先于STB。这点和ST的不一样。
    HC的结构图
    在这里插入图片描述

  • ST
    ST CAN结构借用一下野火的图展示一下
    在这里插入图片描述
    STM32 的有两组 CAN 控制器,其中 CAN1 是主设备,框图中的“存储访问控制器”是由 CAN1 控制的, CAN2 无法直接访问存储区域,所以使用 CAN2 的时候必须使能CAN1 外设的时钟。

波特率设定

CAN 通信使用时钟 can_clk 的时钟源为外部高速振荡器, 使用 CAN 模块之前,需要设定 CAN 通信时钟。下图给出 CAN 位时间定义图,虚线上部分为 CAN 协议规定的位时间, 虚线下部分为本 CAN 控制器 CAN-CTRL 定义的位时间。 其中 segment1 和 segment2 可以通过寄存器 SBT 设定。 SBT 寄存器只能在 CAN_CFG_STAT.RESET=1 即 CAN 软件复位时设定。
在这里插入图片描述
注意:HC的CAN的时间片段并不是按照标准的CAN协议制定的。只有seg1和Seg2 两个参数,这个和ST的有不一样。在设置HCseg1 和seg2 的时候还需要满足手册上时间价格的要求,具体如下:
在这里插入图片描述

筛选器

CAN_CTRL 提供 16 组 32 位筛选器用于过滤接收到的数据从而降低 CPU 负荷, 筛选器可以支持标准格式 11 位 ID 或者扩展格式 29 位 ID。每组筛选器有一个 32 位 ID CODE 寄存器和一个 32 位 ID MASK 寄存器, ID CODE 寄存器用于比较接收到 CAN ID, 而 ID MASK 寄存器用于选择比较的 CAN ID 位。 对应的 ID MASK 位为 1 时,不比较该位的 ID CODE

注意: HC的 CODE模式和ST32的基本上一直表示 只有CAN ID和code寄存器里面的一样才会被接收。MASK模式也和ST32的掩码模式类似,进行过滤筛选,值得注意的是ST32的掩码模式相应的位置被设置为1后,进行掩码为的对比,只要掩码(关键字)相同,就符合要求,报文就会被保存到接收 FIFO。 但是HC的掩码模式是相应的掩码位设置为1后,是不对比CAN ID对应的改位的,反而设置为0后才需要和ID进行匹配。即 ST掩码模式设置1的是需要比对的ID位,而HC设置为1的是需要忽略的位。

需要注意的坑

  • CAN 的一些设置完全可以参照dll库中提供的配置方式进行为微调。值得注意的是CAN的中断模式是全部打开的,在设计的时候需要先将所有的全部失能,然后再根据自己的需求进行配置。
 CAN_IntCmd(TYPE_CANX, CAN_INT_ALL, Disable);
 CAN_IntCmd(TYPE_CANX, CAN_INT_RX | CAN_INT_ERR_INT 
                     |XXXXX| XXXXX | XXXXXX,
                    Enable);
  • stc_can_tx_t结构体
typedef struct
{
   
    uint32_t u32ID;                         /*!< 11 bits standard ID or 29 bits extended ID, depending on IDE. */
    union
    {
   
        uint32_t u32Ctrl;
        struct
        {
   
            uint32_t DLC: 4;                /*!< Data length code. Length of the data segment of data frame. \
                                                 It should be zero while the frame is remote frame. \
                                                 This parameter can be a value of @ref CAN_DLC */
            uint32_t BRS: 1;                /*!< Bit rate switch. */
            uint32_t FDF: 1;                /*!< CAN FD frame. */
            uint32_t RTR: 1;                /*!< Remote transmission request bit.
                                                 It is used to distinguish between data frames and remote frames. */
            uint32_t IDE: 1;                /*!< Identifier extension flag.
                                                 It is used to distinguish between standard format and extended format.
                                                 This parameter can be a 1 or 0. */
            uint32_t RSVD: 24;              /*!< Re
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值