정의
에러 프레임은 오류를 검출한 노드가 보내는 특수 프레임이다. 여러 노드의 에러 플래그가 겹쳐 만들어진 구간과 그 뒤를 잇는 에러 구분자, 두 부분으로 이뤄진다.[1]
오류 검출은 검출한 노드 하나만 오류를 아는 상태로 끝난다. 그 상태로 두면 어떤 노드는 프레임을 정상으로 받아들이고 어떤 노드는 버리는 갈림이 생긴다. 에러 프레임은 국지적으로 검출된 오류를 버스 전체에 퍼뜨려 그 갈림을 없앤다. 진행 중인 전송은 중단되고, 모든 노드가 같은 프레임을 함께 버린다.[2]
구성
에러 프레임의 첫 부분은 에러 플래그다. 같은 값의 비트 6개로 이뤄지며, 액티브 에러 플래그는 dominant 6비트, 패시브 에러 플래그는 recessive 6비트다.[1]
두 번째 부분은 recessive 8비트짜리 에러 구분자다. 이 구간은 처음 검출한 노드보다 늦게 오류를 알아챈 노드들이 자기 에러 플래그를 낼 여유를 준다.[3]
전파
액티브 에러 플래그는 dominant 6비트이므로 규칙 위반을 피할 수 없다. 프레임 시작부터 CRC 구분자 사이에 놓이면 같은 값 5개까지만 허용하는 비트 스터핑 규칙을 어기고, ACK 필드나 EOF에 놓이면 그 고정 형식을 부순다. 그래서 나머지 노드는 예외 없이 오류를 검출하고 각자 에러 플래그를 내보낸다.[1]
뒤따라 나오는 에러 플래그를 에러 에코 플래그라고 부른다.[4] 처음 검출한 노드의 플래그와 에코 플래그가 겹치면서 버스 위 dominant 구간은 6비트에서 12비트 사이로 늘어난다.[5] 6비트를 넘는 초과분은 처음 검출한 노드 말고도 다른 노드가 오류를 알아채고 응답했다는 흔적이다.
CRC 오류의 예외
비트 오류, 스터프 오류, 형식 오류, 확인 응답 오류를 검출한 노드는 바로 다음 비트 시간부터 에러 플래그를 내보낸다. CRC 오류만은 다르게 처리해서, 이미 다른 오류로 플래그가 시작되지 않았다면 ACK 구분자 다음 비트부터 에러 플래그를 낸다.[1] CRC는 시퀀스를 끝까지 받아야 판정할 수 있으므로 그 앞에서 프레임을 끊을 수 없기 때문이다.
데이터 일관성
오류가 전역으로 알려진다는 것은 결과가 두 갈래뿐이라는 뜻이다. 모든 노드가 프레임을 정상으로 받아들였거나, 아무도 받아들이지 않았거나 둘 중 하나다. CAN이 데이터 일관성을 보장한다고 말할 때의 근거가 이것이다.[2]
CAN에는 오류를 고치는 수단이 따로 없고 재전송이 그 자리를 대신한다. 프레임이 무효가 되면 송신 노드는 같은 프레임을 자동으로 다시 보낸다.[1] 재전송된 프레임도 버스 접근을 새로 겨루어야 하므로, 우선순위가 낮으면 그만큼 늦게 나간다.[5]
액티브 플래그와 패시브 플래그
두 플래그의 차이는 버스에 남기는 흔적의 크기다. 액티브 에러 플래그는 dominant라서 진행 중인 전송을 실제로 부순다. 패시브 에러 플래그는 recessive 6비트이고, 다른 노드가 dominant로 덮어쓰면 그대로 묻힌다.[1]
그래서 패시브 에러 플래그를 내는 노드가 송신 중인 유일한 노드가 아니라면 그 플래그는 버스에 아무 영향도 주지 않는다. 오류를 자주 일으키는 노드가 버스를 계속 망가뜨리지 못하게 막는 장치가 여기에 걸려 있다.[4] 어떤 조건에서 액티브에서 패시브로 내려가는지는 결함 격리에서 다룬다.