정의
CAN 오류 검출은 전송 중인 프레임이 프로토콜 규칙을 어겼거나 송신한 값과 버스에서 읽힌 값이 어긋난 상황을 찾아내는 검사다. CAN 데이터 링크 계층은 비트 모니터링, 스터프 검사, 형식 검사, 확인 응답 검사, CRC 검사 다섯 가지를 함께 쓴다.[1]
CAN은 오류를 정정하는 프로토콜이 아니라 오류를 놓치지 않는 데 힘을 쏟는 프로토콜이다. 다섯 검사 중 하나라도 걸리면 그 프레임은 받아들여지지 않고, 검출한 노드가 오류를 알리며, 송신 노드가 프레임을 다시 보낸다.[2]
검사가 다섯 가지로 나뉜 데는 이유가 있다. 각 검사는 프레임의 서로 다른 구간에서, 서로 다른 종류의 손상에 반응한다. 하나가 놓치는 손상을 다른 하나가 잡도록 겹쳐 둔 구성이며, 오류 검출과 오류 신호는 ISO 11898-1[3]이 규정하는 데이터 링크 계층의 기능에 속한다.[1]
다섯 가지 검사
다섯 검사의 규칙은 CAN 프로토콜 규격이 정의한다.[4]
| 검사 | 판정 기준 | 검출하는 쪽 |
|---|---|---|
| 비트 모니터링 | 자신이 내보낸 비트와 버스에서 되읽은 비트가 다름 | 송신 노드 |
| 스터프 검사 | 스터핑 구간에서 같은 값의 비트가 6개 연속 | 모든 노드 |
| 형식 검사 | 고정 형식 구간에 규정과 다른 비트가 있음 | 모든 노드 |
| CRC 검사 | 받은 CRC 시퀀스가 스스로 계산한 값과 다름 | 수신 노드 |
| 확인 응답 검사 | ACK 슬롯에서 dominant가 읽히지 않음 | 송신 노드 |
이 중 비트 모니터링과 스터프 검사는 비트 수준에서, 형식 검사와 CRC 검사와 확인 응답 검사는 메시지 수준에서 작동한다.[2]
검출하는 쪽이 갈리는 것은 두 역할이 아는 정보가 다르기 때문이다. 자신이 무엇을 보내려 했는지 아는 것은 송신 노드뿐이므로, 보낸 값과 읽힌 값을 맞대어 보는 비트 모니터링과 확인 응답 검사는 송신 노드만 할 수 있다. 수신 노드는 원래 값을 모르니 프레임 안에 함께 실려 온 중복 정보와 형식 규칙에 기대어 판정한다.
비트 모니터링
버스에 비트를 내보내는 노드는 동시에 버스를 읽어, 내보낸 값과 되읽은 값이 다르면 비트 오류로 판정한다.[4][5] CAN 버스 레벨이 dominant와 recessive 두 상태뿐이므로 비교는 한 비트 시간 안에 끝난다. 자기 전송이 버스에 그대로 실렸는지를 송신 노드가 스스로 확인하는 수단이다.
중재 필드와 ACK 슬롯
스터프 검사와 형식 검사
프레임 시작(SOF)부터 CRC 시퀀스까지는 비트 스터핑이 적용되는 구간이고, 그 뒤에 오는 CRC 구분자와 ACK 필드, EOF는 스터핑하지 않는 고정 형식 구간이다.[4] 두 검사는 이 경계를 나눠 맡는다.
스터프 검사는 앞 구간을 본다. 같은 값의 비트가 6개 연속으로 나타나면 스터핑 규칙이 깨진 것이므로 스터프 오류로 판정한다.[6]
형식 검사는 뒤 구간을 본다. 고정 형식 구간에 규정과 다른 비트가 섞여 있으면 형식 오류다. 그중 CRC 구분자와 ACK 구분자, EOF는 값이 recessive로 못 박혀 있어서 여기서 dominant가 읽히면 곧바로 형식 오류가 된다.[5] 필드 배치는 CAN 프레임에서 다룬다.
CRC 검사
송신 노드는 SOF부터 데이터 필드까지의 비트열에서 스터프 비트를 걷어낸 뒤, 그것을 계수로 삼은 다항식을 아래 생성 다항식으로 나눈다. 그 나머지가 CRC 시퀀스이며 길이는 15비트다.[4]
수신 노드는 같은 계산을 되풀이해 결과가 받은 CRC 시퀀스와 같은지 본다. 다르면 CRC 오류다.
이 다항식의 해밍 거리는 6이어서, 무작위로 흩어진 비트 오류는 5개까지 검출하고 연속으로 몰린 버스트 오류는 15비트 길이까지 검출한다. 다만 이 수치는 이론적 상한이다. 스터프 비트의 개수가 데이터에 따라 달라지는 탓에 특정 비트 패턴에서는 해밍 거리가 2까지 떨어지고, 그런 경우에도 검출이 보장되는 것은 단일 비트 오류뿐이다.[7]
확인 응답 검사
송신 노드는 ACK 슬롯과 ACK 구분자 두 비트를 모두 recessive로 내보낸다. CRC 시퀀스까지 정상으로 받은 노드는 ACK 슬롯의 recessive를 dominant로 덮어써서 그 사실을 알린다.[4] 송신 노드가 ACK 슬롯에서 dominant를 읽지 못하면 확인 응답 오류다.
한 대만 덮어써도 버스 전체가 dominant가 되므로, 확인 응답은 개별 노드를 세지 않는다. 수신 노드는 그 프레임의 내용이 자기에게 필요한지와 무관하게 확인 응답을 보낸다.[6]
확인 응답의 범위
ACK 슬롯의 dominant는 버스 위의 노드가 하나 이상 프레임을 온전히 받았다는 뜻일 뿐, 그 데이터를 필요로 하는 노드가 받았다는 보증은 아니다.[5] CAN은 메시지 주소 지정을 쓰므로 확인 응답에도 보낸 쪽과 받은 쪽이 적히지 않는다. 특정 수신자의 수신을 확인해야 하면 상위 계층 프로토콜을 얹어야 한다.
검출 이후의 처리
검출로 끝나면 오류를 발견한 노드만 그 사실을 안다. CAN은 검출한 노드가 곧바로 버스를 흔들어 나머지 노드에게 오류를 알리도록 했고, 그 수단이 에러 프레임이다. 오류를 자주 일으키는 노드를 버스에서 떼어 내는 장치는 결함 격리가 맡는다.