CAN communication not working F407 with G431
I have two Nucleo boards that are connected with a CAN bus (Transceiver SN65HVD230).
I would like to communicate with standard CAN, eight data bytes, data rate 50000 bit/s.
For the F407 all TX & RX events are triggering (reused old working code) the CubeMX settings (HCLK 168 MHz, periphiral clk 42 MHz) are:
The G431 is not working as expected, the CubeMX settings (HCLK 170 MHz, peripheral clocks 170 MHz) are:
The G431 TX/RX interrupts are working only in external Loopback mode in normal mode nothing triggers. Some code for the configuration of the G431 CAN:
HAL_StatusTypeDef CAN1_Start(int8_t CAN_HW_init)
{
HAL_StatusTypeDef status;
FDCAN_FilterTypeDef filterConfig;
if(CAN_HW_init == 1)
{
MX_FDCAN1_Init();
}
// Configure Rx filter
filterConfig.IdType = FDCAN_STANDARD_ID;
filterConfig.FilterIndex = 0;
filterConfig.FilterType = FDCAN_FILTER_MASK; // FDCAN_FILTER_RANGE;
filterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
filterConfig.FilterID1 = 0x000;
filterConfig.FilterID2 = 0x000; // 0x7FF; // 0x1FFFFFFF; //
if (HAL_FDCAN_ConfigFilter(&hfdcan1, &filterConfig) != HAL_OK)
{
Error_Handler();
}
// Start the FDCAN module
status = HAL_FDCAN_Start(&hfdcan1);
if (status != HAL_OK)
{
Error_Handler();
}
if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_TX_COMPLETE | FDCAN_IT_RX_FIFO0_NEW_MESSAGE, FDCAN_TX_BUFFER0 | FDCAN_RX_FIFO0) != HAL_OK)
//if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_TX_COMPLETE | FDCAN_IT_RX_FIFO0_NEW_MESSAGE, FDCAN_TX_BUFFER0 | FDCAN_TX_BUFFER1 | FDCAN_TX_BUFFER2) != HAL_OK)
//if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_TX_COMPLETE | FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
{
Error_Handler();
}
return status;
}
// send CAN message
void CAN1_TX(uint32_t CAN_ID, uint8_t CAN_RTR, uint8_t* CAN_Tx_Data)
{
//FDCAN_TxHeaderTypeDef CanTxHeader;
CanTxHeader.Identifier = CAN_ID;
CanTxHeader.IdType = FDCAN_STANDARD_ID;
CanTxHeader.DataLength = FDCAN_DLC_BYTES_8; // CAN_DLC; //
CanTxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE; // FDCAN_ESI_PASSIVE; //
CanTxHeader.BitRateSwitch = FDCAN_BRS_OFF;
CanTxHeader.FDFormat = FDCAN_CLASSIC_CAN; // FDCAN_FD_CAN;
CanTxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS; //FDCAN_STORE_TX_EVENTS; //
CanTxHeader.MessageMarker = 0;
if(CAN_RTR == 0)
{
CanTxHeader.TxFrameType = FDCAN_DATA_FRAME;
}
else
{
CanTxHeader.TxFrameType = FDCAN_REMOTE_FRAME;
}
/* Start the Transmission process */
if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &CanTxHeader, CAN_Tx_Data) != HAL_OK)
{
/* Transmission request Error */
Error_Handler();
}
HAL_Delay(10);
}
// Transmission Complete callback FDCAN_Tx_location
void HAL_FDCAN_TxBufferCompleteCallback(FDCAN_HandleTypeDef *hfdcan, uint32_t BufferIndexes)
{
can_tx_ready = 1; // finished transmission
}
// FDCAN RX callback
void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
{
if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != RESET)
{
/* Retrieve Rx messages from RX FIFO0 */
if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &CanRxHeader, can_rx_data) != HAL_OK)
{
Error_Handler();
}
can_state_change = 1;
}
}
I need some advice, please help.
Best Regards,
Erik
