2020-11-25 02:41 AM
When debugging I found that MX_CAN1_Init() is not getting initialized, inside this code HAL_CAN_Init() is blocked by a while loop.
That blocking iteration is as follows
/* Get tick */
tickstart = HAL_GetTick();
/* Check Sleep mode leave acknowledge */
while ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U)
{
if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE)
{
/* Update error code */
hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT;
/* Change CAN state */
hcan->State = HAL_CAN_STATE_ERROR;
return HAL_ERROR;
}
}
I generated the start configuration using:
STM32CubeIDE
Version: 1.4.0
Build: 7511_20200720_0928 (UTC)
Firmwere STM32Cube FW_L4 V1.16.0
Can anyone please tell me the issue??
Code I used:
/* USER CODE BEGIN PV */
CAN_FilterTypeDef sFilterConfig;
CAN_TxHeaderTypeDef TxMessage;
CAN_RxHeaderTypeDef RxMessage;
uint8_t TxData[8];
uint8_t RxData[8];
uint32_t TxMailbox;
/* USER CODE END PV */
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_CAN1_Init();
/* USER CODE BEGIN 2 */
sFilterConfig.FilterBank = 0;
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
sFilterConfig.FilterIdHigh = 0x0000;
sFilterConfig.FilterIdLow = 0x0000;
sFilterConfig.FilterMaskIdHigh = 0x0000;
sFilterConfig.FilterMaskIdLow = 0x0000;
sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;
sFilterConfig.FilterActivation = ENABLE;
sFilterConfig.SlaveStartFilterBank = 14;
if((HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig)) != HAL_OK)
{
test1 = 1;
Error_Handler();
}
if((HAL_CAN_Start(&hcan1)) != HAL_OK)
{
test2 = 10;
Error_Handler();
}
if((HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING | CAN_IT_TX_MAILBOX_EMPTY)) != HAL_OK)
{
test3 = 100;
Error_Handler();
}
TxMessage.StdId = 0x321;
TxMessage.ExtId = 0x01;
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = 8;
TxMessage.TransmitGlobalTime = DISABLE;
TxData[0] = 1;
TxData[1] = 2;
TxData[2] = 3;
TxData[3] = 4;
TxData[4] = 5;
TxData[5] = 6;
TxData[6] = 7;
TxData[7] = 8;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_CAN_AddTxMessage(&hcan1, &TxMessage, TxData, &TxMailbox);
HAL_Delay(500);
TxData[7] = TxData[7] + 1;
}
void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan)
{
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_8);
}
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RxMessage, RxData);
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_8);
}
/* USER CODE END 3 */
}
2020-11-25 08:47 AM
Hello @RahulR ,
Welcome to the STM32 Community :smiling_face_with_smiling_eyes:
I recommend you to refer and check the configuration of CAN example, compare the code/functions with yours and make updates according to your needs:
STM32Cube_FW_L4_V1.16.0\Projects\STM32L476G-EVAL\Examples\CAN\CAN_Networking
Imen
2020-11-26 04:21 AM
Thank for the reply @Imen DAHMEN
Now HAL_CAN_Init() is working fine. When doing the debug it seems ok.
Now HAL_CAN_Start() and HAL_CAN_ActivateNotification() are not working. HAL_CAN_Start() function is trapped inside the following "wait the acknowledge " loop
while ((hcan->Instance->MSR & CAN_MSR_INAK) != 0U)
{
/* Check for the Timeout */
if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE)
{
/* Update error code */
hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT;
/* Change CAN state */
hcan->State = HAL_CAN_STATE_ERROR;
return HAL_ERROR;
}
}
It returns the state other than (state == HAL_CAN_STATE_READY) || (state == HAL_CAN_STATE_LISTENING) ) , HAL_CAN_ActivateNotification() also getting failed.
What may be the issue? Please help me.