【GD32篇】CAN总线入门教程——实现数据收发

本文详细介绍了CAN总线在GD32F103VET6微控制器上的配置和使用,包括CAN初始化参数、过滤器设置、发送和接收报文的结构体,以及如何通过CAN过滤器筛选特定ID的数据。文中还提供了CAN驱动代码示例,展示了如何实现波特率配置、中断服务函数以及发送和接收CAN报文的功能。
该文章已生成可运行项目,

本文主要介绍CAN总线的软件配置

1. 简介

        CAN 总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以 CAN 为底层协议专为大型货车和重工机械车辆设计的 J1939 协议。近年来,它具有的高可靠性和良好的错误检测能力受到重视,被广泛应用于汽车计算机控制系统和环境温度恶劣、电磁辐射强及振动大的工业环境。
        
        CAN 总线控制器作为 CAN 网络接口,遵循 CAN 总线协议 2.0A 2.0B CAN 总线控制器 可以处理总线上的数据收发,非 GD32130x CL 系列产品中,具有 14 个过滤器,在 GD32F10xCL 系列产品中, CAN 具有 28 个过滤器,过滤器用于筛选并接收用户需要的消息。用户可以通过 3 个发送邮箱将待发送数据传输至总线,邮箱发送的顺序由发送调度器决定。并通过 2 个深度为 3 的接收 FIFO 获取总线上的数据,接收 FIFO 的管理完全由硬件控制。同时 CAN 总线控制器硬件支持时间触发通信(Time-trigger communication )功能。

2.GD32的CAN外设介绍

MCU:GD32F103VET6

2.1 CAN初始化结构体

API:ErrStatus can_init(uint32_t can_periph, can_parameter_struct* can_parameter_init)

can_periph:CANx(x=0,1), CAN1 仅适用于 GD32F10x_CL

can_parameter_struct:初始化结构体

ErrStatus: SUCCESS or ERROR

/* CAN initiliaze parameters structure */
typedef struct
{
    uint8_t working_mode;                         /*!< 配置CAN的工作模式 */ 
    uint8_t resync_jump_width;                    /*!< 重新同步跳跃宽度 */
    uint8_t time_segment_1;                       /*!< 配置 BS1 段长度 */
    uint8_t time_segment_2;                       /*!< 配置 BS2 段长度 */
    ControlStatus time_triggered;                 /*!< 时间触发通信方式 */
    ControlStatus auto_bus_off_recovery;          /*!< 自动离线管理 */
    ControlStatus auto_wake_up;                   /*!< 自动唤醒功能 */
    ControlStatus auto_retrans;                   /*!< 自动重传模式 */
    ControlStatus rec_fifo_overwrite;             /*!< 配置接收 FIFO 锁定 */
    ControlStatus trans_fifo_order;               /*!< 配置 FIFO 优先级 */
    uint16_t prescaler;                           /*!< 配置CAN外设的时钟频率 */
}can_parameter_struct;

(1)working_mode

        设置CAN的工作模式,可设置为正常通信模式(CAN_NORMAL_MODE),回环通信模式(CAN_LOOPBACK_MODE),静默通信模式(CAN_SILENT_MODE)以及回环静默通信模式(CAN_SILENT_LOOPBACK_MODE)。

         CAN 总线控制器通常工作在正常通信模式下,可以从 CAN 总线接收数据,也可以向 CAN 总线发送数据。(详情请查看GD32F10x用户手册) 

(2)resync_jump_width

        设置CAN的再同步补偿宽度SJW,对CAN网络节点同步误差进行补偿占1~4个时间单元。(CAN_BT_SJW_1/2/3/4TQ)

(3)time_segment_1

        设置CAN位时序中BS1段长度,可以配置为1~16个时间单元。(CAN_BT_BS1_1~16TQ)

(4)time_segment_2

        设置CAN位时序中BS2段长度,可以配置为1~8个时间单元。(CAN_BT_BS2_1~8TQ)

(5)time_triggered

        用于配置是否使用时间触发功能(ENABLE / DISABLE)。在这种通信模式下,自动重发功能是禁止的。

(6)auto_bus_off_recovery

        用于配置是否使用自动离线管理功能(ENABLE / DISABLE),使用自动离线管理可以在节点出错离线后适应自动恢复,不需要软件干预。

(7)auto_wake_up

        用于配置是否使用自动唤醒功能(ENABLE / DISABLE),使用自动唤醒功能后会在检测到总线活动后自动唤醒。

(8)auto_retrans

        用于配置是否使用自动重传功能(ENABLE / DISABLE),使用自动重传功能时,会一直发送报文直到成功为止,否则只会发送一次报文。

(9)rec_fifo_overwrite

        用于配置是否使用接收FIFO锁定功能(ENABLE / DISABLE),锁定接收FIFO后,FIFO溢出时会丢弃新数据,否则在FIFO溢出时新数据覆盖旧数据。

(10)trans_fifo_order

        用于设置是否使用发送报文的优先级判定方法(ENABLE / DISABLE),使能后,以报文存入FIFO的先后顺序来发送,否则按照报文ID的优先级来发送。

(11)prescaler

        设置CAN外设的时钟分频,写入的值即为分频值。可控制时间片的时间长度。

波特率计算:

快速计算:BaudRate = APB1_LCK / ( 1 + time_segment_1 +time_segment_2 ) / prescaler

例:APB1总线时钟频率为54MHZ,BS1=5,BS2=3,prescaler=12,实际波特率为500Kbps。

2.2 CAN过滤器结构体

API:void can_filter_init(can_filter_parameter_struct* can_filter_parameter_init)

can_filter_parameter_struct:过滤器结构体

/* CAN filter parameters structure */
typedef struct
{
    uint16_t filter_list_high;                 /*!< 过滤器列表高位数 */
    uint16_t filter_list_low;                  /*!< 过滤器列表低位数 */
    uint16_t filter_mask_high;                 /*!< 滤波掩码数高位数 */
    uint16_t filter_mask_
本文章已经生成可运行项目
评论 30
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值