해더를 분리시켜야 합니다.
그렇치 않으면 id와 전송 바이트 수가 ca1하고 겹칩니다.
데이터 버퍼는 당연히 분리해야하고요...
CAN_TxHeaderTypeDef TxHeader;
CAN_TxHeaderTypeDef TxHeader2;
CAN_RxHeaderTypeDef RxHeader;
CAN_RxHeaderTypeDef RxHeader2;
// 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 if(hcan->Instance == CAN2) // CAN2로부터 인터럽트가 왔을 때
{
if(HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader2, RxData2) == HAL_OK)
{
// 수신 데이터 RxData 처리
rx_end_flag2 = 1;
}
}
}
// 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);
// Interrupt 방식
// 수신 인터럽트 활성화
if(HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)
{
Error_Handler();
}
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;
}
if(rx_end_flag2 == 1)
{
// 수신 데이터 RxData 처리
uint16_t timestamp = RxHeader.Timestamp;
printf("CAN2 Rx Time = %u, Can2 Rx = %s, ID = 0x%3lX, DLC=%d\r\n", timestamp, RxData2, (unsigned long)RxHeader2.StdId, RxHeader2.DLC);
rx_end_flag2 = 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 */
}