CAN

Pages List
List view
Home
Portfolio
HW
FW
SW
FPGA / Adaptive SoC
Daily
Photo
Etc
 
STM32 Peripheral

CAN


notion image

Controller Area Network (CAN) Fundamentals


이번 장에서는 CAN의 다음과 같은 내용들을 다룬다.
notion image
 
 

CAN protocol의 개요


notion image
 
 

CAN의 특징


notion image
 
notion image
 
notion image
 
notion image
MCU의 Single-ended 신호 CAN_Tx, CAN_Rx은 바로 CAN bus에 연결할 수 없는데, CAN Bus에 연결되는 신호는 반드시 Differential 신호이어야 하기 때문이다.
그래서, 각 Node의 Single Ended 신호 CAN_Tx, CAN_Rx는 CAN Transceiver를 통해서 Differential 신호인 CANH와 CANL로 변환되고, 이 신호들은 CAN Bus에 연결된다.
 
다음은 Single-ended 신호와 Differential 신호의 일반적인 개념 설명이다.
notion image
Single-ended 방식은 1개의 신호로 Data를 전송하지만, Differential 방식은 2개의 신호로 Data를 전송한다.
Differential 방식에서는 두 신호의 차를 기준으로 High(+10V) 또는 Low(-10V)를 판단하기 때문에, 두 신호에 공통으로 포함되어 있는 Noise의 영향을 제거할 수 있다.
 
이제 CAN protocol의 Differential 신호를 살펴보자.
notion image
Tranceiver가 CANH, CANL를 만들어낸다. (서로 Complementary관계이다.)
  • Logic 1 : Tranceiver는 CANH 신호와 CANL 신호를 Nominal 전압(대략 2.3[V])으로 만든다. Difference는 0[V]. 이 때, CAN Bus의 state를 Recessive라고 한다.
  • Logic 0 : Tranceiver는 CANH 신호를 3.3[V]로 만들고, CANL 신호를 1.25[V]로 만든다. Difference는 대략 2[V] 이다. 이 때, CAN Bus의 state를 Dominant라고 한다.
 
다음은 CAN Tranceiver의 Block diagram이다.
notion image
만약 D=1이면, CANH와 CANL은 Recessive state가 되고, Difference는 0[V]가 된다.
반대로 D=0이면, CANH와 CANL은 Dominant state가 되고, Difference는 2[V]가 된다.
 
다음으로 2개 이상의 Node가 CAN Bus에 연결되어 있을 때, CAN Bus state를 살펴보자.
notion image
CAN Bus에 연결된 Node중에 하나라도 Dominant한 Node가 있다면, 다른 Node들은 CAN Bus에 Access할 수 없다.
7번의 Recessive state를 확인해야 CAN Bus에 Access할 수 있다.
(IFS까지 포함하면, 10번의 Recessive state를 확인한 후에 CAN Bus에 data를 올릴 수 있다.)
 
notion image
 
 

CAN frame formats


notion image
CAN에는 총 4개의 Message Type이 존재한다.
Data Frame과 Remote Frame은 우리가 직접 사용하지만, Error Frame과 Overload Frame은 CAN Controller가 자동으로 사용한다.
(Error를 검출한 경우, CAN protocol의 Signaling rule을 위반하는 경우 등)
 
 

Data Frame


Data Frame을 살펴보자.
notion image
Data Frame은 CAN Node가 다른 Node에 message를 보낼 때, 사용하는 Frame format이다.
 
Data Frame Format은 다음과 같이 다양한 Field로 구성되어 있다.
notion image
간략하게 설명해보면,
Data Field에 송신하고자 하는 Data를 넣는데, 최대 8byte까지 가능하다.
그리고 ACK bit는 수신 Node에 의해서 Dominant로 set된다.
Transmitter는 ACK bit가 Dominant state이면, message 송신이 성공적으로 이루어졌다고 판단한다.
반대로 ACK bit가 Recessive state이면, message에 Error가 있다고 판단하고 자동으로 message를 다시 송신한다.
End of Frame은 7번의 Recessive state로 구성되어 있고, 이어서 3번의 Inter frame spacing이 따라온다. (3번의 Recessive state)
 

