정의
CAN 프레임은 CAN이 데이터를 실어 나르는 전송 단위다. 식별자 길이에 따라 표준 포맷(11비트)과 확장 포맷(29비트)으로, 데이터 필드 유무에 따라 데이터 프레임과 리모트 프레임으로 갈린다.[1]
버스에 올라가는 것은 낱개의 비트가 아니라 정해진 순서로 묶인 비트 열이다. 어디서 시작하고 어디서 끝나는지, 어느 자리가 식별자이고 어느 자리가 데이터인지, 검사값은 어디에 붙는지가 고정돼 있어야 여러 노드가 같은 해석에 도달한다. 그 고정된 틀이 프레임이며, 데이터 링크 계층을 규정하는 ISO 11898-1[2]이 그 틀을 정한다.
프레임 종류
CAN이 정의하는 프레임은 데이터 프레임, 리모트 프레임, 에러 프레임, 오버로드 프레임 넷이다.[3] 이 가운데 응용 데이터를 나르는 것은 데이터 프레임이고, 리모트 프레임은 같은 식별자의 데이터 프레임을 요청한다. 에러 프레임은 오류를 알려 진행 중인 전송을 무효로 만든다. 오버로드 프레임은 수신 노드가 다음 프레임을 미뤄야 하거나 인터미션에서 dominant 비트가 관측됐을 때 앞뒤 프레임 사이에 여분의 지연을 넣는다. 에러 플래그와 같은 dominant 6비트 플래그와 recessive 8비트 구분자로 이뤄지고, 다음 프레임을 미루는 데 연달아 두 번까지만 쓸 수 있다.
데이터·리모트 프레임은 두 축으로 갈린다. 한 축은 식별자 길이이고, 다른 축은 데이터 필드 유무다. 두 축을 가르는 비트가 각각 프레임 안에 들어 있다.[1]
| 축 | 갈래 | 가르는 비트 |
|---|---|---|
| 식별자 길이 | 표준 포맷(11비트) / 확장 포맷(29비트) | IDE |
| 데이터 필드 | 데이터 프레임 / 리모트 프레임 | RTR |
표준 포맷 데이터 프레임
표준 포맷 데이터 프레임은 프레임 시작(SOF), 중재 필드, 제어 필드, 데이터 필드, CRC 필드, ACK 필드, 프레임 끝(EOF)의 일곱 구간으로 이루어진다.[3]
| 필드 | 길이 | 역할 |
|---|---|---|
| SOF | 1비트 | dominant 비트 하나로 프레임 시작을 알린다 |
| 식별자 | 11비트 | 프레임 내용을 가리키고 중재 우선순위를 정한다 |
| RTR | 1비트 | 데이터 프레임은 dominant, 리모트 프레임은 recessive |
| IDE | 1비트 | 표준 포맷은 dominant, 확장 포맷은 recessive |
| r0 | 1비트 | 예약 비트, dominant로 보낸다 |
| DLC | 4비트 | 데이터 필드의 바이트 수 |
| 데이터 필드 | 0–8바이트 | 응용 데이터 |
| CRC 시퀀스 | 15비트 | 프레임 검사 시퀀스 |
| CRC 구분자 | 1비트 | recessive 고정 |
| ACK 슬롯 | 1비트 | 송신자가 recessive를 보내고 수신자가 dominant로 덮는다 |
| ACK 구분자 | 1비트 | recessive 고정 |
| EOF | 7비트 | recessive 7비트 |
중재 필드는 식별자와 RTR 비트로, 제어 필드는 IDE 비트와 예약 비트 r0과 DLC 4비트를 합친 6비트로 이루어진다. CRC 필드는 CRC 시퀀스와 구분자, ACK 필드는 슬롯과 구분자로 각각 두 부분이다.
SOF는 프레임을 여는 dominant 비트 하나다. 버스가 유휴일 때만 전송을 시작할 수 있고, 가장 먼저 전송을 시작한 노드의 SOF 에지에 모든 노드가 하드 동기화한다 — 이 기준점 덕분에 뒤이은 비트를 같은 시점에 표본 추출할 수 있다. 절차는 CAN 동기화에서 다룬다.
식별자는 노드 주소가 아니라 프레임 내용을 가리킨다(CAN 메시지 주소 지정). 같은 값이 중재의 우선순위로도 쓰이므로, 중재 필드는 프레임의 신원과 접근 순서를 한꺼번에 실어 나른다.
CRC 시퀀스와 ACK 슬롯은 프레임 안에 심긴 검사 장치다. CRC 시퀀스는 앞선 구간에서 계산한 검사값을 싣고, ACK 슬롯은 수신자가 덮어써서 수신 사실을 알린다. 두 장치가 무엇을 잡아내고 무엇을 보증하지 못하는지는 CAN 오류 검출의 몫이다.
데이터 길이 코드
DLC는 제어 필드 안의 4비트 필드로, 데이터 필드의 바이트 수를 가리킨다.[1] 데이터 필드는 0바이트에서 8바이트까지이므로 실제로 쓰이는 값은 0에서 8까지다.
DLC 9 이상
4비트가 표현하는 값은 15까지지만 송신기는 9 이상을 보내지 못한다. 그런데도 9 이상이 수신되는 경우에 수신기가 어떻게 반응할지는 규격 본문이 정하지 않았고, 1997년 부록이 참조 모델의 거동으로 그 값을 8로 보도록 정한 것이 사실상의 표준이 됐다.[3] 9에서 15까지가 8바이트로 평가되는 것은 이 규정 때문이며, 값 자체는 버스 위에 실려 그대로 전달된다. CAN FD 프레임은 같은 자리에 다른 의미를 준다.
확장 포맷
확장 포맷의 29비트 식별자는 기본 식별자 11비트와 식별자 확장 18비트로 나뉜다.[3] 기본 식별자의 자리와 순서는 표준 포맷의 식별자와 같아서, 두 포맷이 한 버스에 섞여도 앞선 비트를 같은 방식으로 겨룰 수 있다.
달라지는 것은 그 뒤다. 표준 포맷에서 RTR이 오던 자리에는 recessive 고정인 SRR(substitute remote request)이 들어가고, 그다음 IDE가 recessive로 나온 뒤 식별자 확장 18비트가 이어지며, RTR은 식별자 확장 다음으로 밀린다. IDE는 확장 포맷에서 중재 필드에 속하고 표준 포맷에서는 제어 필드에 속한다. 제어 필드는 여전히 6비트지만 예약 비트가 r1과 r0 둘로 늘어난다.
| 구간 | 표준 포맷 | 확장 포맷 |
|---|---|---|
| 중재 필드 | 식별자 11비트 + RTR | 기본 식별자 11비트 + SRR + IDE + 식별자 확장 18비트 + RTR |
| 제어 필드 | IDE + r0 + DLC 4비트 | r1 + r0 + DLC 4비트 |
확장 포맷에는 대가가 따른다. 프레임이 길어지는 만큼 지연이 최소 20비트 시간 늘고 대역폭이 약 20% 더 들며, 15비트 CRC의 생성 다항식이 112비트 이하 길이에 맞춰져 있어 오류 검출 성능도 표준 포맷보다 낮다.[1]
SAE J1939의 식별자 해석
확장 포맷을 쓰는 대표 사례는 상용차 네트워크의 SAE J1939다. J1939는 29비트 확장 식별자를 쓰고, 식별자를 통째로 하나의 번호로 다루는 대신 여러 구간으로 쪼개 해석한다.[4] 이렇게 상위 계층 프로토콜이 식별자 안에 자기 규약을 얹는 것은 CAN이 식별자의 의미를 정하지 않기 때문에 가능하다. 29비트는 다음 여섯 구간으로 나뉜다.[5]
| 구간 | 길이 | 뜻 |
|---|---|---|
| 우선순위 | 3비트 | 중재에서 쓰는 우선순위, 000이 가장 높다 |
| 예약(EDP) | 1비트 | 데이터 페이지와 함께 페이지를 확장한다 |
| 데이터 페이지 | 1비트 | 메시지가 정의된 페이지 |
| PDU 포맷(PF) | 8비트 | 메시지 형식, PDU1과 PDU2를 가른다 |
| PDU 지정(PS) | 8비트 | 목적지 주소 또는 그룹 확장 |
| 소스 주소 | 8비트 | 보낸 노드의 주소 |
PF 값이 0에서 239 사이면 PDU1 형식이고 PS는 목적지 주소가 되어 특정 노드로 보내는 메시지가 된다. 240에서 255 사이면 PDU2 형식이고 PS는 그룹 확장이 되어 네트워크 전체로 방송된다. 예약 비트는 현행 규격에서 확장 데이터 페이지(EDP)로 쓰이며 데이터 페이지와 함께 파라미터 그룹 번호의 상위 두 비트를 이룬다.
프레임 끝과 버스 유휴
ACK 구분자와 EOF 7비트는 모두 recessive이고 고정 형식이라 비트 스터핑의 대상이 아니다. 프레임이 끝나면 최소 3비트의 인터미션이 뒤따르는데 이 역시 recessive다.[1] 그래서 오류 없이 끝난 프레임 뒤로는 recessive 비트가 11개 연달아 지나간다.
인터미션은 프레임의 일부가 아니라 프레임 사이 간격(인터프레임 스페이스)의 일부다. 인터미션 동안에는 어떤 노드도 데이터·리모트 프레임 전송을 시작할 수 없고, 인터미션의 마지막 비트부터 버스는 유휴로 판정된다.[6] 그 마지막 비트에서 dominant가 관측되면 그 비트 자체가 프레임 시작으로 해석되므로[3], 대기하던 노드들의 중재는 여기서 출발한다.
인터프레임 스페이스에는 버스 유휴 구간이 함께 들어가며, 직전 프레임을 보낸 노드가 에러 패시브 상태이면 8비트의 전송 유예(suspend transmission)가 추가로 붙는다. 이 상태 구분은 CAN 결함 격리에서 다룬다.