CAN 전송은 성공했는데 왜 같은 메시지가 반복될까?

보드에 코드를 올리고 CAN 메시지를 보냈다.
전송 함수는 OK를 돌려주는데, 분석기에는 같은 프레임이 또 나타난다.
코드는 성공했다고 하는데 버스는 계속 재시도하는 셈이다.




여기서 함수의 성공과 통신의 성공을 나눠 봐야 한다.
함수의 OK는 컨트롤러가 전송 요청을 받아들였다는 뜻일 수 있다. 다른 노드가 프레임을 받았다는 확인은 아니다.




CAN 프레임 끝에는 ACK 구간이 있다. 송신 노드는 이때 버스를 recessive로 두고, 프레임을 정상적으로 받은 다른 노드가 dominant로 바꾼다.
벤치에 활성 노드가 하나뿐이라면 대답할 노드가 없다. 송신기는 ACK 오류를 보고, 재전송이 허용된 설정이라면 같은 프레임을 다시 보낸다.




그래서 코드를 더 들여다보기 전에 파형의 ACK 구간과 송신 오류 카운터를 본다. 배선, 비트레이트, 종단저항도 확인한다.
조건을 맞춘 두 번째 활성 노드를 붙였을 때 ACK가 dominant로 바뀌고 재시도가 멈춘다면, 어디까지 성공했는지가 분명해진다.




다만 ACK가 왔다고 애플리케이션까지 메시지를 처리했다는 뜻은 아니다.
전송 요청, 버스의 확인, 프로그램의 처리는 서로 다른 세 단계다.

Comments

댓글을 불러오고 있습니다.