본문 바로가기

CAN

5. 데이터 송신 (6) 오실로스코프로 데이터 프레임 파형 관찰 (7) 기타 의문점..

위에 있는 숫자는 연속적인 유효한 비트의 개수이고 아래 부분은 필드의 끝부분과 필드명을 표시해 놨습니다. 전송 속도는 다음과 같습니다.

프리스칼라 

1024

BS 1

BS 2

5

SJW

1

비트타임/속도

192000ns/5280bps


오실로스코프의 작은 네모의 가로 길이가 500us이므로 작은 눈금 약 1.9개가 1비트의 길이입니다.


hcan.pTxMsg->Data[3] = 0x1F;

hcan.pTxMsg->Data[2] = 0xFF;

hcan.pTxMsg->Data[1] = 0xFF;

hcan.pTxMsg->Data[0] = 0xFF;

hcan.pTxMsg->DLC = 4;

hcan.pTxMsg->ExtId = 0x1FFFFFFF;

hcan.pTxMsg->IDE = CAN_ID_EXT;

hcan.pTxMsg->RTR = CAN_RTR_DATA;

hcan.pTxMsg->StdId = 0x00000000;


if (HAL_CAN_Transmit_IT(&hcan) != HAL_OK)

{

    Error_Handler(); /* while(1) */

}


위와 같이 명령했을 때 전송 파형입니다.

can data frame oscilloscope


hcan.pTxMsg->Data[1] = 0x07;

hcan.pTxMsg->Data[0] = 0xFD;

hcan.pTxMsg->DLC = 2;

hcan.pTxMsg->ExtId = 0x00000000;

hcan.pTxMsg->IDE = CAN_ID_STD;

hcan.pTxMsg->RTR = CAN_RTR_DATA;

hcan.pTxMsg->StdId = 0x00007FD;

if (HAL_CAN_Transmit_IT(&hcan) != HAL_OK)

{

    Error_Handler(); /* while(1) */

}


위와 같이 명령했을 때 전송 파형입니다.

can data frame oscilloscope


그런데 자세히 보면 위에서 설명한 데이터 프레임 구성보다 비트 수가 더 많습니다. 그림 위쪽의 빨간색 ‘X’때문인데요. 이것은 초기 설정의 CAN_BTR 레지스터를 설명할 때 언급한 오류 조정과 관련이 있습니다. 오류 조정은 각 비트의 하강 엣지에서 이루어진다고 했습니다. 그런데 하강 엣지가 발생하지 않으면 어떻게 될까요? 예를 들어 1111… 또는 0000…만 전송하는 것입니다. 이렇게 되면 오차가 점점 누적되어 동작을 예측할 수 없게 됩니다. 그래서 CAN 프로토콜에서는 5비트가 연속적으로 발생하면 반대 비트를 1비트 삽입하도록 규정했습니다. 이러한 비트를 스태프 비트라고 하고, 스태프 비트를 삽입하는 동작을 비트 스태프라고 합니다. 그래서 CAN 통신에서 동일한 비트가 6비트 이상 연속 발생하는 것은 오류이며, 수신 노드에서는 CAN 컨트롤러가 알아서 이 스태프 비트를 삭제해 줍니다. 만약 1111_1000을 전송한다면 어떻게 될까요? 원래 1을 5비트 전송하고 그 다음에 0을 전송할 예정이었다고 해도 스태프 비트를 추가해서 전송해 줍니다. 위의 표준 식별자를 사용하는 데이터 프레임 전송의 오실로스코프 파형을 보면 알 수 있습니다.


(7) 기타 의문점 (작성중)


Q 조정 필드 안에서 발생한 비트 오류는 오류로 인식되지 않는지?

A


Q 조정 필드 밖에서 다른 비트가 검출된다면 어떻게 되는지?

A


두개의 노드가 동시에 전송을 시작하게 하기 위해서 현재 공부중인 노르딕 개발 보드를 이용해봤습니다. 노르딕 보드의 버튼을 누르면 핀0, 핀16이 LOW, HIGH 신호를 출력하고, 현재 풀업 저항이 걸려있는 두 STM32 보드의 핀13에 하강 엣지를 만들면서 인터럽트가 걸리도록 했습니다. 그리고 두 노드의 ISR에서 CAN 전송을 시작하도록 했는데요. 그래도 두 노드가 정상적으로 터미널로 확인해 본 결과 송수신하더라구요. 오실로스코프도 있어야 하는데, 매번 빌리기 그래서 나중에 개인적으로 오실로스코프를 사게 되면 다시 실험해봐야겠습니다.


can system