2020-07-15 05:31 AM
here is my code
void can(void)
{
CAN_TxHeaderTypeDef TxHeader;
uint32_t TxMailbox;
uint8_t usr_msg[10]={'h','e','l','l','o'};
TxHeader.DLC=2;
TxHeader.RTR= CAN_RTR_DATA ;
TxHeader.IDE= CAN_ID_STD;
TxHeader.StdId= 0x65;
if(HAL_CAN_AddTxMessage(&hcan1,&TxHeader,usr_msg,&TxMailbox)!=HAL_OK)
{
Error_Handler();
}
while(HAL_CAN_IsTxMessagePending(&hcan1,TxMailbox));
HAL_GPIO_WritePin(GPIOB, LD1_Pin, GPIO_PIN_SET);
}
void RX(void)
{
CAN_RxHeaderTypeDef RxHeader;
uint8_t rcv_msg[10];
while(HAL_CAN_GetRxFifoFillLevel(&hcan2,CAN_RX_FIFO0));
if(HAL_CAN_GetRxMessage(&hcan2,CAN_RX_FIFO0,&RxHeader,rcv_msg)!=HAL_OK)
{
Error_Handler();
}
HAL_GPIO_WritePin(GPIOB, LD2_Pin, GPIO_PIN_SET);
}
2020-07-15 05:42 AM
HAL_CAN_GetRxFifoFillLevel returns the number of available messages. To wait for "at least one message is in the fifo", you should write
while( HAL_CAN_GetRxFifoFillLevel(&hcan2,CAN_RX_FIFO0) < 1 );
I don't see the Rx filter setup in the code provided. Filters are another common source of errors.
2020-07-15 07:03 AM
void CAN1_Init(void)
{
hcan1.Instance = CAN1;
hcan1.Init.Prescaler = 16;
hcan1.Init.Mode = CAN_MODE_NORMAL;
hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;
hcan1.Init.TimeSeg1 = CAN_BS1_1TQ;
hcan1.Init.TimeSeg2 = CAN_BS2_1TQ;
hcan1.Init.TimeTriggeredMode = DISABLE;
hcan1.Init.AutoBusOff = DISABLE;
hcan1.Init.AutoWakeUp = DISABLE;
hcan1.Init.AutoRetransmission = DISABLE;
hcan1.Init.ReceiveFifoLocked = DISABLE;
hcan1.Init.TransmitFifoPriority = DISABLE;
if (HAL_CAN_Init(&hcan1) != HAL_OK)
{
Error_Handler();
}
}
void CAN2_Init(void)
{
hcan2.Instance = CAN2;
hcan2.Init.Prescaler = 16;
hcan2.Init.Mode = CAN_MODE_NORMAL;
hcan2.Init.SyncJumpWidth = CAN_SJW_1TQ;
hcan2.Init.TimeSeg1 = CAN_BS1_1TQ;
hcan2.Init.TimeSeg2 = CAN_BS2_1TQ;
hcan2.Init.TimeTriggeredMode = DISABLE;
hcan2.Init.AutoBusOff = ENABLE;
hcan2.Init.AutoWakeUp = DISABLE;
hcan2.Init.AutoRetransmission = ENABLE;
hcan2.Init.ReceiveFifoLocked = DISABLE;
hcan2.Init.TransmitFifoPriority = DISABLE;
if (HAL_CAN_Init(&hcan2) != HAL_OK)
{
Error_Handler();
}
}
void can1_filter(void)
{
CAN_FilterTypeDef filter1;
filter1.FilterActivation=CAN_FILTER_ENABLE;
filter1.FilterBank=0;
filter1.FilterFIFOAssignment= CAN_RX_FIFO0;
filter1.FilterIdHigh=0x0000;
filter1.FilterIdLow=0x0000;
filter1.FilterMaskIdHigh=0x0000;
filter1.FilterMaskIdLow=0x0000;
filter1.FilterMode= CAN_FILTERMODE_IDMASK;
filter1.FilterScale=CAN_FILTERSCALE_32BIT;
filter1.SlaveStartFilterBank=14;
if(HAL_CAN_ConfigFilter(&hcan1,&filter1)!=HAL_OK)
{
Error_Handler();
}
}
void can2_filter(void)
{
CAN_FilterTypeDef filter2;
filter2.FilterActivation=CAN_FILTER_ENABLE;
filter2.FilterBank=0;
filter2.FilterFIFOAssignment= CAN_RX_FIFO0;
filter2.FilterIdHigh=0x0000;
filter2.FilterIdLow=0x0000;
filter2.FilterMaskIdHigh=0x0000;
filter2.FilterMaskIdLow=0x0000;
filter2.FilterMode= CAN_FILTERMODE_IDMASK;
filter2.FilterScale=CAN_FILTERSCALE_32BIT;
filter2.SlaveStartFilterBank=27;
if(HAL_CAN_ConfigFilter(&hcan2,&filter2)!=HAL_OK)
{
Error_Handler();
}
}
2020-07-15 07:24 PM
sir have you seen my filter configurations ? are they correct..?
2020-07-15 11:37 PM
The filters look okay to me. How are CAN1 and CAN2 connected, with PHYs?
The _1TQ timing look like defaults. Have you calculated it like with http://www.bittiming.can-wiki.info/
2020-07-16 12:39 AM
CAN1 and CAN2 are connected physically with jumper wires and i am using cjmcu230 canbus module. i changed the bit rate to 100kbps its transmitting perfectly but at reception side it is entering into Error_Handler(); .
2020-07-16 12:55 AM
There is a HAL_CAN_GetError function telling you a bit more about the error. Or: debug-step through HAL_CAN_GetRxMessage
2020-07-16 12:59 AM
when i debug the code in this part it is entering into Error_Handler();
if(HAL_CAN_GetRxMessage(&hcan2,CAN_RX_FIFO0,&RxHeader,rcv_msg)!=HAL_OK)
{
Error_Handler();
}
2020-07-16 01:08 AM
Yes, I got that. Ideas:
2020-07-16 02:47 AM
sir when i debug the code its not showing any error code related to can. its just simply entering into that function and coming back