① Arbitration Field

notion image
Arbitration Field는 앞의 11개의 bit로 message의 priority를 결정하고, 값이 작을수록 Priority가 높다.(마지막 1bit는 Request Remote bit : RTR bit로 항상 Dominant state이다.)
 
notion image
Standard CAN은 Arbitration Field에서 11bit를 identifier로 사용하지만, Extended CAN은 29bit를 identifier로 사용한다.
Standard CAN Controller는 오직 Standard format의 message만 주고 받을 수 있지만, Extended CAN Controller는 Standard format message와 Extended format message 모두 주고 받을 수 있다.
STM32F4의 CAN Controller는 Extended CAN Controller (bxCAN : Basic Extended CAN) 이다.
 
Standard CAN과 Extended CAN의 차이는 다음과 같다.
notion image
Standard CAN Controller는 Extended format message를 해석할 수 없기 때문에, CAN network에 두 종류의 CAN Controller가 연결되어 있다면, Error가 발생하지 않게 잘 설정해주어야 한다.
 
다음은 Extended Frame Format를 구성하는 Field이다.
notion image
Arbitration field의 IDE bit는 Standard frame과 Extended frame을 구별하는데 사용되는 bit이다.
IDE bit가 Recessive state로 송신되면, 수신하는 Node에서는 해당 Frame을 Extended frame으로 간주한다.
반대로 IDE bit가 Dominant state로 송신되면, 수신하는 Node에서는 해당 Frame을 Standard frame으로 간주한다.
 
이제 RTR bit에 대해 알아보자.
notion image
Date Frame에서는 RTR bit를 신경 쓸 필요가 없다.
Frame을 Data Frame으로 설정하면, Controller가 자동으로 RTR bit를 dominant로 만든다.
Dominant한 RTR bit는 해당 message가 Data Frame이라는 것을 의미한다.
그러나 Remote Frame의 경우에는 RTR bit를 Recessive로 만드는데, 이는 해당 message가 Remote Frame임을 알려준다.
Remote Frame은 어떤 Node가 Bus에 연결된 다른 Node에 Data를 요청할 때 사용된다.
(그래서 Remote Frame에는 Data Field가 존재하지 않는다.)
 

② DLC, Data and CRC Fields

notion image
DLC (Data Length Code)는 4bit로 구성되고, Data field에 넣을 data의 길이를 의미한다.
CRC는 수신한 message의 무결성을 확인하는데 사용하는데,
Reciever는 message를 수신하면, CRC를 자동으로 계산하고 Transmitter가 보낸 CRC와 비교해서 Error가 발생했는지 확인한다.
 

③ ACK bit

notion image
CRC match가 성공적으로 이루어지면, Receiving Node는 ACK slot에서 Bus의 state를 Dominant로 만든다. 그러면 Transmitter는 최소 1개의 Node가 message를 정상적으로 수신했다고 판단한다.
그러나 ACK slot에서 Bus의 state가 Recessive하다면, Transmitter는 Error가 발생했다고 판단하고 해당 message를 다시 송신한다.
 
notion image
Transmiter가 ACK bit를 확인했다는 것은 해당 Transmitter가 의도한 Node의 message 수신을 의미하지는 않는다.
Transmitter가 송신한 message를 CAN Bus에 연결된 임의의 Node가 성공적으로 수신했음을 의미할 뿐이다.
(해당 Node가 Transmitter가 message의 도착점으로 생각했던 Node인지 아닌지는 모른다.)
 
