Skip to main content
DBles.1
Associate II
August 20, 2023
Question

CAN Messages not sending

  • August 20, 2023
  • 1 reply
  • 807 views

Hi, I am using the following:

cubeIDE 1.13.1/STM32F072C8U6/baud = 250K - I attached a picture of my clock diagram & param setup.

Hi, I am using the following:

cubeIDE 1.13.1/STM32F072C8U6/baud = 250K - I attached a picture of my clock diagram & param setup.

I do not see messages sending on the CAN bus. They worked fine in my previous IDE. I have a feeling it has to due with the time quanta but not 100% sure. I tried adjusting to quanta 10/5 after reading the following with no luck:

http://www.bittiming.can-wiki.info/ 

Init:

static void MX_CAN_Init(void)
{
/* USER CODE BEGIN CAN_Init 0 */
/* USER CODE END CAN_Init 0 */
/* USER CODE BEGIN CAN_Init 1 */
/* USER CODE END CAN_Init 1 */
hcan.Instance = CAN;
hcan.Init.Prescaler = 32;
hcan.Init.Mode = CAN_MODE_NORMAL;
hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
hcan.Init.TimeSeg1 = CAN_BS1_1TQ;
hcan.Init.TimeSeg2 = CAN_BS2_1TQ;
hcan.Init.TimeTriggeredMode = DISABLE;
hcan.Init.AutoBusOff = DISABLE;
hcan.Init.AutoWakeUp = DISABLE;
hcan.Init.AutoRetransmission = DISABLE;
hcan.Init.ReceiveFifoLocked = DISABLE;
hcan.Init.TransmitFifoPriority = DISABLE;
if (HAL_CAN_Init(&hcan) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN CAN_Init 2 */
// Example: extended ID = 0x18FF51D0 (29 bits) matching with bits [31:3] in the filter register
// For bit position, please refer to document RM0008 (STM32F10x reference manual, page 657)
// FILTER register = 0b1100 0111 1111 1010 1000 1110 1000 0100
sf_typedef.FilterMaskIdHigh = 0xC7FA;
sf_typedef.FilterMaskIdLow = 0x8E84;
sf_typedef.FilterFIFOAssignment = CAN_FILTER_FIFO0;
sf_typedef.FilterBank = 0;
sf_typedef.FilterMode = CAN_FILTERMODE_IDMASK;
sf_typedef.FilterScale = CAN_FILTERSCALE_32BIT;
sf_typedef.FilterMaskIdHigh = 0x07FF; // Setup ID Mask to only look for "FF5x" in the PGN
sf_typedef.FilterMaskIdLow = 0x8004; // Set IDE bit to make sure no standard ID message goes through filter
sf_typedef.FilterActivation = CAN_FILTER_ENABLE;
if (HAL_CAN_ConfigFilter(&hcan, &sf_typedef) != HAL_OK)
Error_Handler();
//Start CAN Peripheral
if (HAL_CAN_Start(&hcan) != HAL_OK)
{
/* Start Error */
Error_Handler();
}
//Start rx ISR operation
if (HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)
{
/* Notification Error */
Error_Handler();
}
TxMessage.DLC = 8;
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_EXT;
//priority, PGN, address, id
set_can_id(0x04, 0xFFD1, 0x10, &CAN_id_xlor);
TxMessage.ExtId = CAN_id_xlor; //TODO: check if correct
//send data example
//HAL_CAN_AddTxMessage(&hcan, &TxMessage, const uint8_t aData, uint32_t (uint32_t *)CAN_TX_MAILBOX0);
/* USER CODE END CAN_Init 2 */
}

I send data every 40ms as follows:
CAN_send_status2();
Function definition:

void CAN_send_status2(void)
{
uint32_t mb = CAN_TX_MAILBOX0;
//init can id for this device - TODO: add other devices and define how to grab device
//priority, PGN, address, id
set_can_id(0x04, 0xFFD2, 0x10, &CAN_id_xlor);
TxMessage.ExtId = CAN_id_xlor;
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_EXT;
TxMessage.DLC = 8;
//TODO: add angle sensor faults? Overvoltage/under voltage warning?
if(pem_flash_mirror[ZERO_ANGLE_OCCURRED_FLASH_INDEX] == ZERO_OCCURRED_KEY)
tData[0] = 0x7F;
else
tData[0] = 0xFF;
tData[1] = 0xFF;
tData[2] = (position_variables.linearized_position >> 8) & 0xFF; //get high byte
tData[3] = position_variables.linearized_position & 0xFF; //get lower byte
tData[4] = 0xFF;
tData[5] = 0xFF;
tData[6] = 0xFF;
tData[7] = 0xFF;
HAL_CAN_AddTxMessage(&hcan, &TxMessage, tData, &mb);
}

Any clues?

I am not sure why data would not be send through the bus.

I have not worked on rx routines due to waiting on a transceiver.

Thank you!

This topic has been closed for replies.

1 reply

mƎALLEm
ST Technical Moderator
September 22, 2026

Hello,

These definitely are bad time quanta values to define the bit time:

hcan.Init.Prescaler = 32;
hcan.Init.TimeSeg1 = CAN_BS1_1TQ;
hcan.Init.TimeSeg2 = CAN_BS2_1TQ;

BS1 = BS2 = 1 x tq !!

You need to increase as much as possible  BS1 and BS2 while decreasing the prescaler. You need to take care about the sample point that needs to be at around 87,5%.

Please refer to this article:

Indeed, the link  http://www.bittiming.can-wiki.info/  is recommended for the bxCAN bit time computation so if you’ve used 10/5 proportions for the bit time you need to ensure the updated CAN bitrate is inline with the CAN bus one as the config is in Normal mode.

You can also do a test with the loopback mode and monitor the CAN_Tx pin.

 

To give better visibility on the answered topics, please click "Best answer" on the reply which solved your issue or answered your question.