CAN baudrate 설정하기
CAN은 최대 1Mbps까지 지원하는 고속 통신으로 보통 125Kbps~1000Kbps의 baudrate를 많이 사용합니다.
STM에서 CAN을 사용할때 Baudrate의 설정은 조금 까다롭습니다.
UART처럼 baudrate를 그대로 쓰면되는것이 아니고, 내부 PCLK에 따라 Prescaler와 BS의 값을 넣어줘야 합니다.
void MX_CAN_Init_1M(void)
{
hcan.Instance = CAN1;
hcan.Init.Prescaler = 4;
hcan.Init.Mode = CAN_MODE_NORMAL;
hcan.Init.SJW = CAN_SJW_1TQ;
hcan.Init.BS1 = CAN_BS1_6TQ;
hcan.Init.BS2 = CAN_BS2_1TQ;
hcan.Init.TTCM = DISABLE;
hcan.Init.ABOM = ENABLE;
hcan.Init.AWUM = DISABLE;
hcan.Init.NART = DISABLE;
hcan.Init.RFLM = DISABLE;
hcan.Init.TXFP = DISABLE;
if (HAL_CAN_Init(&hcan) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
저의 경우 부팅시 속도를 선택하게 되는데 위의 코드에서 Prescaler, BS1, BS2의 값에 따라 CAN의 baudrate를 설정해 줄 수 있습니다.
구글링을 하다보면 ST의 데이터시트에 나와있는 설정방법이 있습니다.
하지만 위의 그림을 보고 설정을 하는것은 여간 까다로운 것이 아닙니다.
좀 더 검색을 해보면 계산기가 나옵니다.
위 사이트로 가보시면 많은 MCU 칩셋들의 설정 방법이 나오고, MCU제조사를 선택한 후 빈칸에 값을 고정값을 넣어주시면 자동으로 변수의 값이 출력됩니다.
저의 경우 ST를 선택한 후, 사용 클럭인 32Mhz, 그리고 baudrate를 1000kbps로 설정한 후 Request Table을 클릭합니다.
샘플포인트는 87.5%면 괜찮습니다. 그리고 SJW는 기본 1로 설정합니다.
결과 테이블을 보시면 Prescaler는 2또는 4, BS1은 36 또는 6, BS2는 2또는 1로 나왔습니다.
저는 아래의 수치를 사용하여 구현하였습니다.
CAN Analyzer를 사용하여 데이터를 보내보니 정상적으로 응답데이터가 오는걸 확인할 수 있습니다.
추가로 한가지 더 간단한 계산기가 있습니다.
네이버카페 EMBEDDED CRAZY BOYS에 천동이님이 올리신 STM32 CAN Bitrate 계산기를 사용하시면 STM전용 Baudrate를 계산하실 수 있습니다.
위 링크로 들어가시면 계산기를 받으실 수 있습니다.
역시 BS1, BS2, Prescaler값이 자동으로 추출되어 나와 쉽게 적용하실 수 있습니다.
위 네이버 자료는 따로 자료 사용승인을 받은게 아니라 프로그램을 따로 공유하지는 않겠습니다. 또한 문제가 되면 내용도 삭제하겠습니다.
이제 쉽게 CAN Baudrate를 설정해보세요^^