CAFE

한국직업능력교육원

[ARM 실습 102] CAN1 IRQ, CAN2 폴링 LoopBack 동시동작

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

 

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로부터 인터럽트가 왔을 때

// {

//

// }

}

 

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

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