STM32(H7)学习记录-3 CANFD

所使用的主控芯片是STM32H743IIT6,所使用的CAN芯片是 TJA1043。

最近在配置完成 CANFD的程序。跑起来发现能接收到ID,但不能接收到数据长度以及数据。

最后发现 也许是 HAL更新了 ,库函数 有些不一样

安富莱 H7 BSP 双CANFD例程中的 hal库 FDCAN_CopyMessageToRAM如下

最近用STM32CUBEMX(6.10.0)配置的CANFD中 hal库函数如下

可以看到最新的hal库底层已经对数据长度做了 <<16 ,我们在发送函数中上就不用 <<16。

其实,应该使用HAL库自带的 参数 这样就可以避免这个问题了,而不是自己 手打一个数字。

下图是 我用CUBEMX配置的CANFD例程中的 数据长度 宏定义

话说 TJA1043 数据手册上标明了 最大5Mbps,但实际测试只有3Mbps多一些,也许是电路问题,传输速度与数据手册差的还是有点大。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
GD32H7是一款基于ARM Cortex-M4内核的微控制器,它支持CAN总线通信。下面是GD32H7 CAN配置的步骤: 1. 配置GPIO引脚,将CAN总线的RX和TX引脚连接到MCU的GPIO引脚上。 2. 配置CAN总线的时钟源,可以选择内部RC振荡器或外部晶振。如果选择外部晶振,需要根据实际情况调整HSE_STARTUP_TIMEOUT的值。 3. 配置CAN总线的工作模式,包括CAN总线的工作模式、波特率、传输模式等。 4. 配置CAN总线的过滤器,可以设置过滤器来过滤不需要的CAN帧。 5. 初始化CAN总线,并启动CAN总线。 下面是一个简单的GD32H7 CAN配置的代码示例: ```c // 配置GPIO引脚 gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8 | GPIO_PIN_9); // 配置CAN总线的时钟源 rcu_periph_clock_enable(RCU_CAN0); can_deinit(CAN0); can_struct_para_init(&can_init_struct); can_init_struct.time_triggered_mode = DISABLE; can_init_struct.auto_bus_off_recovery = ENABLE; can_init_struct.auto_wake_up = DISABLE; can_init_struct.auto_retrans = ENABLE; can_init_struct.receive_fifo_locked = DISABLE; can_init_struct.transmit_fifo_priority = DISABLE; can_init_struct.working_mode = CAN_NORMAL_MODE; can_init_struct.resync_jump_width = CAN_BT_SJW_1TQ; can_init_struct.time_segment_1 = CAN_BT_BS1_11TQ; can_init_struct.time_segment_2 = CAN_BT_BS2_4TQ; can_init_struct.prescaler = 3; can_init(CAN0, &can_init_struct); // 配置CAN总线的过滤器 can_filter_struct_para_init(&can_filter_init_struct); can_filter_init_struct.filter_number = 0; can_filter_init_struct.filter_mode = CAN_FILTERMODE_IDMASK; can_filter_init_struct.filter_scale = CAN_FILTERSCALE_32BIT; can_filter_init_struct.filter_id_high = 0x0000; can_filter_init_struct.filter_id_low = 0x0000; can_filter_init_struct.filter_mask_id_high = 0x0000; can_filter_init_struct.filter_mask_id_low = 0x0000; can_filter_init_struct.filter_fifo_number = CAN_FIFO0; can_filter_init_struct.filter_enable = ENABLE; can_filter_init(CAN0, &can_filter_init_struct); // 初始化CAN总线,并启动CAN总线 can_enable(CAN0); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值