클래식 CAN 비트 스터핑
수신기가 페이로드와 스터프 비트를 구분하는 방법
스터핑 적용 구간에서 송신기는 버스상에 같은 값의 비트가 5개 연속으로 전송되면 반대 값의 비트를 삽입합니다. 수신기는 각 필드를 해석하기 전에 해당 비트를 확인하고 제거합니다. 먼저 프레임 경계를 찾은 뒤 버스 파형과 디코딩된 프레임을 비교합니다.
비트 삽입
송신기는 버스상에 같은 값의 비트가 5개 연속으로 전송되면 반대 값의 비트를 삽입합니다.
경계 찾기
수신기는 CRC 시퀀스가 끝나면 동적 스터핑 규칙을 더 이상 적용하지 않습니다.
양쪽 끝에서 측정
두 구리 배선 구간에서 같은 시험 프레임을 비교합니다.
클래식 CAN인지 확인하고 프레임 유형과 공칭 비트 전송률을 파악합니다.
동일 값의 연속 비트가 스터핑 적용 구간에 있는지 확인합니다.
원시 파형의 신호 전이를 분석기에 표시된 프레임 및 컨트롤러 오류와 대조합니다.
파형 검증 체크리스트 — 펼치기
| 점검 항목 | 확인할 사항 | 검증 방법 |
|---|---|---|
| 버스상의 비트 | 동일 상태가 이어지는 구간 | 해당 구간의 시작점부터 비트 수를 셉니다. |
| 필드 경계 | CRC 시퀀스의 끝 | 구분자, ACK 및 EOF를 식별합니다. |
| 광섬유 연장 | 관측 위치 | 두 구리 배선 구간에서 캡처한 파형을 시간축에 맞춰 정렬합니다. |
CAN 데이터를 컨트롤러에 기록한 뒤 오실로스코프로 관찰하면, 논리적 프레임의 각 필드에 속한 비트 수를 모두 더한 것보다 더 많은 비트가 보일 수 있습니다. 이 추가 비트는 비트 스터핑에서 비롯됩니다. 클래식 CAN 프레임에서 스터핑이 적용되는 구간에서는 같은 값의 비트 5개가 연속되면 송신기가 반대 값의 비트를 삽입합니다. 수신기는 같은 규칙으로 해당 비트를 식별해 제거한 뒤 원래 필드를 해석합니다. 이 과정은 수신기가 비트 타이밍을 보정하는 데 도움이 되며, 길이가 같은 메시지라도 버스 점유 시간이 달라질 수 있는 이유이기도 합니다.
신호가 일정해도 비트는 전달됩니다
고속 CAN 구리 배선 버스에서 트랜시버는 컨트롤러의 비트를 CAN_H와 CAN_L 사이의 차동 신호 상태로 변환합니다. 도미넌트 비트는 논리값 0을, 리세시브 비트는 논리값 1을 나타냅니다. 한 노드가 도미넌트 상태를 구동하면 다른 노드가 전송한 리세시브 상태보다 우선할 수 있습니다. 전기적 상태가 변하지 않더라도 수신 컨트롤러는 각 비트 시간의 샘플링 지점에서 비트 값을 판정합니다. 도미넌트 상태가 일정하게 유지되는 구간에는 각각 한 비트 시간을 차지하는 0이 여러 개 포함될 수 있습니다.
각 노드에는 자체 오실레이터가 있습니다. 공칭 비트 시간을 같은 값으로 설정할 수 있지만 실제로는 작은 편차가 남습니다. 수신기는 프레임 시작 시 타이밍을 맞추고, 프레임 내에서 조건을 충족하는 신호 에지를 이용해 위상을 보정합니다. 적합한 에지가 오랫동안 나타나지 않으면 수신기의 샘플링 시점과 송신기의 비트 경계 사이의 시간차가 커집니다. 스터핑은 같은 값이 길게 이어지는 구간에 신호 전이를 만들어 동기화할 기회를 제공합니다. 정확한 샘플링은 전파 지연, 샘플링 지점 설정, 신호 품질에도 영향을 받습니다.

