I want to read data from 500kbps on the card I developed with STM32f103 but I cannot get results. I used "CubeMX" to get the required kbps setting right and I use "CubeMX" to generate the code.
STM32F103C6T CAN_RX => PB8 CAN_TX => PB9
I have tried many things to read the incoming data on the Can bus line via STM32, but I could not get any results, can you help?
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART2_UART_Init();
MX_CAN_Init();
HAL_Delay(500);
my_init();
while (1){
my_loop();
}
}
void my_init(void)
{
uartPrint("Starting.... \n\r");
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); // TurnOff LED
if(HAL_CAN_Start(&hcan) == HAL_OK){
uartPrint("CAN v2 Started\n");
can_init = 1;
}
if (HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)
{
uartPrint("CAN v2 Notify#1 ERROR\n");
Error_Handler();
}
if (HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO1_MSG_PENDING) != HAL_OK)
{
uartPrint("CAN v2 Notify#2 ERROR\n");
Error_Handler();
}
}
static void MX_CAN_Init(void)
{
hcan.Instance = CAN1;
hcan.Init.Prescaler = 4;
hcan.Init.Mode = CAN_MODE_NORMAL;
hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
hcan.Init.TimeSeg1 = CAN_BS1_14TQ;
hcan.Init.TimeSeg2 = CAN_BS2_3TQ;
hcan.Init.TimeTriggeredMode = DISABLE;
hcan.Init.AutoBusOff = ENABLE;
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();
}
}
void my_loop()
{
if (can_init == 1)
{
canCounter = canCounter + 1;
if(canCounter > 500000){
uartPrintNew("CANBUS : ErrorCode:%d [Ready:%d,Listen:%d,Error:%d] %d \n",hcan.ErrorCode,hcan.State ==0x01U,hcan.State ==0x02U,hcan.State ==0x05U,rxHeader.StdId);
canCounter = 0;
}
if (HAL_CAN_GetRxFifoFillLevel(&hcan, CAN_RX_FIFO0)){
uartPrint("CAN CHECKING\n");
HAL_StatusTypeDef retval = HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &rxHeader, rxData);
if (retval == HAL_OK){
uartPrintNew("RX: %u\n", rxHeader.StdId);
uartPrintNew("ID: %u\n", rxHeader.ExtId);
uartPrintNew("DLC: %u\n", rxHeader.DLC);
uartPrintNew("Data: %u\n", rxData[0]);
}
}
}
}

