전체 (154) 썸네일형 리스트형 4. 필터설정 (6) CAN_FilterConfTypeDef 구조체와 HAL_CAN_ConfigFilter 함수 CAN_FilterConfTypeDef 구조체는 CAN에서 사용되는 자료형 중 유일하게 CAN_HandleTypeDef 구조체에 포함되지 않습니다. 즉, 핸들과 독립적으로 작동합니다. 구조체는 다음과 같고 주의해야할 점은 맨 위 4개의 CAN_FiRx 레지스터에 삽입될 값들과 BankNumber 변수입니다. CAN_FiRx 레지스터에 삽입될 값들은 필터 뱅크의 길이 설정에 따라 각 변수의 값이 복사되는 레지스터의 위치가 달라지므로 필터를 설정할 때 특별히 주의가 필요합니다. 그 내용은 HAL_CAN_ConfigFilter 함수 안에서 필터 뱅크의 길이를 설정하는 블록 안에 그림으로 설명해 놓았습니다. 그리고 BankNumber 변수는 설정할 필터 뱅크의 번호가 아님에 주의해야 합니다. 설정할 필터 뱅크의.. 4. 필터설정 (2)~(5) 필터 종류 지금부터 필터 모드와 길이에 따라 각 필터 레지스터가 어떻게 작동하는지 알아보겠습니다. (2) 16비트 필터초기값으로 설정되는 필터 길이 입니다. CAN_FiRx 레지스터는 32비트 레지스터인데 16비트 필터로 설정되면 CAN_FiRx 레지스터를 CAN_FiRx[15:0]과 CAN_FiRx[31:16]을 마치 다른 필터 레지스터처럼 쓸 수 있습니다. 즉, 하나의 필터 뱅크에는 2개의 32비트 필터 레지스터가 들어 있지만, 16비트 필터 레지스터 4개가 들어 있는 것처럼 사용할 수 있다는 의미입니다. 주의할 점은 16비트 필터도 확장 식별자를 필터링할 수 있다는 것입니다. 단, 확장 식별자[17:15]만 검사할 수 있고, 확장 식별자는 비트[17:15]까지만 일치하면 나머지 비트들은 필터 차단에 영향을 미.. 4. 필터 설정 (1) 설정 방법 레퍼런스 매뉴얼에서 필터 레지스터를 보면 32비트를 모두 사용한다고 되어 있습니다. 하지만 식별자는 확장 식별자를 포함해도 최대 29비트입니다. 그럼에도 필터 레지스터가 32비트를 모두 사용하는 이유는 식별자뿐만 아니라 IDE와 RTR 비트도 검사하기 때문입니다. 따라서 사용자는 IDE와 RTR도 고려하여 필터를 설계해야 합니다. 물론 HAL 드라이버는 필터 설정 함수를 제공합니다. 하지만 필터 설정 함수도 식별자와 IDE, RTR 비트를 구분해서 정리해 주진 않습니다. 이건 사용자가 직접 계산해서 알맞은 값을 넣어야 합니다. 그런데 레퍼런스 매뉴얼에 뜬금없이 ‘필터 뱅크’라는 용어가 등장합니다. ‘자동차 네트워크 시스템’ 에서 CAN 프로토콜에 관한 내용을 봤을 때 언급되지 않았던 용어입니다. STM3.. 3. 초기설정 (4) HAL_CAN_Init 함수 일단 HAL_CAN_Init 함수는 다음과 같이 사용됩니다. CAN_HandleTypeDef hcan; /* 전역 변수 */ hcan.Instance = CAN; /* CAN = (uint32_t *)0x40006400. CAN 컨트롤러(페리페럴)의 베이스 주소 */ hcan.Init.Prescaler = 1024; /* CAN -> BTR [BRP] 에 입력되기 위한 버퍼 */ hcan.Init.Mode = CAN_MODE_NORMAL; /* CAN -> MCR [INITRQ/SLEEP] 에 입력되기 위한 버퍼 */ hcan.Init.SJW = CAN_SJW_1TQ; /* CAN -> BTR [SJW] 에 입력되기 위한 버퍼 */ hcan.Init.BS1 = CAN_BS1_3TQ; /* CAN -> B.. 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 트랜시버를 거친 신호는 버스를.. 이전 1 ··· 16 17 18 19 20 다음