首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CAN通信:可以发送,但不能接收

CAN通信:可以发送,但不能接收
EN

Stack Overflow用户
提问于 2022-09-20 16:10:15
回答 1查看 138关注 0票数 0

我试图使用我的STM32H7B3I-EVAL评估板发送和接收CAN通信消息。我正在与向量CANalayzer (16.0,VN1630A)通信。CANalyzer既用于显示从评估委员会收到的消息,也用于传输自己的数据并将其发送给评估委员会。

我目前正在运行附加到此的以下C代码。

CANalyzer看到代码中第111-138行在bode中发送的数据。但是,当我试图从CANalyzer接收数据并在评估板上眨眼时,它就不起作用了。

我从CANalyzer发送的数据:

消息ID: 0x123

数据长度:8

资料:每2秒0x2233445566778899至0x1223344556677889之间交替。

我不知道为什么这段代码成功地将数据发送到CANalyzer,但没有接收到从中发送的数据。

我没有正确配置Rx吗?

测试代码:

代码语言:javascript
运行
复制
while(1)
{
  for (uint16_t i = 0; i < 0xFFFF; i++)
          {

              uint16_t TxData1[] = {i, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55};

              //Add message to Tx FIFO
                TxHeader.Identifier = 0x111;
                TxHeader.IdType = FDCAN_STANDARD_ID;
                TxHeader.TxFrameType = FDCAN_DATA_FRAME;
                TxHeader.DataLength = FDCAN_DLC_BYTES_8;
                TxHeader.ErrorStateIndicator = FDCAN_ESI_PASSIVE;
                TxHeader.BitRateSwitch = FDCAN_BRS_ON;
                TxHeader.FDFormat = FDCAN_FD_CAN;
                TxHeader.TxEventFifoControl = FDCAN_STORE_TX_EVENTS;
                TxHeader.MessageMarker = 0xCC;
                HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData1);
                HAL_Delay(5);

                uint16_t TxData2[] = {i, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55};

                TxHeader.Identifier = 0x135;
                TxHeader.IdType = FDCAN_STANDARD_ID;
                TxHeader.TxFrameType = FDCAN_DATA_FRAME;
                TxHeader.DataLength = FDCAN_DLC_BYTES_8;
                TxHeader.ErrorStateIndicator = FDCAN_ESI_PASSIVE;
                TxHeader.BitRateSwitch = FDCAN_BRS_ON;
                TxHeader.FDFormat = FDCAN_FD_CAN;
                TxHeader.TxEventFifoControl = FDCAN_STORE_TX_EVENTS;
                TxHeader.MessageMarker = 0xCC;
                HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData2);
                HAL_Delay(5);


                HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_BUFFER0, &RxHeader, RxData);

                if(BufferCmp8b(TxData3,RxData,8)==0){
                    BSP_LED_Toggle(LED1);
                }
          }

}

CAN初始化:

代码语言:javascript
运行
复制
static void CAN_Init(){
/* Initializes the FDCAN peripheral in loopback mode */
  hfdcan1.Instance = FDCAN1;
  hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
  hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;
  hfdcan1.Init.AutoRetransmission = ENABLE;
  hfdcan1.Init.TransmitPause = ENABLE;
  hfdcan1.Init.ProtocolException = DISABLE;
  /* Bit time configuration:
    ************************
    Bit time parameter         | Nominal      |  Data
    ---------------------------|--------------|----------------
    fdcan_ker_ck               | 20 MHz       | 20 MHz
    Time_quantum (tq)          | 50 ns        | 50 ns
    Synchronization_segment    | 1 tq         | 1 tq
    Propagation_segment        | 23 tq        | 23 tq
    Phase_segment_1            | 8 tq         | 8 tq
    Phase_segment_2            | 8 tq         | 8 tq
    Synchronization_Jump_width | 8 tq         | 8 tq
    Bit_length                 | 40 tq = 2 �s | 40 tq = 2 �s
    Bit_rate                   | 0.5 MBit/s   | 0.5 MBit/s
  */
  hfdcan1.Init.NominalPrescaler = 0x1; /* tq = NominalPrescaler x (1/fdcan_ker_ck) */
  hfdcan1.Init.NominalSyncJumpWidth = 0x8;
  hfdcan1.Init.NominalTimeSeg1 = 0x1F; /* NominalTimeSeg1 = Propagation_segment + Phase_segment_1 */
  hfdcan1.Init.NominalTimeSeg2 = 0x8;
  hfdcan1.Init.DataPrescaler = 0x1;
  hfdcan1.Init.DataSyncJumpWidth = 0x8;
  hfdcan1.Init.DataTimeSeg1 = 0x1F; /* DataTimeSeg1 = Propagation_segment + Phase_segment_1 */
  hfdcan1.Init.DataTimeSeg2 = 0x8;
  hfdcan1.Init.MessageRAMOffset = 0;
  hfdcan1.Init.StdFiltersNbr = 1;
  hfdcan1.Init.ExtFiltersNbr = 1;
  hfdcan1.Init.RxFifo0ElmtsNbr = 1;
  hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
  hfdcan1.Init.RxFifo1ElmtsNbr = 2;
  hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;
  hfdcan1.Init.RxBuffersNbr = 1;
  hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_8;
  hfdcan1.Init.TxEventsNbr = 2;
  hfdcan1.Init.TxBuffersNbr = 1;
  hfdcan1.Init.TxFifoQueueElmtsNbr = 2;
  hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
  hfdcan1.Init.TxElmtSize = FDCAN_DATA_BYTES_8;
  HAL_FDCAN_Init(&hfdcan1);
  }