송신기는 버스에 이미 전송한 비트를 셉니다
동적 스터핑 구간에서 동일 값의 연속 비트 수가 0인 상태로 시작하는 간단한 시퀀스를 살펴보겠습니다. 논리 시퀀스는 0이 5개 이어지고 그 뒤에 1이 오는 형태입니다. 송신기는 다섯 번째 0을 전송한 뒤 1을 삽입하고, 이어서 원래의 1을 전송합니다. 버스에는 0 5개, 값이 1인 스터프 비트, 원래의 1이 차례로 전송됩니다. 비트 삽입은 바이트 중간이나 필드가 끝난 직후에 일어날 수 있습니다. 컨트롤러는 비트열을 연속적으로 추적하며 바이트 경계를 넘어도 카운트를 이어갑니다.
삽입된 비트 자체도 전송 시퀀스의 일부이며, 새로운 연속 구간의 첫 비트가 됩니다. 원래 시퀀스에서 0이 5개 나온 뒤 1이 4개 이어진다고 가정해 보겠습니다. 삽입된 1과 원래의 1 4개를 합하면 1이 5개 연속되므로 송신기는 그다음에 0을 삽입합니다. 따라서 이 규칙을 원래 비트 5개마다 한 비트를 삽입하는 것으로 단순화할 수 없습니다. 인접 필드의 비트와 앞서 삽입된 비트가 다음 삽입 시점에 영향을 줍니다.
같은 값의 비트가 5개 연속되면 수신기는 다음 비트가 반대 상태일 것으로 예상합니다. 예상한 값이 샘플링되면 수신기는 이를 스터프 비트로 인식하고, 수신 비트의 연속 상태 추적에는 반영하되 필드 해석에서는 제외합니다. 그 뒤에 오는 원래의 1은 유지합니다. 이 두 1은 버스 파형에서 하나의 평탄한 구간으로 보일 수 있습니다. 수신기는 각 비트의 위치와 앞선 연속 비트의 이력을 바탕으로 둘의 역할을 구분합니다.

연속 비트 카운트가 끝나는 위치
동적 스터핑은 클래식 CAN 원격 프레임의 해당 필드에도 적용됩니다. 원격 프레임의 DLC는 요청하는 데이터 길이를 나타낼 수 있지만, 프레임 자체에는 데이터 필드가 없습니다. 파형을 수동으로 확인할 때는 CRC 시퀀스의 위치를 찾기 전에 프레임 유형부터 식별합니다. 원격 프레임의 DLC를 뒤따르는 데이터 바이트 수로 해석하면 이후의 모든 경계 위치가 어긋납니다.
클래식 CAN 데이터 프레임에서 동적 스터핑은 프레임 시작부터 중재 필드, 제어 필드 및 데이터 필드를 거쳐 CRC 시퀀스의 끝까지 적용됩니다. 수신기는 이 구간을 처리하면서 각 필드의 길이를 추적합니다. 스터프 비트가 추가되면 버스 점유 시간이 늘어납니다. 데이터 길이 코드(DLC)의 의미는 그대로 유지됩니다. 따라서 필드의 논리적 배치와 오실로스코프에서 보이는 실제 시간 구간은 서로 다를 수 있습니다.
CRC 구분자, ACK 필드 및 프레임 종료부는 CRC 시퀀스 뒤에서 각각 고유한 규칙을 따릅니다. 앞 구간의 동적 스터핑 카운트는 더 이상 적용되지 않습니다. 예를 들어 클래식 CAN 프레임의 종료부에는 리세시브 비트가 7개 연속됩니다. 이 연속 구간만으로는 스터프 오류라고 판단할 수 없습니다. 신호가 평탄한 부분이 어느 구간에 속하는지 판단하기 전에 프레임 경계와 오류 플래그가 있는지 확인합니다.
송신기는 프레임 시작부터 데이터 필드 끝까지의 스터핑되지 않은 논리 비트를 바탕으로 클래식 CAN의 CRC 시퀀스를 계산합니다. 그런 다음 전송할 때 CRC 시퀀스도 스터핑 적용 구간에 포함합니다. 수신기는 동적 스터프 비트를 제거하고 이에 대응하는 CRC 검사를 수행합니다. 따라서 인코딩에 따른 추가 비트와 필드 무결성 검사는 서로 다른 목적을 갖습니다. CAN FD는 CRC 필드에 다른 규칙을 적용합니다. 해당 규격을 기준으로 프레임 형식과 컨트롤러 구성을 확인합니다.
데이터 길이가 같아도 버스 점유 시간은 다를 수 있습니다
프레임의 전송 시간과 메시지가 전송을 기다리는 시간을 구분합니다. 스터핑은 프레임 자체가 버스를 점유하는 시간에 영향을 줍니다. 중재 지연은 그때 다른 노드가 무엇을 전송하고 있는지에 따라 달라집니다. 주기적으로 전송되는 메시지라면 연속된 두 프레임의 시작 비트 사이 간격과 한 프레임의 시작부터 끝까지 걸리는 시간을 따로 기록합니다. 두 측정값의 변화는 각각 다른 원인을 가리킵니다.
데이터 바이트 수가 같고 전송에 성공한 두 클래식 CAN 데이터 프레임을 살펴보겠습니다. 두 프레임은 식별자나 데이터 패턴이 서로 다를 수 있습니다. 한 프레임에는 같은 값이 길게 이어지는 구간이 반복되는 반면, 다른 프레임에서는 0과 1이 자주 번갈아 나타날 수 있습니다. 첫 번째 프레임에 스터프 비트가 더 많이 필요할 수 있으며, CRC 시퀀스의 실제 비트 값도 그 개수에 영향을 줍니다. 공칭 비트 전송률이 같다면 스터프 비트 하나가 추가될 때마다 한 비트 시간만큼 길어집니다. 버스 부하를 추정할 때는 버스에서 관측한 프레임 길이나 보수적으로 산정한 길이를 사용합니다.
프로토콜 분석기는 일반적으로 디코딩 화면에 식별자, DLC 및 복원된 데이터를 표시합니다. 버스 점유 시간을 확인하려면 측정 시작점과 끝점을 정합니다. 프레임 전송 시간, 큐에 들어간 시점부터 중재에 성공할 때까지의 대기 시간, 오류 후 재전송에 걸리는 시간은 서로 다른 측정값입니다. 측정 경계를 기록하면 프레임 길이 증가와 버스 경합에 따른 지연을 구분할 수 있습니다.
스터프 오류가 나타난 구간 찾기
동적 스터핑이 적용되는 필드에서 반대 값의 비트가 나와야 할 위치에 같은 값의 여섯 번째 비트가 샘플링되면, 수신기는 스터프 오류를 보고합니다. 긴 평탄 구간은 송신 측의 비정상 동작이나 관측 지점의 샘플링 지점 설정, 비트 전송률 또는 신호 왜곡 때문에 나타날 수 있습니다. 오류 활성 상태의 노드가 활성 오류 플래그를 전송하면 다른 노드에서는 그 뒤에 스터핑 규칙을 위반하는 긴 도미넌트 구간이 관측될 수 있습니다. 따라서 로그에 기록된 스터프 오류가 앞서 발생한 오류의 결과일 수도 있습니다.
오류 유형, 가장 먼저 발생한 이벤트, 확보할 수 있는 파형을 기록합니다. CRC 오류는 수신기가 계산한 값과 수신한 CRC 시퀀스가 일치하지 않음을 뜻합니다. 형식 오류는 정해진 형식을 따라야 하는 필드와 관련됩니다. ACK 오류는 송신기가 ACK 슬롯에서 예상한 도미넌트 확인 응답을 관측하지 못했음을 뜻합니다. 한 번의 장애에서 이러한 오류가 잇따라 발생할 수 있습니다. 이벤트를 시간순으로 정리하고 영향을 받은 필드를 확인하면 조사 범위를 좁힐 수 있습니다.

