해결된 질문
작성
·
1.7K
·
수정됨
0
안녕하세요, CAN통신 에러의 종류 학습하다가 궁금한 점이 생겨 질문 남깁니다.
에러의 종류 중 CRC 에러와 Acknowledge 에러의 차이점이 궁금합니다.
CRC 에러
- CRC는 데이터 오류를 검출하는 방법 중 하나
- Data 영역 뒤에 붙어 데이터 전달 과정 중 값이 변조되진 않았는지 확인하는 역할
- CRC 값이 이상한 경우 에러 발생
Ack 에러
- 송신자가 메세지를 보내면 수신자들이 CRC를 통해 데이터 변조 여부를 확인
- 정상일 경우 Ack영역의 data1을 data0으로 바꿔 보냄
- Ack영역에 1을 채워 보냈는데 1 그대로 돌아올 경우
- 예외: CAN 네트워크에 제어기가 송신자 하나만 있을 경우
우선 제가 이해하고 있는 각 에러의 정의는 상기 내용과 같습니다만,
CRC에러: CRC 값이 이상, 즉 데이터 전달 과정에서 변조가 됨
ACK에러: 수신자들이 변조 여부를 확인하는 과정에서 변조가 되었다 판단
두 종류의 에러 모두 '데이터의 변조'라는 원인으로 발생하기 때문에
결국 같은 에러가 아닌가 하는 의문점이 듭니다.
두 가지 에러의 근본적인 원인은 같지만 각각의 'CRC값의 오류', 'Ack영역 값의 오류'
라는 판단으로 에러 카운터 수를 올리는 건가요?
질문 읽어주셔서 감사합니다.
답변 1
1
안녕하세요! 제가 질문을 제대로 이해한건지 모르겠는데 우선 답해보겠습니다.
우선 ACK 에러는 수신측은 인식할 수 없는(판단하지 않는?) 에러입니다. ACK 에러는 송신측만 확인하는 것입니다. 송신측이 메세지를 송신한 후 Ack bit 값을 확인해서 값이 1이면 비정상이라고 인식하는게 Ack bit 입니다.
참고로 수신측에서 에러가 있을때 1로 쓰는게 아니라 송신측이 1로 쓰는거고 수신측은 문제 없이 잘 받았으면 0으로 쓰는 동작을 하는겁니다. 그러니까 수신측에서 에러를 인식하면 1이라고 값을 쓰는게 아니라 그대로 냅두는거고 정상 수신했을때만 0이라 쓰는거죠. 근데 0은 dominant 이니까 송신측이 써놓은 1에 덮어써서 0이 되는거구요.
Ack 비트의 값 확인을 송신측이 하는 것이기 때문에 수신측에서는 당연히 Ack 비트라는게 있을 수 없죠. 수신측은 수신받은 메세지에 문제가 있을 경우 Ack 비트에 0을 쓰는 동작을 안하는 것이지 이것을 Ack 에러로 판단하는게 아닙니다.
그러니까 만약 송신측 A , 수신측 B 가 있을때.
메세지에 crc 에러가 있다면, 수신측은 해당 메세지를 수신하고 이것을 crc 에러로 판단하여 내부적으로 카운터를 올리고 Ack에 아무값도 안씁니다.
한편 송신측은 메세지를 보낸 후 Ack를 확인해봤더니 값이 여전히 1로 쓰여있으니 이것을 ack 에러로 인식하는 것이구요.
근본적 원인은 같지만 수신측은 crc 에러라 인식할 것이고, 송신측은 Ack 에러로 인식하겠네요,
데이터의 변조라는 근본적인 원인을 두고 수신자는 CRC에러로, 송신자는 Ack 에러로 인식하는 것이군요! 이해했습니다.
답변 감사합니다. 좋은 하루 보내세요! :)