static void CAN_RxStdFilter_Init(){
  sFilterConfig.IdType = FDCAN_STANDARD_ID;
  sFilterConfig.FilterIndex = 0;
  sFilterConfig.FilterType = FDCAN_FILTER_DUAL;
  sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXBUFFER;
  sFilterConfig.FilterID1 = 0x111;
  sFilterConfig.FilterID2 = 0x555;
  sFilterConfig.RxBufferIndex = 0;
  HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig);

}

代码语言:javascript
运行
复制
static void CAN_RxExtFilter_Init(){
  sFilterConfig.IdType = FDCAN_EXTENDED_ID;
  sFilterConfig.FilterIndex = 0;
  sFilterConfig.FilterType = FDCAN_FILTER_RANGE_NO_EIDM;
  sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;
  sFilterConfig.FilterID1 = 0x1111111;
  sFilterConfig.FilterID2 = 0x2222222;
  HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig);

}

代码语言:javascript
运行
复制
static void CAN_TxFilter_Init(){
  TxHeader.Identifier = 0x111;
  TxHeader.IdType = FDCAN_STANDARD_ID;
  TxHeader.TxFrameType = FDCAN_DATA_FRAME;
  TxHeader.DataLength = FDCAN_DLC_BYTES_8;
  TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
  TxHeader.BitRateSwitch = FDCAN_BRS_ON;
  TxHeader.FDFormat = FDCAN_FD_CAN;
  TxHeader.TxEventFifoControl = FDCAN_STORE_TX_EVENTS;
  TxHeader.MessageMarker = 0x52;
  HAL_FDCAN_AddMessageToTxBuffer(&hfdcan1, &TxHeader, TxData0, FDCAN_TX_BUFFER0);

}

EN

回答 1

Stack Overflow用户

发布于 2022-09-22 22:44:07

我不知道您如何使用HAL来处理它,但是,有一个用于https://www.st.com/resource/en/application_note/an5348-fdcan-peripheral-on-stm32-devices-stmicroelectronics.pdf,的AppNote,在第14页的表5中,它有4个示例过滤器。

“第二个”过滤器具有SFT = "01 - DUAL“,ID1和ID2各包含一个CAN-ID,对2条消息进行过滤,然后将它们存储到Rx FIFO1 (SFEC =”010-Store in FIFO1")。

“第三个”过滤器被忽略("xx -不关心“),因为SFT = "111 - Store in Rx缓冲区”,其中在ID1中配置了CAN-ID,而ID2用于将消息存储到BufferId。

但是在这两个过滤器中,我认为ID1应该包含0x123,因为这是消息,您希望从CANalyzer接收。

代码语言:javascript
运行
复制
static void CAN_RxStdFilter_Init(){
    sFilterConfig.IdType = FDCAN_STANDARD_ID;
    sFilterConfig.FilterIndex = 0;
    sFilterConfig.FilterType = FDCAN_FILTER_DUAL; // <- AppNote SFT field - how does the HAL handle it?
    sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXBUFFER; // <- AppNote SFEC field 
    sFilterConfig.FilterID1 = 0x111; // <-- 0x123 ??
    sFilterConfig.FilterID2 = 0x555; // <-- 0 ( == RxBufferIndex, when filter to buffer)?
    sFilterConfig.RxBufferIndex = 0;
    HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig);
}

不确定,HAL是如何处理FilterType和FilterConfig的,可能有文档吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73789670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档