notion image
온전한 message를 수신한 모든 Node는 기존 message의 Recessive bit를 Dominant bit로 overwrite한다. 이는 error가 없는 message임을 가리킨다.
만약 Node가 해당 message의 error를 검출하면, message의 Recessive bit를 그대로 남겨두고 message를 삭제한다. 그리고 송신 Node는 re-arbitration 이후에 해당 message를 다시 송신한다.
이러한 방식으로 각 Node들은 data의 무결성을 확인한다.
ACK은 2bit로 구성되는데, 하나는 Acknowledgement bit이고, 다른 하나는 delimiter이다.
모든 Receiver들이 message의 목적지인지 아닌지 여부와는 무관하게 Acknowlegement algorithm에 참여하기 때문에, Transmitter가 의도한 Receiver의 네트워크 존재 여부와는 상관없이 ACK이 발생할 수 있다.
CAN Acknowledgement는 Transmitter가 의도한 Receiver의 message 수신을 보장하지는 않고, 오로지 Network에 존재하는 모든 Node들이 해당 CAN message가 Data Link Layer rules을 지켰음을 확인한 사실만 알 수 있다.
 

④ End of Frame and IFS

notion image
ACK field의 뒤에 End of Frame이 나타나는데, End of Frame은 7개의 Recessive state의 집합이다.
End of Frame 뒤에는 IFS(Inter Frame Spacing)이 나타난다. IFS는 3개의 Recessive state의 집합이다.
그래서 결과적으로 End of Frame과 IFS를 합쳐서 총 10개의 Recessive state가 존재한다.
Bus에 귀를 기울이고 있던 Node들은 이 10개의 Recessive state가 Bus에 뜨면, Bus가 idle 상태라고 생각한다. 이 때, 임의의 Node들 중 하나는 data를 Bus에 올릴 수 있다.
 

⑤ Start of Frame (SOF)

notion image
Idle 상태의 Bus를 통해 Data를 보내고 싶을 때, Node는 가장 먼저 Frame의 시작을 의미하는 SOF(Single Dominant bit)를 Bus에 올린다.
 
notion image
 
 

Remote Frame


notion image
Remote Frame은 다른 Node에게 data를 요청하는 목적으로 사용되는데, Data Frame과는 2개의 큰 차이점이 존재한다.
하나는 Arbitration field의 RTR bit가 Recessive로 나타난다는 것이고, 다른 하나는 message에 data가 존재하지 않는다는 것이다.
 
notion image
 
notion image
 
 

CAN Bus Arbitration


notion image
Bus의 Node들은 End of Frame과 IFS의 연속적인 Recessive state를 보고, Bus가 Idle 상태인지 아닌지를 알 수 있다.
Bus가 Idle 상태에서 다수의 Node들이 동시에 Bus에 Access하려고 하면, identifier field의 priority가 높은 message가 Bus를 점유하게 된다.
다음과 같은 3개의 Node중에서 Node-3가 Bus Arbitration에서 이기게 될 것이다.
(낮은 값의 Arbitration ID일수록 priority가 더 높다.)
 
notion image
 
다음은 Bit-wise Bus Arbitration의 과정을 설명한 것이다.
notion image
Bus가 Idle인 상태에서, 모든 Node들이 message를 보내기 위해 SOF를 Bus에 올린다.
그리고 Arbitration ID의 MSB부터 Bus에 올리기 시작한다. (모든 Node가 Recessive bit를 보내면, CAN Bus는 Recessive state가 되고, 최소 하나의 Node가 Dominant bit를 보내면, CAN Bus는 Dominant state가 된다.)
6th bit까지는 모든 Node들의 Arbitration ID가 동일하지만, 5th bit에서는 Node-2만 Arbitration ID가 Recessive bit이고, 나머지 Node들은 Dominant bit이다.
Node-2는 자신이 Recessive bit를 보냈지만 Bus가 Dominant state임을 보았기 때문에, 자신이 Bus Arbitration에서 탈락한 것을 알게 되고 Listen only mode에 진입하게 된다.
마친가지 이유로 Arbitration ID의 2th bit에서도 Node-1이 Bus Arbitration에서 탈락하게 되고, Bus Arbitration에서 승리한 Node-3는 Arbitration field의 나머지 bit들과 data를 Bus에 올린다.
 
 

STM32 bxCAN Introduction


notion image
notion image
CAN은 Multi-Master Communication protocol이지만, ST는 CAN1를 SRAM에 Direct Access가 가능하게 설계했고 CAN2는 불가능하게 설계했다. (그래서 CAN2를 사용하려면, CAN1을 Enable 시켜야 한다.)
 
