STM32
直播中

kasdlak

8年用户 1228经验值
擅长:光电显示
私信 关注
[问答]

STM32H753的FDCAN发送总是the Tx FIFO/Queue is full,为什么?

FDCAN1_Handler.Instance = FDCAN1;
FDCAN1_Handler.Init.FrameFormat         = FDCAN_FRAME_CLASSIC;  //传统模式
FDCAN1_Handler.Init.Mode                = FDCAN_MODE_NORMAL;    //正常模式
FDCAN1_Handler.Init.AutoRetransmission  = DISABLE;              //关闭自动重传!
FDCAN1_Handler.Init.TransmitPause       = DISABLE;              //关闭传输暂停
FDCAN1_Handler.Init.ProtocolException   = DISABLE;              //关闭协议异常处理
FDCAN1_Handler.Init.NominalPrescaler    = 0x01;     //分频系数FDCAN1_Handler.Init.MessageRAMOffset    = 0;                    //信息 RAM 偏移
FDCAN1_Handler.Init.StdFiltersNbr       = 1;                    //标准信息 ID 滤波器编号
FDCAN1_Handler.Init.ExtFiltersNbr       = 2;                    //扩展信息 ID 滤波器编号
FDCAN1_Handler.Init.RxFifo0ElmtsNbr     = 1;                   //接收 FIFO0 元素编号
FDCAN1_Handler.Init.RxFifo0ElmtSize     = FDCAN_DATA_BYTES_8;   //接收 FIFO0 8 字节
FDCAN1_Handler.Init.RxBuffersNbr        = 0;                   //接收缓冲编号

    FDCAN1_Handler.Init.TxEventsNbr         = 0;                    //发送事件编号
    FDCAN1_Handler.Init.TxBuffersNbr        = 1;                   //发送缓冲编号
    FDCAN1_Handler.Init.TxFifoQueueElmtsNbr = 0;                    //发送 FIFO 序列元素编号
    FDCAN1_Handler.Init.TxFifoQueueMode     = FDCAN_TX_FIFO_OPERATION;
    FDCAN1_Handler.Init.TxElmtSize          = FDCAN_DATA_BYTES_8;   //发送大小:8 字节
  
    if(HAL_FDCAN_Init( FDCAN1_Handler) != HAL_OK)                   //初始化 FDCAN  
    {
        while(1);
    }
   
    //设置滤波器
    FDCAN1_RXFilter.IdType      = FDCAN_EXTENDED_ID;        //扩展 ID
    FDCAN1_RXFilter.FilterIndex = 0;                        //滤波器索引
    FDCAN1_RXFilter.FilterType  = FDCAN_FILTER_MASK;        //滤波器类型
    FDCAN1_RXFilter.FilterConfig= FDCAN_FILTER_TO_RXFIFO0;  //过滤器 0 关联到 FIFO0
    FDCAN1_RXFilter.FilterID1   = 0x0000;                   //32 位 ID
    FDCAN1_RXFilter.FilterID2   = 0x0000;                   //传统模式的话,这里是 32 位掩码
    HAL_FDCAN_ConfigFilter( FDCAN1_Handler, FDCAN1_RXFilter); //滤波器初始化
  
    //HAL_FDCAN_ActivateNotification( FDCAN1_Handler,FDCAN_IT_RX_FIFO0_NEW_MESSAGE,0);  
    HAL_FDCAN_Start( FDCAN1_Handler);                       //开启 FDCAN

回帖(1)

张秀兰

2024-3-28 17:13:02
1. 发送队列已满:检查发送队列是否已满。如果发送队列已满,需要等待一段时间,直到有空闲位置。

2. 发送超时:如果禁用了自动重传功能,可以尝试增加发送超时时间。通过调整FDCAN1_Handler.Init.MessageRAMConfig区域的相应参数来实现。

3. 配置错误:检查FDCAN的配置参数是否正确设置。确保FDCAN1_Handler.Init.FrameFormat,FDCAN1_Handler.Init.Mode和FDCAN1_Handler.Init.AutoRetransmission等参数正确设置。

4. 中断优先级问题:确保FDCAN的中断优先级正确设置。如果FDCAN的中断优先级设置过低,可能导致发送中断无法及时处理。

通过检查这些可能的原因,您可以解决FDCAN发送总是Tx FIFO/Queue is full的问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分