본문 바로가기

전체 글

(134)
3. 초기설정 (3) CAN_HandleTypeDef 구조체 HAL 함수를 분석하기 전에 CAN 컨트롤러를 관리하는 CAN_HandleTypeDef 구조체를 살펴보겠습니다. typedef struct { CAN_TypeDef* Instance; CAN_InitTypeDef Init; CanTxMsgTypeDef* pTxMsg; CanRxMsgTypeDef* pRxMsg; HAL_LockTypeDef Lock; __IO HAL_CAN_StateTypeDef State; __IO uint32_t ErrorCode; }CAN_HandleTypeDef; 일단 구조체는 위와 같습니다만, 구조체 안에 또다른 사용자 정의 자료형이 있어 복잡해 보입니다. 구조체의 내용을 직관적으로 파악하기 위해 그림을 그려봤습니다. HAL드라이버에서 컨트롤+F로 ‘자료형;’을 검색하면 더 자세..
3. 초기설정 (2) CAN_MCR (CAN master control register) CAN_BTR 레지스터에서 한 설정이 버스상의 다른 노드들과 연동되어야 한다면, CAN_MCR 레지스터에서 하는 설정은 노드 개별 설정에 가깝습니다. TTCM (Time Triggered Communication Mode) : 1로 설정하면 CAN 내부 카운터가 활성화 됩니다. CAN 1비트마다 1씩 증가하며, SOF 비트를 탐지하는 순간 카운터 값을 수신의 경우 CAN_RDTx에 송신의 경우CAN_TDTxR에 저장합니다. 신호선 길이에 따른 노드들의 위상차를 CAN 비트 단위로 검사해서 SJW를 조절할 때 쓸 수 있을지 모르겠습니다. 직접 사용해보지는 않았습니다. ABOM (Auto Bus-Off Management) : CAN 프로토콜은 오류가 발생하면 오류 내용에 따라CAN 프로토콜에 정의된 수만큼..
3. 초기 설정 (1) CAN_BTR (CAN bit timing register) CAN 프로토콜도 다른 통신 프로토콜과 마찬가지로 여러가지 전송 옵션을 규정하고 있습니다. 따라서 CAN 컨트롤러가 송수신을 시작하기 전에 어떻게 송수신할 지 미리 설정해 두어야 합니다. 전송 옵션은 CAN_MCR과 CAN_BTR에서 설정할 수 있습니다. 이 두 레지스터에 대한 설명은 CAN 레퍼런스 매뉴얼에 나와있지만 좀 더 전체적인 관점에서 이해할 수 있도록 레지스터의 비트필드의 기능을 간단히 설명한 다음에 CAN 프로토콜, 제가 알고있는 것을 약간 섞어서 다시 설명해 보겠습니다. BRP (Baud rate prescaler) : CAN 컨트롤러에 공급되는 PCLK를 분주하여 타임 퀀텀 주기를 설정합니다. TS1/2 (Time segment 1/2) : 비트 세그먼트1/2에 배정할 타임 퀀텀의 개수를..
2. CAN 통신 흐름 (2) MCU 어플리케이션 – CAN 컨트롤러 MCU 어플리케이션이 제어하는CAN 컨트롤러 내부의 핵심적인 레지스터 구성과 신호의 흐름입니다. 데이터 송수신 과정은 일반적으로 아래와 같습니다. 참고로 아래의 과정은 모드 MCU 어플리케이션에 의해 수행됩니다. CAN 컨트롤러의 프리스칼라, 비트 세그먼트 등을 설정하여 전송 속도, 타임 퀀텀 구성 등 CAN 통신을 할 때 계속 동일하게 사용될 정적인 설정 CAN 컨트롤러가 수신할 필터를 구성 CAN 데이터 프레임에 대응하는 4개의 레지스터로 구성된 TX 메일박스에 유효한 데이터와 그 데이터의 메타데이터를 입력하고, CAN_TI0R 레지스터의 TXRQ(Transmit mailbox request) 비트에 1을 써서 CAN 컨트롤러에게 전송을 명령 CAN 컨트롤러 -> CAN 트랜시버를 거친 신호는 버스를..
2. CAN 통신 흐름 (1) CAN 컨트롤러 - CAN 트랜시버 - 버스 CAN 통신에서 어플리케이션의 구성과 신호의 흐름을 간단하게 설명하겠습니다.CAN 통신의 회로 구성입니다. STM32F091RC는 MCU 내부에 CAN 컨트롤러는 포함하고 있지만, CAN 트랜시버는 따로 구성해야 하고 대부분의 MCU가 그런 것으로 알고 있습니다. 먼저 CAN 통신은 Logic Low(0V)와 Logic High(3.3V) 신호를 사용하는 UART나 SPI와는 다릅니다. CAN RX는 송신에 전혀 관여하지 않으며, CAN 컨트롤러가 CAN 트랜시버에 Logic Low 신호와 Logic High 신호를 전송할 때는 UART, SPI와 동일하게 0V, 3.3V를 사용하지만, CAN 트랜시버가 버스에 데이터를 보낼 때, CAN Low와 CAN High 신호선은 다음과 같은 상태가 됩니다. CA..
1. 개발환경 및 설명 방식 STM32F091RC MCU를 사용하여 실제 CAN 통신을 하는 방법을 위주로 설명을 하였고, 프로토콜의 내용은 설명 중간 중간에 삽입해 두었습니다. 이렇게 하는 이유는 CAN 프로토콜에 관해 자세히 설명되어 있는 책들이 이미 시중에 많이 나와있는 반면에, 실제로 구동해보는 내용은 찾기 어려웠기 때문입니다. CAN 프로토콜에 관해서는 특히, ‘자동차 네트워크 시스템’이라는 책을 추천드립니다. 사토 미치오라는 일본인이 쓴 책인데 CAN 프로토콜에 관해서 정말 쉽고 자세하게 설명하고 있습니다. 또 LIN과 FlexRay 통신에 대한 내용도 수록되어 있습니다. 회로에 대해 몇 개 알아볼게 있어서 관련 책을 찾다가 느낀건데 일반적으로 일본책 번역본들이 한국책보다 쉽고 자세하더라구요. 아무튼 이 글을 읽기 전에 ..