CAFE

한국직업능력교육원

[ARM 실습 103] CAN1 IRQ, CAN2 IRQ LoopBack 동시동작 시키기

작성자송명규|작성시간26.06.23|조회수11 목록 댓글 0

해더를 분리시켜야 합니다.

그렇치 않으면 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 */

}

다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