notion image
 
notion image
 
BxCAN이 정상적으로 동작하는지 Test하기 위한 Mode들을 살펴본다.
notion image
 

① Silent Mode

notion image
CAN_Tx를 Recessive state로 유지해서 CAN Bus의 state에 영향을 주지 않는다.
그저 CAN Bus의 message를 수신할 수 있을 뿐이다.
 

② Loop Back Mode

notion image
bxCAN은 CAN Bus에 message를 송신할 수 있지만, CAN Bus의 message를 수신할 수는 없다. 단지 CAN Bus로 송신한 message를 다시 수신할 수 있을 뿐이다.
 

③ Silent Loop Back Mode

notion image
bxCAN이 CAN Bus로부터 완전히 분리되어 있는 Mode이다.
CAN Bus로 message를 보낼 수도 수신할 수도 없다.
Tx가 내부적으로 Rx에 Loop Back되기 때문에, 자신이 송신한 message만 들을 수 있다.
 
 

CAN Bit Timings


CAN의 1bit는 segments 또는 Time quantas 들로 이루어져 있다.
notion image
 
CAN의 동작속도가 25MHz라면, 1 Time quanta = 1/25M = 0.04[us] 이다.
notion image
Bit duration을 증가시키면(각 segment당 TQ를 증가시키면), Transmission Error를 줄일 수 있다. 그래서 신호를 더 먼 곳까지 전달할 수 있지만, Bus의 Throughput은 감소한다.
반대로 Bit duration을 감소시키면, Transmission Error가 증가하기 때문에 신호를 먼 곳까지 전달할 수 없다. Bus의 Throughput은 증가한다.
다음은 ST의 bxCAN을 25MHz로 설정했을 때, 선택가능한 Bit rate와 이에 대응하는 Prescaler값 그리고 Time quanta의 목록이다.
 
notion image
 
 

CAN Tx


bxCAN의 Tx는 다음과 같은 순서로 이루어진다.
notion image
message를 송신하는데 사용되는 3개의 Transmit mailbox가 존재한다.
Transmission Scheduler는 3개의 mailbox중 어떤 mailbox를 먼저 송신할지를 결정한다.
Application은 message를 송신하기 위해서 비어있는 하나의 mailbox를 선택하고, Identifier, data length code, data를 준비한다. 그리고나서 Transmission을 요청한다.
Transmission 요청은 Control 레지스터의 TXRQ bit를 set함으로써 수행된다.
TXRQ bit가 set되는 즉시, mailbox는 pending 상태로 진입하고, 가장 높은 priority의 mailbox가 될 때까지 대기한다.
 
notion image
mailbox가 가장 높은 priority가 되면, Transmission을 준비한다.
CAN Bus가 idle상태가 될 때, scheduled된 mailbox의 message는 Transmit된다.
(mailbox의 message가 성공적으로 Transmit되면, 해당 mailbox는 다시 empty 상태가 된다.)
Hardware는 CAN_TSR 레지스터의 RQCP, TXOK bit를 set함으로써 Transmission이 성공적으로 완료되었음을 Application에게 알려준다.
그러나 만약 Transmission이 실패하면, 그 원인은 CAN_TSR의 ALST(Arbitration Lost) bit 또는 TERR(Transmission Error detection) bit로 Application에게 알려준다.
 
다음 그림은 위에서 설명한 Transmission과정을 그린 diagram이다.
notion image
 
다음은 Tx message의 Header와 관련된 Configuration 구조체이다.
notion image
 
message의 Transmission은 ‘HAL_CAN_AddTxMessage’ API를 사용한다.
notion image
 
 

예제 1) CAN LoopBack Test (Tx)


notion image
notion image
 
