2023-01-06 07:01 AM
Greetings!
I was trying to make a host device on STM32G0 to access system Bootloader of another STM32G0B1CBT6 to update Firmware over CANFd. Reference was taken from "AN5405"
I configured the host device as mentioned in Application note and tried to the "GET Command" on CAN ID from 0x00 to 0x7ff, but i didn't received any response from system bootloder. Configuration of host is as below:
Clock Frequency: 20Mhz
hfdcan1.Instance = FDCAN1;
hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1;
hfdcan1.Init.FrameFormat = FDCAN_FRAME_FD_BRS;
hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;
hfdcan1.Init.AutoRetransmission = ENABLE;
hfdcan1.Init.TransmitPause = DISABLE;
hfdcan1.Init.ProtocolException = DISABLE;
hfdcan1.Init.NominalPrescaler = 1;
hfdcan1.Init.NominalSyncJumpWidth = 16;
hfdcan1.Init.NominalTimeSeg1 = 63;
hfdcan1.Init.NominalTimeSeg2 = 16;
hfdcan1.Init.DataPrescaler = 1;
hfdcan1.Init.DataSyncJumpWidth = 4;
hfdcan1.Init.DataTimeSeg1 = 15;
hfdcan1.Init.DataTimeSeg2 = 4;
hfdcan1.Init.StdFiltersNbr = 1;
hfdcan1.Init.ExtFiltersNbr = 0;
hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
{
Error_Handler();
}
FilterConfig.IdType = FDCAN_STANDARD_ID;
FilterConfig.FilterIndex = 0;
FilterConfig.FilterType = FDCAN_FILTER_RANGE;
FilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
FilterConfig.FilterID1 = 0;
FilterConfig.FilterID2 = 0x7ff;
if (HAL_FDCAN_ConfigFilter(&hfdcan1, &FilterConfig) != HAL_OK)
{
CAN_FD_ErrorCode = CAN_FD_ConfigFiltterError;
CAN_FaultStatus = true;
globalErrorStatus = true;
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_FILTER_TO_RXFIFO0, FDCAN_FILTER_TO_RXFIFO0, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)
{
CAN_FD_ErrorCode = CAN_FD_GlobalFillterError;
CAN_FaultStatus = true;
globalErrorStatus = true;
Error_Handler();
}
/* Activate Rx FIFO 0 new message notification */
if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
{
CAN_FD_ErrorCode = CAN_FD_RxFifoActivationError;
CAN_FaultStatus = true;
globalErrorStatus = true;
Error_Handler();
}
/* Prepare Tx message Header */
txHeader.Identifier = 0x1;
txHeader.IdType = FDCAN_STANDARD_ID;
txHeader.TxFrameType = FDCAN_DATA_FRAME;
txHeader.DataLength = FDCAN_DLC_BYTES_64;
txHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
txHeader.BitRateSwitch = FDCAN_BRS_ON;
txHeader.FDFormat = FDCAN_FD_CAN;
txHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
txHeader.MessageMarker = 0;
/* Configure and enable Tx Delay Compensation, required for BRS mode.
TdcOffset default recommended value: DataTimeSeg1 * DataPrescaler
TdcFilter default recommended value: 0 */
if (HAL_FDCAN_ConfigTxDelayCompensation(&hfdcan1, 5, 0) != HAL_OK)
{
CAN_FD_ErrorCode = CAN_FD_ConfigTxDelayError;
CAN_FaultStatus = true;
globalErrorStatus = true;
Error_Handler();
}
if (HAL_FDCAN_EnableTxDelayCompensation(&hfdcan1) != HAL_OK)
{
CAN_FD_ErrorCode = CAN_FD_EnableTxDelayError;
CAN_FaultStatus = true;
globalErrorStatus = true;
Error_Handler();
}
/* Start the FDCAN module */
if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)
{
CAN_FD_ErrorCode = CAN_FD_StartError;
CAN_FaultStatus = true;
globalErrorStatus = true;
Error_Handler();
}
During transmission of CAN packet i used to change Tx Identifier from range of 0x00 to 0x7ff.
Also Data Length was tried both 0 and 1 as mentioned in Application note.
Any help would be appriciated.
Thanks,
Tirthraj Solanki
2023-01-06 09:21 AM
Primary you check if client is in bootloader mode.
Secondary your connection need on client be as AN2606 only pin PD0 PD1
2023-01-06 09:36 PM
Hi,
Thank you for your response.
So, yes client is in bootloader mode, verified by using UART protocol.
Also pin used for CANFd are PD0 and PD1.
2023-01-07 02:50 AM
Ok then bootloader maybe detect some other interface or you have mistake , protocol speed 0.5M?