硬汉嵌入式论坛

 找回密码
 立即注册
查看: 855|回复: 7
收起左侧

[CAN/FDCAN] STM32H743 FDCAN

[复制链接]

3

主题

18

回帖

27

积分

新手上路

积分
27
发表于 2024-9-18 16:43:41 | 显示全部楼层 |阅读模式
本帖最后由 被arm摧残者 于 2024-9-18 16:46 编辑

回环模式 接收不到数据 麻烦大佬们看看是不是中断以及初始化配置出错

void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
{
                if (hfdcan == &hfdcan1)
                        {               
                                if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != RESET)
                                {
                                        /* 从 RX FIFO0 读取数据 */
                                        HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &hfdcan1_rx, RXBUF);
                                        /* 激活 Rx FIFO0 watermark notification */
                                        HAL_FDCAN_ActivateNotification(hfdcan, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0);
                                }
                        }
}

  hfdcan1.Instance = FDCAN1;
  hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
  hfdcan1.Init.Mode = FDCAN_MODE_INTERNAL_LOOPBACK;
  hfdcan1.Init.AutoRetransmission = ENABLE;
  hfdcan1.Init.TransmitPause = DISABLE;
  hfdcan1.Init.ProtocolException = ENABLE;
  hfdcan1.Init.NominalPrescaler = 11;
  hfdcan1.Init.NominalSyncJumpWidth = 1;
  hfdcan1.Init.NominalTimeSeg1 = 4;
  hfdcan1.Init.NominalTimeSeg2 = 5;
  hfdcan1.Init.DataPrescaler = 11;
  hfdcan1.Init.DataSyncJumpWidth = 1;
  hfdcan1.Init.DataTimeSeg1 = 4;
  hfdcan1.Init.DataTimeSeg2 = 5;
  hfdcan1.Init.MessageRAMOffset = 0;
  hfdcan1.Init.StdFiltersNbr = 1;
  hfdcan1.Init.ExtFiltersNbr = 0;
  hfdcan1.Init.RxFifo0ElmtsNbr = 1;
  hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
  hfdcan1.Init.RxFifo1ElmtsNbr = 0;
  hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;
  hfdcan1.Init.RxBuffersNbr = 0;
  hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_8;
  hfdcan1.Init.TxEventsNbr = 0;
  hfdcan1.Init.TxBuffersNbr = 0;
  hfdcan1.Init.TxFifoQueueElmtsNbr = 1;
  hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
  hfdcan1.Init.TxElmtSize = FDCAN_DATA_BYTES_8;
  if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN FDCAN1_Init 2 */
//        /* 设置 Rx FIFO0 的 wartermark 为 0 */
//        HAL_FDCAN_ConfigFifoWatermark(&hfdcan1, FDCAN_CFG_RX_FIFO0, 0);

        /* 激活 RX FIFO0 的 watermark 通知中断,位开启 Tx Buffer 中断*/
        HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0);


        HAL_FDCAN_Start(&hfdcan1);








回复

使用道具 举报

22

主题

183

回帖

249

积分

高级会员

积分
249
QQ
发表于 2024-9-18 20:33:10 | 显示全部楼层
我是用的那个啥水印中断接收的,我之前用 NEW_MESSAGE 似乎也无法接收

配置的这里。
/        /* 设置 Rx FIFO0 的 wartermark 为 0 */
//        HAL_FDCAN_ConfigFifoWatermark(&hfdcan1, FDCAN_CFG_RX_FIFO0, 0);

        /* 激活 RX FIFO0 的 watermark 通知中断,位开启 Tx Buffer 中断*/
        HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0);
我是这样写的
[C] 纯文本查看 复制代码
    HAL_FDCAN_ConfigFifoWatermark(tCanfd1.CanfdConfig.Canfd, FDCAN_CFG_RX_FIFO0, 1);           // 设置Rx FIFO0的watermark为1,有消息立即通知
    HAL_FDCAN_ActivateNotification(tCanfd1.CanfdConfig.Canfd, FDCAN_IT_RX_FIFO0_WATERMARK, 0); // 激活RX FIFO0的watermark通知中断,位开启Tx Buffer中断


中断的这里。
          if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != RESET)
我是这样写的
[C] 纯文本查看 复制代码
if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_WATERMARK) != RESET)

回复

使用道具 举报

3

主题

18

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2024-9-18 23:45:41 | 显示全部楼层
yono 发表于 2024-9-18 20:33
我是用的那个啥水印中断接收的,我之前用 NEW_MESSAGE 似乎也无法接收

配置的这里。

我修改后还是无法接受,CAN通讯中断接收到的数据是存到设定的数组里面的吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-9-19 09:40:59 | 显示全部楼层
被arm摧残者 发表于 2024-9-18 23:45
我修改后还是无法接受,CAN通讯中断接收到的数据是存到设定的数组里面的吗?

你的发送函数怎么写的
回复

使用道具 举报

3

主题

18

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2024-9-19 09:46:27 | 显示全部楼层
eric2013 发表于 2024-9-19 09:40
你的发送函数怎么写的

void         can1_SendPacket(uint8_t *_DataBuf,uint8_t _Len)
{
       
        /*下面开始配置CAN发送结构体*/
        hfdcan1_tx.IdType = FDCAN_STANDARD_ID;
        hfdcan1_tx.Identifier = 0x123;
        hfdcan1_tx.FDFormat = FDCAN_CLASSIC_CAN;//设置为经典CAN模式
        hfdcan1_tx.DataLength = (uint32_t) _Len<<16;
        hfdcan1_tx.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
        hfdcan1_tx.BitRateSwitch = FDCAN_BRS_OFF;//波特率不可变
        hfdcan1_tx.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
        hfdcan1_tx.TxFrameType = FDCAN_DATA_FRAME;//数据帧
        hfdcan1_tx.MessageMarker = 0;
       
        /* 添加数据到 TX FIFO */
        HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &hfdcan1_tx, _DataBuf);
       
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-9-20 08:39:56 | 显示全部楼层
被arm摧残者 发表于 2024-9-19 09:46
void         can1_SendPacket(uint8_t *_DataBuf,uint8_t _Len)
{
        

这个部分看着没问题,发个CAN这部分的完整配置看下。
回复

使用道具 举报

3

主题

18

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2024-9-20 09:43:03 | 显示全部楼层
eric2013 发表于 2024-9-20 08:39
这个部分看着没问题,发个CAN这部分的完整配置看下。

我用您的例程已经解决了这个问题了,还有一个问题,FIFO的watermask 设置1是指接收到1个字节吗?我发送了8个字节的数据,为什么只有设置成1和2的时候才能触发中断,设置更高的阈值就不能触发中断
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-9-21 09:29:17 | 显示全部楼层
被arm摧残者 发表于 2024-9-20 09:43
我用您的例程已经解决了这个问题了,还有一个问题,FIFO的watermask 设置1是指接收到1个字节吗?我发送了 ...

是一帧,填充够指定帧数才会触发
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-29 02:24 , Processed in 0.288477 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表