notion image
bxCAN은 Reset 직후에는 Sleep mode 상태이기 때문에, 위 그림처럼 SLEEP bit를 Clear해서 Initializaiton mode에 진입해야 한다. (이는 ‘HAL_CAN_Init’ API에서 수행한다.)
bxCAN은 Initialization mode에서 아무것도 할 수 없으므로 정상적인 CAN 통신을 수행하기 위해서는 Normal mode에 있어야 한다.
그리고 Initialization mode에서 Normal mode로 진입하기 위해서는 INRQ bit를 Activate해야 한다.
(이는 ‘HAL_CAN_Start’ API에서 수행한다.)
 
notion image
 
notion image
notion image
notion image
notion image
notion image
notion image
notion image
 

[ 결과 ]

notion image
위 측정 결과는 CAN Transceiver의 CANL에서 얻었다. KIran은 CANH를 찍으라고 했는데, CANL이 Kiran의 측정결과와 동일하게 나타났다. (Transceiver의 CANH 실크와 CANL의 실크가 뒤바뀌어있나?) 그리고 안타깝게도 오실로스코프가 CAN 파형 디코드 기능이 없었다.
 
 

CAN Rx


notion image
CAN message는 CAN Rx Pin을 통해 들어와서 Acceptance Filter banks에서 Filtering Rule을 충족하는지 검사를 받는다.
만약 message가 Filtering Rule을 충족한다면, 여러 FIFO중 하나를 차지하게 되고 Application이 message를 읽도록 Interrupt를 발생시킨다.
반대로 message가 Filtering Rule을 충족하지 못한다면, CAN Receiver engine이 해당 message를 삭제한다.
CAN은 Broadcasting 타입의 통신 프로토콜이기 때문에, 위와 같이 User가 사전에 설정한 Filtering Rule이 반드시 필요하다. 그렇지 않으면, 나와 관련없는 message 때문에 Processor에 Interrupt가 계속 걸릴 것이다.
 
다음은 ST의 bxCAN의 Rx Path에 대한 내용이다.
notion image
 
Rx Filtering의 자세한 내용은 다음과 같다.
notion image
 
Acceptance Filtering의 자세한 내용은 다음과 같다.
notion image
 
notion image
Filter Banks는 총 28개가 존재하고, 각 Filter Bank는 2개의 32bit 레지스터를 갖는다.
 
 

bxCAN Frame Filtering


다음은 Frame Acceptance Rules의 예시이다.
notion image
위와 같은 Rule들을 기준으로 bxCAN의 두 가지 Filtering mode들을 살펴보자.
 

① Mask Mode

notion image
Mask modes는 첫 번째, 두 번째, 네 번째, 다섯 번째 Rule에 적용할 수 있다.
Mask mode에서는 R1 레지스터는 Identifier 레지스터로, R2 레지스터는 Mask 레지스터로 사용된다.
  1. 첫 번째 Rule : Mask 레지스터의 msb 3개를 1로 설정한다. 그리고 수신된 message의 identifer를 Mask 레지스터로 Masking한 결과가 Rule을 충족하는지 확인한다.
  1. 두 번째 Rule : Mask 레지스터의 msb 3개를 1로 설정하고, lsb 2개를 1로 설정한다. 그리고 수신된 message의 identifer를 Mask 레지스터로 Masking한 결과가 Rule을 충족하는지 확인한다.
  1. 네 번째 Rule : Frame의 RTR bit가 1 (Recessive)이면 해당 Frame이 Request Frame이다. 따라서, Mask 레지스터의 RTR bit position을 1로 설정한다. 그리고 수신된 Frame의 RTR bit를 Mask 레지스터로 Masking한 결과가 Rule을 충족하는지 확인한다.
  1. 다섯 번째 Rule : Frame의 IDE bit가 1 (Recessive)이면 Extended ID Frame이고, 0 (Dominant)이면 Standard ID Frame이다. 따라서, Mask 레지스터의 IDE bit position을 1로 설정한다. 그리고 수신된 Frame의 IDE bit를 Mask 레지스터로 Masking한 결과가 Rule을 충족하는지 확인한다.
 
Rule을 충족하는 message는 FIFO로 이동되고, 그렇지 않은 message는 삭제된다.
 

② List/ID Mode

