main
// CAN 1
CAN_Filter_Config();
// CAN1 Start
if(HAL_CAN_Start(&hcan1) != HAL_OK){
Error_Handler();
}
// Interrupt 방식
// 수신 인터럽트 활성화
if(HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)
{
Error_Handler();
}
// CAN2
CAN2_Filter_Config();
HAL_CAN_Start(&hcan2);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
if(rx_end_flag == 1)
{
// 수신 데이터 RxData 처리
uint16_t timestamp = RxHeader.Timestamp;
printf("CAN1 Rx Time = %u, Can1 Rx = %s, ID = 0x%3lX, DLC=%d\r\n", timestamp, RxData, (unsigned long)RxHeader.StdId, RxHeader.DLC);
rx_end_flag = 0;
}
// CAN1
//CAN1_Tx();
//CAN1_Rx();
CAN_Transmit();
// 폴링방식
//CAN_Receive();
// CAN2
CAN2_Tx();
CAN2_Rx();
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
//---------------------------------------------------------------
Interrupt Call 백함수
// CAN RX 인터럽트 콜백 함수
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
if(hcan->Instance == CAN1) // CAN1로부터 인터럽트가 왔을 때
{
if(HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, RxData) == HAL_OK)
{
// 수신 데이터 RxData 처리
// uint16_t timestamp = RxHeader.Timestamp;
//printf("CAN1 Rx Time = %u, Can1 Rx = %s, ID = 0x%3lX, DLC=%d\r\n", timestamp, RxData, (unsigned long)RxHeader.StdId, RxHeader.DLC);
/*
printf("CAN1 RX ID: 0x%03lX, DLC: %lu, Data: ", RxHeader.StdId, (uint32_t)RxHeader.DLC);
for(int i = 0; i < RxHeader.DLC; i++)
{
printf("%x ", RxData[i]);
}
printf("\r\n");
*/
// rx test 용
// printf("CAN1 RX = %x\r\n", RxData);
rx_end_flag = 1;
}
} //---------------------------------------------------
// else (hcan->Instance == CAN2) // CAN2로부터 인터럽트가 왔을 때
// {
//
// }
}