canfd收不到数据_STM32G474之双FDCAN收发(已验证)

本文介绍了在STM32G474RET6上使用CANFD进行通信的配置与实现,通过USART1验证收发数据。针对遇到的收不到数据问题,分析了可能的原因,包括CAN收发器供电、FDCAN初始化设置等,并提供了相应的解决方案。同时,给出了实物连接示意和源码下载链接。
摘要由CSDN通过智能技术生成

一、前言

STM32G474RET6,CANFD配置,报文64字节,波特率2M,FDCAN1发送FDCAN2接收,通过USART1打印收发报文进行验证,其中CAN收发芯片为ISO1042。

一、STM32CubeMX配置

1.配置RCC

66b68786b624766e9269d879bf2a84b9.png

2.配置SYS

a49129595f0cc51bc75b1050e124b623.png

3.配置FDCAN(FDCAN2和FDCAN1相同)

589d116fa1b73fdd1fe863bc77c5a1bb.png

3bc6790e147e0a2fe9c44af10295beae.png

4.配置USART1

d9664ce8eebc9b94273fe18c1fdfdb8e.png

二、代码编写

1.FDCAN1发送

f6c48bc0c19430bc64e41fda18ae72f7.png

2.FDCAN2接收

fde4c8e2b4c67dae99ec34aa45036535.png

3.FDCAN2发送

caf3bc7a8a421a8a522ede86e4c2533c.png

4.FDCAN1接收

250bb5c4955a6332591c175fa594e4a2.png

三、测试验证

9ffe61eb38efc6ef02d3ed32aabef9e6.png

四、实物连接示意

0497cb11644f738a51ec18f3b8859bb8.png

五、注意事项

1.CAN收发器 ISO1042 CAN_H/CAN_L端供电5V,TX/RX端供地(T接T R接R)

2.如果是以下配置,只发送3次,且CAN盒端接收数据无

hfdcan1.Init.AutoRetransmission = ENABLE;

hfdcan1.Init.TransmitPause = DISABLE;

hfdcan1.Init.ProtocolException = DISABLE;

3.如果是以下配置,收发芯片CAN_H/CAN_L端供电不足5V,只发18次,且CAN盒端接收数据无

hfdcan1.Init.AutoRetransmission = DISABLE;

hfdcan1.Init.TransmitPause = DISABLE;

hfdcan1.Init.ProtocolException = ENABLE;

六、源码链接

https://download.csdn.net/download/qq_41701596/12836806

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 FDCAN 中断接收代码示例,可以在 STM32G474 上使用: ``` #include "stm32g4xx.h" // 定义 FDCAN 消息结构体 typedef struct { uint32_t id; uint8_t data[8]; uint8_t len; } fdcan_msg_t; // 定义 FDCAN 接收缓冲区 volatile fdcan_msg_t fdcan_rx_buffer; // FDCAN 中断处理函数 void FDCAN1_IT0_IRQHandler(void) { // 如果是接收中断 if (FDCAN1->IR & FDCAN_IR_RF0N) { // 清除中断标志位 FDCAN1->IR = FDCAN_IR_RF0N; // 读取接收缓冲区 fdcan_rx_buffer.id = FDCAN1->RXF0S->R0[0].RXID; fdcan_rx_buffer.len = FDCAN1->RXF0S->R0[0].RDL; for (int i = 0; i < fdcan_rx_buffer.len; i++) { fdcan_rx_buffer.data[i] = FDCAN1->RXF0S->R0[0].RXD[i]; } } } int main(void) { // 初始化 FDCAN RCC->APB1LENR |= RCC_APB1LENR_FDCANEN; FDCAN1->CCCR |= FDCAN_CCCR_INIT; while ((FDCAN1->CCCR & FDCAN_CCCR_INIT) == 0); FDCAN1->NBTP = 0x00012B03; // 波特率 500 kbps FDCAN1->DBTP = 0x00000A0D; FDCAN1->TEST = FDCAN_TEST_LBCK; // 进入回环测试模式 FDCAN1->CCCR &= ~FDCAN_CCCR_INIT; // 配置 FDCAN 中断 NVIC_EnableIRQ(FDCAN1_IT0_IRQn); FDCAN1->IE |= FDCAN_IE_RF0NE; while (1) { // 发送 FDCAN 消息 fdcan_msg_t tx_msg = {0x123, {0x11, 0x22, 0x33}, 3}; FDCAN1->TXBto[0]->T0.DATA[0] = tx_msg.id; FDCAN1->TXBto[0]->T0.DATA[1] = (tx_msg.len << 16) | FDCAN_TDT0R_TGT; for (int i = 0; i < tx_msg.len; i++) { FDCAN1->TXBto[0]->T0.DATA[2 + i] = tx_msg.data[i]; } FDCAN1->TXBto[0]->T0.CTR |= FDCAN_TDCR_TGT; } } ``` 这个示例中,我们使用了 FDCAN1 的 RX FIFO 0,当 FDCAN 接收到消息时,会触发 FDCAN1_IT0_IRQHandler 中断处理函数。在中断处理函数中,我们从 RX FIFO 0 中读取消息,并将其存储在 fdcan_rx_buffer 中。在主函数中,我们发送一个 FDCAN 消息,然后进入一个无限循环。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值