정의
CAN FD는 프레임 형식을 처음부터 새로 짜지 않았다. 고전 CAN 프레임의 필드 순서를 그대로 두고, 값이 정해져 있거나 CAN FD에서 쓸 일이 없어진 비트 자리를 골라 새 의미를 얹었다. 그래서 두 형식의 프레임은 앞쪽 상당 구간이 똑같이 생겼고, 어느 쪽인지는 제어 필드의 FDF 비트 하나로 갈린다.[1]
프레임 구조
프레임 형식은 식별자 길이와 CAN FD 여부의 조합으로 넷이다 — 고전 쪽의 CBFF·CEFF와 CAN FD 쪽의 FBFF·FEFF다.[2] 식별자 11비트를 쓰는 CAN FD 데이터 프레임이 FD 기본 프레임 포맷(FBFF), 29비트를 쓰는 것이 FD 확장 프레임 포맷(FEFF)이다.[1]
필드의 큰 순서는 CAN 프레임과 같다 — SOF, 중재 필드, 제어 필드, 데이터 필드, CRC 필드, ACK 필드, EOF다.[3]
재사용된 비트 자리
CAN FD에는 리모트 프레임이 없으므로 RTR 비트가 쓸모를 잃는다. 그 자리는 항상 dominant인 RRS(remote request substitution)로 대체됐고, 프레임 종류를 가르는 FDF(FD format) 비트는 고전 CAN에서 예약 비트였던 자리를 물려받았다.[4]
FDF는 recessive이며 CAN FD 프레임에만 있다 — 고전 CAN 프레임은 같은 자리에 dominant 예약 비트를 보낸다. 두 자리의 위치는 포맷에 따라 다르다. FBFF에서는 11비트 식별자 뒤에 RRS가 오고 IDE를 지난 뒤에 FDF가 나오지만, FEFF에서는 IDE가 중재 필드 안쪽으로 올라가고 18비트 식별자 확장 뒤에 RRS와 FDF가 나란히 붙는다. FDF 뒤에는 예약 비트 res가, 그 뒤에 BRS·ESI·DLC가 이어진다.[3]
FEFF에서 IDE는 recessive이고 RRS는 언제나 dominant이며, SRR 비트의 값은 무시된다.[1]
비트율 전환과 오류 상태
BRS(bit rate switch)가 recessive면 그 비트의 표본 추출 시점에서 데이터 비트율로 갈아타고, CRC 구분자의 표본 추출 시점에서 중재 비트율로 돌아온다. 전환이 비트 한가운데서 일어나므로 BRS와 CRC 구분자는 앞뒤 절반의 비트 시간이 다른 중간 길이 비트가 된다.[2] BRS가 dominant면 데이터 구간에도 중재 구간의 비트 타이밍이 그대로 쓰인다.[1]
BRS 다음의 ESI(error state indicator)는 송신 노드의 오류 상태를 알린다 — 에러 액티브 노드는 dominant로, 에러 패시브 노드는 recessive로 보낸다.[3] 상태 구분은 CAN 결함 격리에서 다룬다.
데이터 길이 코드
DLC는 고전 CAN과 같은 4비트다. 0에서 8까지는 두 형식이 같은 뜻이지만, 고전 CAN에서 모두 8바이트로 평가되던 9에서 15까지가 CAN FD에서는 8바이트를 넘는 고정 길이를 가리킨다.[4]
| DLC | 고전 CAN | CAN FD |
|---|---|---|
| 0–8 | 0–8바이트 | 0–8바이트 |
| 9 | 8바이트 | 12바이트 |
| 10 | 8바이트 | 16바이트 |
| 11 | 8바이트 | 20바이트 |
| 12 | 8바이트 | 24바이트 |
| 13 | 8바이트 | 32바이트 |
| 14 | 8바이트 | 48바이트 |
| 15 | 8바이트 | 64바이트 |
띄엄띄엄한 길이
8바이트를 넘는 데이터 길이는 일곱 단계뿐이다.[4] 표에 없는 길이는 DLC로 나타낼 수 없으므로, 한 단계 위 길이를 골라 남는 자리를 채워 보내는 수밖에 없다.
CRC 필드
CAN FD의 CRC 필드는 스터프 비트 카운터로 시작한다. 프레임 앞부분에 삽입된 동적 스터프 비트의 개수를 8로 나눈 나머지를 3비트 그레이 부호로 싣고, 그 뒤에 앞 3비트로 계산한 패리티 비트 하나를 붙여 모두 4비트다.[2]
이어지는 CRC 시퀀스의 길이는 데이터 필드 길이에 따라 갈린다 — 데이터 16바이트까지는 17비트, 20바이트 이상은 21비트다. 스터프 비트 카운터를 CRC 필드에 담는 것이 ISO CAN FD의 특징이고, 그 이전 사양을 따르는 non-ISO 구현의 CRC 필드에는 이 카운터가 없다.[4]
두 생성 다항식은 17차와 21차이고 16진수로는 각각 0x3685B와 0x302899이며, 고전 CAN이 쓰는 15차 다항식과 마찬가지로 해밍 거리 6을 낸다.
어느 것을 쓸지는 FDF 비트와 DLC를 봐야 정해지는데 그 값은 프레임이 한참 진행된 뒤에야 확정되므로, 모든 노드는 프레임이 시작될 때부터 세 CRC를 동시에 계산해 두었다가 해당하는 하나만 골라 쓴다. 고전 CAN과 달리 CAN FD 프레임에서는 스터프 비트도 CRC 계산 대상 비트열에 들어간다.[3] CRC가 걸러 내는 오류의 종류는 CAN 오류 검출에서 다룬다.
두 가지 스터핑 규칙
고전 CAN은 SOF부터 CRC 시퀀스까지 전부 같은 값 5비트 연속에 반응하는 동적 스터핑을 쓰지만(CAN 비트 스터핑), CAN FD 프레임에서는 CRC 필드만 규칙이 바뀐다. 값과 무관하게 CRC 필드의 첫 비트 앞에 하나, 그다음 네 비트마다 하나씩 직전 비트의 반전 값을 고정 위치에 끼워 넣는다.[3]