硬汉嵌入式论坛

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

[CAN/FDCAN] fdcan 自測模式沒有發生接收

[复制链接]

13

主题

34

回帖

73

积分

初级会员

积分
73
发表于 2024-5-16 17:21:21 | 显示全部楼层 |阅读模式
測試FDCAN_MODE_EXTERNAL_LOOPBACK, 邏輯分析接tx確定有發出去

但沒有發生接收
去接收函式查, 發現錯誤在HAL_FDCAN_ERROR_FIFO_EMPTY, 表示沒資料進去rx緩衝區嘛?

HAL_StatusTypeDef HAL_FDCAN_GetRxMessage(FDCAN_HandleTypeDef *hfdcan, uint32_t RxLocation,  FDCAN_RxHeaderTypeDef *pRxHeader, uint8_t *pRxData)

{

      /* Check that the Rx FIFO 0 is not empty */
      if ((hfdcan->Instance->RXF0S & FDCAN_RXF0S_F0FL) == 0U)
      {
        /* Update error code */
        hfdcan->ErrorCode |= HAL_FDCAN_ERROR_FIFO_EMPTY;
        return HAL_ERROR;
      }

}
初始及濾波器相關設定

        hfdcan1.Instance = FDCAN1;
        hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1;
        hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
        hfdcan1.Init.Mode = FDCAN_MODE_EXTERNAL_LOOPBACK;//FDCAN_MODE_NORMAL;FDCAN_MODE_EXTERNAL_LOOPBACK
        hfdcan1.Init.AutoRetransmission = DISABLE;
        hfdcan1.Init.TransmitPause = DISABLE;
        hfdcan1.Init.ProtocolException = DISABLE;
        //baud rate pclk1(apb11)/Prescale/(1+TimeSeg1+TimeSeg2)= 170M/17/(1+14+5)=0.5Mbit/s
        //(1+TimeSeg1)/(1+TimeSeg1+TimeSeg2)= (1+14)/(1+14+5) =75%
        //baud rate pclk1(apb11)/Prescale/(1+TimeSeg1+TimeSeg2)= 170M/17/(1+7+2)=1.0Mbit/s
        //(1+TimeSeg1)/(1+TimeSeg1+TimeSeg2)= (1+7)/(1+7+2) =80%
        //baud rate pclk1(apb11)/Prescale/(1+TimeSeg1+TimeSeg2)= 170M/17/(1+34+15)=0.2Mbit/s
        //(1+TimeSeg1)/(1+TimeSeg1+TimeSeg2)= (1+34)/(1+34+15) =70%
        hfdcan1.Init.NominalPrescaler = 17;
        hfdcan1.Init.NominalSyncJumpWidth = 15;
        hfdcan1.Init.NominalTimeSeg1 = 34;
        hfdcan1.Init.NominalTimeSeg2 = 15;
        hfdcan1.Init.DataPrescaler = 1;
        hfdcan1.Init.DataSyncJumpWidth = 1;
        hfdcan1.Init.DataTimeSeg1 = 1;
        hfdcan1.Init.DataTimeSeg2 = 1;
        hfdcan1.Init.StdFiltersNbr = 2;
        hfdcan1.Init.ExtFiltersNbr = 2;
        hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
        if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK) {
                Error_Handler();
        }


        hfdcan1_RX_Filter.IdType = FDCAN_STANDARD_ID;// FDCAN_EXTENDED_ID
        hfdcan1_RX_Filter.FilterIndex = 0; /* 濾波器器索引 */
        hfdcan1_RX_Filter.FilterType = FDCAN_FILTER_MASK;/* 濾波器類型 */
        hfdcan1_RX_Filter.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;/* 濾波器連到RXFIFO0 */
        hfdcan1_RX_Filter.FilterID1 = 0x001;
        hfdcan1_RX_Filter.FilterID2 = 0x7FF;
        if (HAL_FDCAN_ConfigFilter(&hfdcan1, &hfdcan1_RX_Filter) != HAL_OK) {
                /* Filter configuration Error */
                Error_Handler();
        }
        /* Configure global filter:
         Filter all remote frames with STD and EXT ID
         Reject non matching frames with STD ID and EXT ID */
        if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK) {
                Error_Handler();
        }

             if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)
        {
                Error_Handler();
        }
我任意做的tx封包及接收程式

                        hfdcan1_TxHeader.Identifier = 0x001;
                        hfdcan1_TxHeader.IdType = FDCAN_STANDARD_ID;        //FDCAN_STANDARD_ID;//FDCAN_EXTENDED_ID;
                        hfdcan1_TxHeader.TxFrameType = FDCAN_DATA_FRAME;        //FDCAN_REMOTE_FRAME:遙控幀, FDCAN_DATA_FRAME:數據幀
                        hfdcan1_TxHeader.DataLength = FDCAN_DLC_BYTES_8;
                        hfdcan1_TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
                        hfdcan1_TxHeader.BitRateSwitch = FDCAN_BRS_OFF;                //FDCAN_BRS_ON;
                        hfdcan1_TxHeader.FDFormat = FDCAN_CLASSIC_CAN;                //FDCAN_FD_CAN;
                        hfdcan1_TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;//FDCAN_NO_TX_EVENTS;//DCAN_STORE_TX_EVENTSㄥ
                        hfdcan1_TxHeader.MessageMarker = 0;

                       HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &hfdcan1_TxHeader, tx_data) ;


                        FDCAN_RxHeaderTypeDef FDCAN_RxHeader;//用來保存接收數據資訊
                        if (HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO0, &FDCAN_RxHeader, rx_buf) == HAL_OK) {

                                db_printf(DB_ALWAYS, "Identifier:%d\n",FDCAN_RxHeader.Identifier);
                                db_printf(DB_ALWAYS, "IdType:%d\n", FDCAN_RxHeader.IdType);
                                db_printf(DB_ALWAYS, "RxFrameType:%d\n",FDCAN_RxHeader.RxFrameType);
                                db_printf(DB_ALWAYS, "DataLength:%d\n",FDCAN_RxHeader.DataLength);
                                db_printf(DB_ALWAYS, "ErrorStateIndicato:%d\n",FDCAN_RxHeader.ErrorStateIndicator);
                                db_printf(DB_ALWAYS, "BitRateSwitch:%d\n",FDCAN_RxHeader.BitRateSwitch);
                                db_printf(DB_ALWAYS, "FDFormat:%d\n", FDCAN_RxHeader.FDFormat);

                                for (i = 0; i < 8; i++) {
                                        db_printf(DB_ALWAYS, "%d\n", rx_buf);
                                }

                        }else
                        {
                                db_printf(DB_ALWAYS, "GetRxMessage no\n");
                        }



感謝
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107778
QQ
发表于 2024-5-17 08:59:48 | 显示全部楼层
我觉得你可以这样测试下,手头有CAN正常的板子没,确定CAN硬件是正常的板子,测试下你的代码正常不。

否则这个问题研究太耽误时间了。
回复

使用道具 举报

13

主题

34

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2024-5-20 14:49:21 | 显示全部楼层
感謝回覆,
發現我在初使化開了兩個filter , 須分別用HAL_FDCAN_ConfigFilter(&hfdcan1, &hfdcan1_RX_Filter);
所以外環測試pass,

後續我想繼續在外環模式測試中斷接收, 參考網路的範例
先在初使化時加入HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0)測試
程式運作起來怪怪

我是使用rtos系統, 開啟中斷, 想問跟沒rtos下開中斷有差異嘛? rtos的fdcan中斷網路參考範例較少
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-14 11:12 , Processed in 0.280541 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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