본문 바로가기

CAN

(21)
5. 데이터 송신 (인터럽트 방식) (5) HAL_CAN_IRQHandler와 CAN_Transmit_IT 함수 전송이 완료되면 인터럽트가 발생하면서 CAN_ISR인 HAL_CAN_IRQHandler에 진입하게 됩니다. 송신이 완료되었을 때 뿐만 아니라 수신이 완료된 경우, 오류가 발생한 경우에도 HAL_CAN_IRQHandler에 진입하게 됩니다. 송신과 오류에 의한 진입의 경우에도 인터럽트 소스와 이밴트 상태를 검사하는 방법은 송신과 동일합니다. 여기서는 송신에 대해서만 자세히 알아보고 나머지는 주석처리했습니다. void HAL_CAN_IRQHandler( CAN_HandleTypeDef *hcan ) { /* 송신 완료에 의해 CAN_ISR 진입. */ /* CAN_IER 레지스터의 TMEIE 비트가 셋되어 있다면 */ if (__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_TME)) { /..
5. 데이터 송신 (인터럽트 방식) (3) CanTxMsgTypeDef 구조체 (4) HAL_CAN_Transmit_IT 함수 (3) CanTxMsgTypeDef 구조체 TX 메일박스 레지스터들과 대응되며 TX 메일박스에 들어갈 CAN 프레임에 대한 정보를 임시 저장하는 구조체입니다. CAN_HandleTypeDef 구조체는 CanTxMsgTypeDef형 포인터 변수만 가지고 있기 때문에 사용자가 CanTxMsgTypeDef형의 변수를 만들어서 CAN_HandleTypeDef형 핸들에 직접 연결시켜주어야 합니다. TX 메일 박스에 들어갈 내용을 임시 저장하는 변수이기 때문에 각 맴버 변수들은 TX 메일박스의 필드들과 거의 100% 대응됩니다. (4) HAL_CAN_Transmit_IT 함수 HAL_CAN_Transmit_IT 함수는 다음과 같이 사용됩니다. /* 전송할 데이터 입력 */ hcan.pTxMsg->Data[3] = ..
5. 데이터 송신 (1) 데이터 프레임 (2) 리모트 프레임 더 이상 CAN 프레임에 대해 설명하는 것을 미룰 수 없을 것 같습니다. CAN 통신에는 다음과 같은 4개의 프레임이 사용됩니다. 데이터 프레임데이터를 송신하기 위해 사용되는 프레임.리모트 프레임자신 이외의 버스 상의 어떤 노드에게 데이터 프레임의 송신을 요구할 때 사용되는 프레임.에러 프레임버스의 에러를 검출한 노드에 의해 송신되는 프레임.오버로드 프레임프레임 사이의 여분의 지연을 공급하기 위해 사용되는 프레임. 여기서 에러 프레임과 오버로드 프레임은 CAN 컨트롤러가 자신의 내부 상태를 버스 상태와 비교하여 자동으로 내보내는 것이기 때문에, 사용자는 데이터 프레임이냐 리모트 프레임이냐만 결정할 수 있습니다. 따라서 데이터 프레임과 리모트 프레임에 대해서만 자세히 알아보도록 하겠습니다. 나머지 사항들에..
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로 ‘자료형;’을 검색하면 더 자세..