...

반응형

STM32를 사용한 FDCAN 간단한 사용법입니다

FDCAN 통신에 관한 설명은 검색하면 많으니 생략하고 소스만 간단히 설명하려고 합니다

 

초기화 코드는 CUBEMX에서 자동으로 만들어 주니 무시하고 

비트레이트는 계산하기 힘드니 아래 사이트를 참고 하시면 도움이 될듯합니다

http://www.bittiming.can-wiki.info/

 

CAN Bit Time Calculation

The following calculation sheet is mostly useful for classic CAN as defined in ISO-11898 before 2015. For the new CAN FD as defined in ISO-11898:2015 work is in Progress. CiA provides the document CiA 601-3 CAN FD bit-timing recommendations. By providing t

www.bittiming.can-wiki.info

먼저 원하는 ID의 데이터만 받길 원할 경우 필터 설정을 합니다

(필요 없을 경우 하지 않아도 됩니다)

FDCAN_FilterTypeDef sFilterConfig;
FDCAN_TxHeaderTypeDef TxHeader;
FDCAN_FilterTypeDef sFilterConfig;

sFilterConfig.IdType = FDCAN_STANDARD_ID;
sFilterConfig.FilterIndex = 0;
sFilterConfig.FilterType = FDCAN_FILTER_MASK;
sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
sFilterConfig.FilterID1 = 0x123;
sFilterConfig.FilterID2 = 0x125;

if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK) {
	Error_Handler();
}

if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT,
FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK) {
	Error_Handler();
}

// 수신인터럽트 설정
if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE,
		0) != HAL_OK) {
	Error_Handler();
}

 

그리고 보낼 데이터를 설정하고 실제로 보냅니다

uint8_t TxData0[] = { 0x11, 0x32, 0x54, 0x76, 0x98, 0x00, 0x11, 0x22};	// 보낼데이터

// FDCAN 시작
if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK) {
	Error_Handler();
}

// 보낼 데이터 설정
TxHeader.Identifier = 0x123;
TxHeader.IdType = FDCAN_STANDARD_ID;	
TxHeader.TxFrameType = FDCAN_DATA_FRAME;
TxHeader.DataLength = FDCAN_DLC_BYTES_8;	// 데이터 길이
TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
TxHeader.BitRateSwitch = FDCAN_BRS_ON;	
TxHeader.FDFormat = FDCAN_FD_CAN;
TxHeader.TxEventFifoControl = FDCAN_STORE_TX_EVENTS;
TxHeader.MessageMarker = 0x52;
// 데이터 전송
if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData0) != HAL_OK) {
	Error_Handler();
}

 

수신부분은 인터럽트로 받을 수 있습니다

필터링을 하지 않고 전체 다 수신시 헤더를 확인해서 수신 id를 확인할 수도 있습니다

void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs) {
	if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != 0) {
		if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader, RxData)
				!= HAL_OK) {
			Error_Handler();
		}

		if (hfdcan->Instance == FDCAN1) {

			if (RxHeader.Identifier == 0x444) {
				int z = 0;
			}

		} else /* FDCAN2 */
		{

		}

	}
}
반응형