notion image
List/ID mode는 세 번째 Rule에 적용할 수 있다.
List/ID mode에서 R1과 R2는 Identifier 레지스터로 사용되는데, 수신된 message의 identifier 값이 R1 또는 R2의 설정값과 동일해야 FIFO로 이동된다. (둘 중에 하나랑 같으면 Pass, 아니면 discard)
 
notion image
 
 

예제 2) CAN LoopBack Test (Rx)


notion image
notion image
CAN Rx의 경우에는 앞에서 설명한 것처럼 Filter 설정 또한 해주어야 한다.
 
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
 

[ 실행 결과 ]

notion image
CAN Tx로 보낸 message가 Rx로 LoopBack되어 수신됨을 확인할 수 있다.
 
 

CAN Interrupt


notion image
bxCAN은 다음과 같은 상황에서 Interrupt를 발생시킨다.
 
notion image
 

Transmit Interrupt

notion image
  • RQCPx : Mailbox의 Transmit Request가 완료되었을 때, CAN_TSR 레지스터의 RQCPx bit가 set되면서 Transmit interrupt가 발생한다. (RQCPx는 각각의 mailbox의 Transmit Request Complete를 의미한다.)
 

FIFO Interrupt

notion image
  • FMP : 새로운 message가 수신되고, CAN_RF0R 레지스터의 FMP bits가 ’00’이 아니면 FIFO interrupt를 발생시킨다.
  • FULL : FIFO0가 가득차면 CAN_FR0R 레지스터의 FULL0 bit가 set되는데, 이 때 FIFO interrupt를 발생시킨다. (각 FIFO는 최대 3개의 message를 pending 시킬 수 있다.)
  • FOVR : FIFO에 overrun이 발생하면 CAN_RF0R 레지스터의 FOVR bit가 set되는데, 이 때 FIFO interrupt를 발생시킨다. (FIFO가 3개의 message로 가득 차 있을 때, 새로운 message가 Filter를 통해 들어오면 FIFO overrun이 발생한다.)
 

Status change and Error Interrupt

notion image
  • EWGF, EPVF : Vendor를 불문하고 모든 CAN controller는 Receive Error counter 또는 Transmit Error count를 갖는데, Error가 발생할 때마다 count값이 증가한다. 이 count값이 설정값보다 많아지면, Interrupt를 통해 Application에게 해당 내용을 알려준다. 그리고 count값이 최대값인 255에 도달하면, 해당 Node는 Faulty로 간주되어 CAN Bus에서 off된다.
  • BOFF : Bus-off state에 진입하면 Hardware에 의해 BOFF bit가 set된다. Bus-off state는 Node가 Bus에 연결되어 있지만 Transmit 또는 Receive를 하지 않는 상태를 말한다. TEC overflow(Transmit Error counter가 255에 도달)가 발생할 때, Node는 Bus-off state가 된다.
  • WKUI : CAN hardware가 Sleep mode일 때, SOF bit가 검출되면 자동으로 wake-up할 수 있다.
 
 

예제 3) CAN LoopBack Test with Interrupt


notion image
Interrupt 방식으로 LoopBack Test를 할 것이므로 필요한 Interrupt에 대한 NVIC setting을 위와 같이 수행한다.
 
notion image
CAN start 하기 전에 ‘HAL_CAN_ActivateNotification’ API로 CAN의 Interrupt들을 Enable 해주어야 한다.
 
notion image
notion image
Interrupt 방식으로 CAN Tx를 하기 때문에, 지정한 Mailbox의 message가 송신 완료되었는지 while문으로 기다릴 필요가 없다. 송신이 완료되면, 위와 같은 Callback API가 호출된다.
 
notion image
Interrupt 방식에서는 Polling 방식에서 사용했던 ‘CAN1_Rx’ API가 더 이상 필요하지 않다.
message가 수신될 때, 발생하는 Interrupt의 Callback API에서 ‘CAN1_Rx’의 작업을 수행하면 되기 때문이다.
 

[ 실행 결과 ]

notion image
 
 

CAN Normal Mode


notion image