本文主要介绍CAN总线的软件配置
1. 简介
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_

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

被折叠的 条评论
为什么被折叠?



