CAN 통신 이전글 :
2023.01.24 - [DSP, MCU/펌웨어공부] - CAN 통신 (Controller Area Network)
CAN Message 타입
- Data Frame
- Remote Frame
- Error Frame
- Overload Frame
이 중 Error Frame 과 Overload Frame 은 컨트롤러가 알아서 처리하므로 프로그래밍 할 때는 주로 Data Frame 과 Remote Frame을 다루게 된다.
Data Frame 의 구조
CAN 버스에 있는 다른 노드들에게 메시지를 브로드캐스트하기 위해 사용된다.
- Start of Frame (1 bit) : 제일 처음 나오는 dominant bit 로 프레임의 시작을 알린다. 또한 송신측과 수신측의 동기화(Syncronization)를 위한 bit이다.
- Arbitration Field (12 bits)
- Identifier (11 bits for Standard CAN) : data frame 의 priority를 결정하는 메시지 ID가 들어간다.
- ID 값이 작을수록 우선순위가 높다.
- RTR (1 bit) : Remote Transmission Request. 해당 프레임이 Data Frame인지 Remote Frame 인지 나타낸다.
- Dominant(0) for Data Frame
- Recessive(1) for Remote Frame
- Identifier (11 bits for Standard CAN) : data frame 의 priority를 결정하는 메시지 ID가 들어간다.
- Control Field (6 bits)
- IDE : frame format 이 standard 인지 extended 인지 나타낸다.
- Dominant(0) for Standard CAN
- Recessive(1) for Extended CAN
- Reserved (1 bit) : must be dominant(0)
- DLC (4 bits) : Data Length Code
- IDE : frame format 이 standard 인지 extended 인지 나타낸다.
- Data Field (0-8 bytes) : payload 가 위치하는 곳으로 최대 8bytes를 넘을 수 없다.
- CRC Field (16 bits)
- CRC (15 bits) : Receiving end에서 Error detection에 사용하며 checksum은 CAN Controller가 자동으로 계산해서 붙이므로 직접 신경쓸 필요는 없다.
- CRC Delimiter : Must be recessive(1)
- ACK (2 bits)
- Acknow. Slot bit (1 bit) : Receiving node에 의해 피드백되는 bit로 수신자는 Frame의 CRC가 매치되고 문제없이 잘 수신(ACK)한 경우 해당 bit를 dominant(0)로 set 한다. 한편, Transmitter 입장에선 이 bit 가 dominant(0) 상태면 송신에 성공했다고 판단할 수 있고, recessive(1)인 경우에는 에러가 있다고 판단하고 자동으로 재전송한다.
- Acknow. Delimiter (1 bit) : Must be recessive(1)
- EOF (7 bits) : Current Frame의 끝을 나타내는 필드로 그 값은 전부 recessive(1)여야 한다.
- IFS (3 bits) : Inter Frame Spacing. 이후로 Bus는 IDLE 상태가 된다.
✔ ACK bit 가 dominant(0)라고 하여 반드시 의도한 디바이스가 수신했으리라 판단할 수는 없다. 다만 버스에있는 노드들 중 하나 혹은 여럿이 성공적으로 수신한 것을 의미한다.
✔ 만약 버스에 Transmitter 한 노드만 있다면 ACK bit는 항상 recessive(1) 일 것이고 어떤 Receiver 가 나타나 dominant(0)로 Override 하기 전 까지는 계속 같은 메시지를 재전송할 것이다.
Standard CAN vs Extended CAN
CAN 2.0 version은 identifier의 길이에 따라 또 다시 아래 두 버전으로 나뉘어진다.
- Standard CAN (2.0A) : Uses 11 bits identifiers
- Extended CAN (2.0B) : Uses 29 bits identifiers
위의 CAN2.0B Format 에서 해당 Frame이 11bit Identifier를 사용하는지 29bit Identifier를 사용하는지를 구별하기 위해 IDE bit 가 존재한다.
IDE bit 가 dominant(0) 인 경우 Standard format message 이고 recessive(1)인 경우 Extended format message 이다.
대부분의 CAN 2.0A를 지원하는 CAN 컨트롤러의 경우 Standard format 메시지만 송수신 가능하다. 반면, CAN 2.0B를 지원하는 CAN 컨트롤러는 Standard format에도 completely compatible하여 두가지 format의 메시지 모두 송수신할 수 있다.
CAN 네트워크에 2.0A와 2.0B 디바이스가 같이 물려있는 경우 2.0B 디바이스가 Extended format을 사용하면 2.0A디바이스에서 메시지를 이해하지 못하고 Error를 낼테니 주의가 필요하다.
Remote Frame
Remote Frame 은 버스에 있는 다른 노드에게 data를 요청하기 위해 사용되며, 가장 큰 특징은 RTR bit가 Recessive(1)인 점과 Data Field가 없다는 점이다.
Remote Frame의 요청을 받은 장치는 ID가 일치하고 해당 메일박스에 자동응답기능이 설정되어 있으면 Data Frame을 보내 응답할 것이다.
하지만 상대방에게 Data를 요청하기 위해 굳이 별도의 Frame으로 보낼 이유가 없기에 최근에는 사용되지 않는다.
Multiple 노드의 Bus Access 방식
CAN 통신방식은 CSMA/CE+AMP 라고 할 수 있다. Carrier-sense, multiple-access protocol with collision detection and arbitration on message priority
CSMA란 각 노드는 메시지를 송신하기 전에 항상 정해진 시간만큼의 recessive 상태 지속을 기다려야함을 의미하고 CD+AMP란 메시지의 identifier priority를 기반으로 충돌을 해결함을 의미한다. Higher priority identifier를 가진 노드가 항상 bus access 에 우선권이 있다.
Multiple 노드가 동시에 메시지를 송신하려고 할 때의 Bus Arbitration 방식을 예시와 함께 살펴보자.
다음 3개의 노드가 존재하고 각각의 Arbitration ID는 다음과 같다.
세 노드가 동시에 CAN bus에 Access 하려고 할 땐, 이 중 가장 낮은 Identifier 값인 0x659를 가진 노드3이 Bus에 대한 priority를 가진다.
아래 그림을 보면 'ID6' bit까지는 세 노드가 계속 경쟁을 한다. 'ID5' bit에선 다른 두 노드는 Identifier가 dominant(0)인 반면 노드2는 recessive(1) 이다. 이전 글에서 설명한 것과 같이 CAN 트랜시버는 송신하는 동시에 loop back으로 듣고 있으므로 본인은 recessive(1)를 내보냈는데 버스가 dominant(0)라면 본인이 Arbitration에서 졌음을 인지하고 즉시 전송을 중지한 뒤 다음에 버스가 IDLE 상태일 때 재전송 시도한다.
노드1의 경우에도 'ID2' bit에서 본인은 recessive를 냈는데 버스가 dominant 상태이니 즉시 전송을 중지하고 Listen 한 뒤 버스가 IDLE일 때 재시도한다.
노드3은 경쟁에서 이겼으므로 데이터를 이어서 전송할 것이다.
Stuffing bit
CAN 통신에서 자신의 상태를 알리는 오류 프레임은 연속된 6개 이상의 같은 비트로 구성되어 있다. 때문에 통신 오류가 아닌 상황에서 연속적으로 같은 신호가 5비트 이상 출력되면, 연속되는 5비트와 반대되는 비트를 끼워 입력하는데 이러한 비트를 Stuffing bit 라고 한다.
이러한 Stuffing bit 는 송/수신 과정 중의 파형에서만 확인할 수 있고 실제 CAN 컨트롤러에 전달될 때에는 수신과정의 Stuffing bit가 제거되어 원래의 신호로 전달 된다.
Error Handling
CAN 프로토콜은 네트워크 전체의 데이터 일관성을 보장하기 위해 에러를 추적해 다른 노드에게 알리고 에러가 많이 발생한 경우 다른 네트워크에 영향을 주지 못하도록 스스로 네트워크에서 bus off 한다.
CAN 컨트롤러 내부에는 TEC(Transmit Error Counter)와 REC(Receive Error Counter)를 가지고 있다. 이 카운터는 에러가 검출되면 8씩 증가하고, 에러없이 송수신에 성공하면 1씩 감소하며 에러 카운터 수에 따라 노드의 에러 상태가 달라진다.
- Error Active State : 초기 상태. 즉 정상 상태이다. 이 상태에서 에러를 감지하면 Active Error Frame(6개의 dominant bit)을 보낸다. TEC>127 or REC>127 인 경우 Error Passive 상태로 전환한다.
- Error Passive State : 해당 노드가 감지한 오류를 통신망 전체에 전역화하는 것을 막기위해 에러 검출 시 소극적으로 대응하는 모드이다. 에러감지 시 Passive Error Frame(6개의 recessive bit)를 전송하며또한 Error Passive 상태에 있는 CAN 컨트롤러는 연속적인 메시지 전송을 못하도록 부가적인 지연시간(Suspend Transmission Time, 8비트)를 갖게 한다.
- Bus off State : TEC > 255 인 경우 Bus off 상태에 돌입하며 CAN 네트워크에서 스르로 이탈하게 된다. (TEC, Transmit Error Count만이 Bus Off를 야기한다) 이 상태를 벗어나려면 호스트의 개입을 통한 reset이 필요하며 또한 통신을 시작하기 전 128 x 11 bits 대기시간을 기다려야 한다.
Error Frame
아래 사진은 Active Error Frame의 모습이고 Passive Error Frame은 반대로 Error Flag 부분이 6개의 consecutive recessive bits로 구성된다.
Error 종류
- Bit Error : 전송된 Bit 상태를 Bus 상에서 관측하여 다른 경우 발생됨. (예를 들어, Recessive를 송신했는데 Dominant가 관측됐을 때) 단, Ack Field, Arbitration Field의 경우는 제외
- Stuff Error : 같은 값을 가지는 Bits가 연속해서 6개 이상인 경우
- CRC Error : 수신된 CRC값이 수신단에서 계산된 값과 다를 때
- Form Error : 각 Field의 Fixed Bit Form에 위배될 때. 예를 들면, EOF, Interframe Space, ACK/ CRC delimiter에서 Dominant Bti가 관측됐을 때
- Acknowlegement Error : 송신단에서 ACK Slot 동안 Dominant Bit을 관측하지 못하는 경우
- Overload Frame : 수신단의 내부 상태가 Next Data Frame/Remote Frame의 전송 지연을 필요로 하는 경우 발생하며, 6개의 연속된 Dominant Bits을 띄우며 Error Frame과 동일한 구조를 갖는다.
Error 검출 예시
Error 프레임은 에러 종류와 발생 구간에 따라 상이한 구조를 갖는다.
ex 1.
Receiver1은 데이터 수신에 문제가 생겨 CRC Error를 감지하면 NACK를 하고, 정상적인 Receiver2의 경우 수신하여 ACK를 한다. Bus level은 ACK Slot이 dominant 상태.
Receiver1은 이후 Error Flag를 띄우고, Sender와 Receiver2는 EOF가 와야할 구간에 dominant가 감지되니까 Form Error로 판단하고 Error Flag를 띄운다. 그리고 Error Delimiter가 뒤따른다.
ex 2.
Transmitter가 데이터를 송신하다 자기가 송신한 bit와 다른 bit가 감지(Bit Error)되면 바로 Error Flag를 띄우고, Receiver 측에선 6개의 연속적인 같은 bit가 감지되면 Bit Stuffing Error로 판단하고 Error Flag를 띄운다. 이이서 Error Delimiter가 따른다.
Reference :
FastBit Embedded Brain Academy
DSP TMS320F28338 기술
https://www.youtube.com/watch?v=_F4RXDFmTQY (Microchip Technology)
'임베디드 개발 > 펌웨어' 카테고리의 다른 글
부트로더 Boot Loader (0) | 2023.02.01 |
---|---|
LSB, MSB (0) | 2023.01.31 |
CAN 통신 (Controller Area Network) (1) | 2023.01.24 |
unsigned int 형 tick 변수가 오버플로우 나는 날 (0) | 2023.01.07 |
링 버퍼 Circular Buffer (0) | 2022.12.30 |