我试图使用我的STM32H7B3I-EVAL评估板发送和接收CAN通信消息。我正在与向量CANalayzer (16.0,VN1630A)通信。CANalyzer既用于显示从评估委员会收到的消息,也用于传输自己的数据并将其发送给评估委员会。
我目前正在运行附加到此的以下C代码。
CANalyzer看到代码中第111-138行在bode中发送的数据。但是,当我试图从CANalyzer接收数据并在评估板上眨眼时,它就不起作用了。
我从CANalyzer发送的数据:
消息ID: 0x123
数据长度:8
资料:每2秒0x2233445566778899至0x1223344556677889之间交替。
我不知道为什么这段代码成功地将数据发送到CANalyzer,但没有接收到从中发送的数据。
我没有正确配置Rx吗?
测试代码:
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初始化:
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);
}
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);
}
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);
}
发布于 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接收。
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的,可能有文档吗?
https://stackoverflow.com/questions/73789670
复制相似问题