본문 바로가기

CAN

3. 초기설정 (2) CAN_MCR (CAN master control register)

can_mcr ttcm abom awum nart rflm txfp sleep inrq

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 프로토콜에 정의된 수만큼 CAN_ESR 레지스터에 있는 오류 카운터가 증가합니다. 참고로 송신 오류 카운터와 수신 오류 카운터가 따로 구성되어 있습니다. 그리고 송신 오류카운터가 255를 초과하면 해당 노드가 네트워크에서 빠져나가는 버스 오프 상태가 됩니다. 오류가 발생한 하나의 노드가 네트워크 전체를 손상시킬 수 있기 때문이죠. CAN 프로토콜에서는 버스 오프 상태를 빠져나갈 수 있는 조건을 정의하고 있습니다. 연속적인 리세시브 11비트를 128회 수신해야 빠져나갈 수 있습니다. 주의할 것은 11 x 128 = 1,408회가 연속적으로 발생해야 하는 것이 아니라는 것입니다. 이 과정을 CAN 컨트롤러에게 자동으로 맡기고 싶을 때 1로 설정하면 됩니다. 0으로 설정하면, 사용자가 CAN_MSR 레지스터의 RX비트를 모니터하여 이 과정을 직접 설정해야 합니다. 자세한 내용은 7장에서 알아보겠습니다.
  • AWUM (Auto Wakeup Mode)
    : 0으로 설정하면 사용자가 직접 해당 레지스터의 SLEEP 비트를 클리어하여 슬립 모드를 빠져나가야 합니다. 1로 설정하면 버스에서 CAN 메시지가 감지되었을 때, 자동으로 슬립 모드를 빠져나옵니다.
  • NART (No Automatic Retransmission)
    : CAN 프로토콜은 기본적으로 전송 실패시 자동으로 재전송하되, 자동으로 재전송하지 않는 옵션도 두고 있습니다. 이 비트를 1로 설정하면 자동 재전송이 수행되지 않습니다. 저는 이 비트를 1로 설정하여 테스트를 했습니다. 0으로 설정하면 오류가 발생했을 때 엄청나게 빠른 속도로 재전송을 하기 때문에 제가 인지하기도 전에 버스 오프 상태에 진입했기 때문입니다.
  • RFLM (Receive FIFO Locked Mode)
    : 새로 수신된 데이터를 수신할지 말지 결정합니다. 1이 쓰여져 있는 경우 RX FIFO에 메시지가 꽉 찼을 때, 새로 들어온 데이터를 무시합니다. 0일 경우 새로 들어온 데이터를 RX FIFO에서 가장 마지막에 들어온 데이터에 덮여 쓰여지게 됩니다. 즉, 제일 먼저 도착한 메시지와 그 다음에 도착한 메시지는 그대로 유지됩니다. 이것은 디버깅을 통해 확인한 내용입니다. 더 자세한 내용은 수신 파트에서 설명하겠습니다.
can_ri can_rdt can_rl can_rh can rx fifo

 

  • TXFP (Transmit FIFO Priority)
    : TX가 3개의 메일박스로 구성되어 있지만 이것을 FIFO라고 할 수 있는지는 모르겠습니다. 아무튼 TX 메일박스는 UART와 같이 데이터를 TX 레지스터에 입력한다고 바로 전송되는 것이 아닙니다. 데이터와 메타데이터를 메일박스에 채워 넣고, 메일박스 레지스터 중 하나인CAN_TI0R 레지스터의 비트0인 TXRQ비트에 1을 써서 CAN 컨트롤러에게 전송을 명령해야 전송이 시작됩니다. 이것은 TXFP 비트가 0이든 1이든 마찬가지 입니다. 단지 자신에 의해서 또는 다른 노드에 의해서 어떤 전송이 진행중인데 2개 이상의 전송을 TXRQ비트에 1을 써서 전송을 팬딩시켰을 때, 어떤 메일박스가 먼저 전송될지 결정합니다. 1이면 TXRQ가 셋된 메일박스 순서로 전송이 시작되고, 0이면 식별자가 낮은(우선순위가 높은) 순서로 전송이 시작됩니다. 주의할 것은 이것은 2개 이상의 전송이 팬딩되었을 때만 의미가 있다는 것입니다.
  • SLEEP (Sleep mode request)
    : 1로 설정하면 슬립 모드로 진입하고 진입이 완료되면, CAN_MSR 레지스터의 SLAK 비트가 1로 셋됩니다.
  • INRQ (Initialization Request)
    : SLEEP 비트와 마찬가지로 1로 설정하면 초기화 모드로 진입하고 진입이 완료되면 CAN_MSR레지스터의 INAK 비트가 1로 셋됩니다. 지금까지 설명한 초기 설정은 모두 INRQ 비트를 1로 설정해서 초기화 모드로 진입해서 설정해야 합니다. 레퍼런스 매뉴얼을 보면 초기화 모드에서 설정해야 하는 레지스터가 더 자세하게 나와있습니다. 그리고 주의할 것은 필터 설정도 초기화 모드에서 해야 하는데 컨트롤러 초기화 모드와 달리 CAN_FMR레지스터의 FINIT비트를 1로 설정하여 컨트롤러 초기화 모드와 구분되는 필터 초기화 모드로 진입해서 설정해야 합니다.