광섬유로 CAN을 연장할 때 각 구리 배선 구간과 장치의 역할 확인
FCTELE의 8채널 DIN 레일 장착형 CAN 광 모뎀 제품 문서에는 CAN 신호의 광 중계와 점대점 운용이 명시되어 있습니다. 엔지니어링 시험에서는 CAN 구리 배선 구간, 광섬유, 양단 장치를 별도의 관측 지점으로 구분해 기록합니다. 실제 사용 장치의 문서를 기준으로 프레임 형식, 비트 전송률, 종단 및 배선을 확인합니다. 그런 다음 격리된 시험 환경에서 내용이 알려진 메시지를 사용해 양쪽 끝의 수신 상태를 확인합니다. 도해에는 관측 지점이 표시되어 있습니다. 장치가 광섬유를 통해 신호를 전달하는 방식은 해당 모델의 문서를 참조합니다.
송신 측 구리 배선 구간에서는 신호와 디코딩된 프레임이 안정적이지만 수신기 근처에서 간헐적 오류가 나타난다면, 반대쪽 끝의 상태와 타임스탬프를 비교합니다. 장애가 특정 케이블, 종단 장치 또는 특정 부하 조건을 따라 나타나는지 확인합니다. 메시지 주기와 그 밖의 조건을 추적할 수 있도록 기록하고, 한 번에 한 가지 변수만 변경합니다. 최종 기록에는 필드가 올바르게 복원되었는지, 오류가 재발했는지, 경로 변경 후 실제 애플리케이션 트래픽이 정상화되었는지를 남겨야 합니다. 이렇게 하면 일반적인 스터핑 오버헤드와 실제 전송 장애를 구분할 수 있습니다.
출처와 적용 범위
Bosch: CAN 및 CAN FD의 오류 검출 · Microchip: CAN 비트 스터핑과 프레임 형식 · FCTEL DIN 레일 장착형 8채널 CAN 광 장치(중국어)
다음 중국어 기술 문서에서 번역: 중국어 원문 읽기.
자주 묻는 질문
같은 값의 비트 5개 뒤에 왜 비트를 삽입하나요?
반대 값의 비트는 버스에 신호 전이를 만듭니다. 동기화 조건을 충족하는 에지를 사용해 비트 타이밍을 조정할 수 있으므로, 신호 전이 없이 같은 상태가 이어지는 시간을 제한할 수 있습니다.
EOF의 리세시브 비트 7개는 스터프 오류를 일으키나요?
클래식 CAN의 EOF는 고정된 형식을 따릅니다. EOF를 구성하는 리세시브 비트 7개는 동적 비트 스터핑 적용 구간에 속하지 않습니다.
광 링크 양단에서 스터프 오류를 어떻게 추적하나요?
두 구리 배선 구간에서 같은 시험 프레임을 캡처하고 비트 전송률, 샘플링 및 종단을 확인합니다. 컨트롤러 오류의 타임스탬프를 같은 시간축에 맞춰 비교하고 광 장치가 트래픽을 전달하는 방식을 확인합니다.


