Hello, i am implementing a HAL CAN Driver for my STM32F405. I am using a TJA1048 as a Tranciever. Down below there is my Source Code. If i want to Transmit one Message, it ends in the Errorcode: HAL_CAN_ERROR_TX_TERR0. So do you know whats wrong ?
My APB1 Clock Frequency is 42Mhz.
Init:
hcan1.Instance = CAN1;
hcan1.Init.TimeTriggeredMode = DISABLE;
hcan1.Init.AutoBusOff = ENABLE;
hcan1.Init.AutoWakeUp = DISABLE;
hcan1.Init.AutoRetransmission = DISABLE;
hcan1.Init.ReceiveFifoLocked = DISABLE;
hcan1.Init.TransmitFifoPriority = DISABLE;
hcan1.Init.Mode = CAN_MODE_NORMAL;
hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;
hcan1.Init.TimeSeg1 = CAN_BS1_2TQ;
hcan1.Init.TimeSeg2 = CAN_BS2_4TQ;
hcan1.Init.Prescaler = 5; //6
if (HAL_CAN_Init(&hcan1) != HAL_OK)
{
Error_Handler();
}
CAN_FilterTypeDef CAN1_Filter;
CAN1_Filter.FilterBank = 0;
CAN1_Filter.FilterMode = CAN_FILTERMODE_IDMASK;
CAN1_Filter.FilterScale = CAN_FILTERSCALE_32BIT;
CAN1_Filter.FilterIdHigh = 0x0000;
CAN1_Filter.FilterIdLow = 0x0000;
CAN1_Filter.FilterMaskIdHigh = 0x0000;
CAN1_Filter.FilterMaskIdLow = 0x0000;
CAN1_Filter.FilterFIFOAssignment = CAN_RX_FIFO0;
CAN1_Filter.FilterActivation = ENABLE;
CAN1_Filter.SlaveStartFilterBank = 14;
if (HAL_CAN_ConfigFilter(&hcan1, &CAN1_Filter) != HAL_OK)
{
/* Filter configuration Error */
Error_Handler();
}
if (HAL_CAN_Start(&hcan1) != HAL_OK)
{
/* Start Error */
Error_Handler();
}
/*##-4- Activate CAN TX notification #######################################*/
if (HAL_CAN_ActivateNotification(&hcan1, CAN_IT_TX_MAILBOX_EMPTY) != HAL_OK)
{
/* Notification Error */
Error_Handler();
}
/*##-4- Activate CAN RX notification #######################################*/
if (HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)
{
/* Notification Error */
Error_Handler();
}
MspInit:
GPIO_InitTypeDef GPIO_InitStruct;
/* USER CODE BEGIN CAN1_MspInit 0 */
/* USER CODE END CAN1_MspInit 0 */
/* CAN1 clock enable */
__HAL_RCC_CAN1_CLK_ENABLE();
//__HAL_PPP_ENABLE_IT(hcan1, );
/**CAN1 GPIO Configuration
PB8 ------> CAN1_RX
PB9 ------> CAN1_TX
*/
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF9_CAN1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* CAN1 interrupt Init */
HAL_NVIC_SetPriority(CAN1_TX_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(CAN1_TX_IRQn);
HAL_NVIC_SetPriority(CAN1_RX0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(CAN1_RX0_IRQn);
HAL_NVIC_SetPriority(CAN1_RX1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(CAN1_RX1_IRQn);
/* USER CODE BEGIN CAN1_MspInit 1 */
Transmiting the Message:
TXheader1.StdId = 0x390;
TXheader1.RTR = CAN_RTR_DATA;
TXheader1.IDE = CAN_ID_STD;
TXheader1.DLC = 8;
if(HAL_CAN_AddTxMessage(&hcan1, &TXheader1, tData, &TxMailbox) != HAL_OK){
Error_Handler();
}
while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan1) == 0){}; // Buffer
