먼저 single의 경우 전통적인 느낌을 그대로 가진다. 메시지 큐에 저장된 값을 범위를 넘어가지 않도록 0xFF로 마스킹하여 가져와 송신을 위한 임시 변수에 이를 담는다.

이를 전송한 이후에는 메시지큐의 Tail을 증가시킨다.

CAN2_Transmit_Periodically_Single함수에서는 위에서 설명한 single방식의 전달을 구현한 함수이다.

CAN2_Transmit_Msg함수에서 MCP2515 즉, CAN controller로 SPI통신으로 이를 전달하여 CAN을 전송한다. 이 부분은 추상화하여 두고, 이후에 필요하면 파보도록 한다.


위에서 single방식의 전송을 확인했다면 이제 multy방식을 알아보자.

함수를 살펴보기 전에 개념을 먼저 정리하고자한다.

CAN을 멀티패킷의 형태로 전달하는 것에는 RTS/CTS, BAM 두 가지 방식이 존재한다.

RTS/CTS는 단일 노드를 목표로 패킷을 전달하는 형식이고, BAM은 브로드캐스트를 통해 다수의 노드에 패킷을 전달하는 방식이다.

RTS의 경우 먼저 패킷으로 요청을 보내고 이후, CTS를 응답받은 다음 전송을 하는 방식을 가진다.

RTS / BAM 비교 (J1939 TP.CM)

+--------+----------+----------+----------+----------+----------+----------+----------+
| 구분   | Byte 0   | Byte 1   | Byte 2   | Byte 3   | Byte 4   | Byte 5   | Byte 6   | Byte 7   |
+--------+----------+----------+----------+----------+----------+----------+----------+
| RTS    | 0x10     | Size L   | Size H   | Packets  | MaxPkt   | PGN L    | PGN M    | PGN H    |
| BAM    | 0x20     | Size L   | Size H   | Packets  | 0xFF     | PGN L    | PGN M    | PGN H    |
+--------+----------+----------+----------+----------+----------+----------+----------+

           ↑          └── 전체 크기 ──┘    ↑          ↑          └──── 대상 PGN ────┘
        전송 방식                       총 패킷 수   흐름 제어

두 방식의 주요한 패킷 차이는 두 군데이다.

먼저 Byte 0에서 어떤 전송 방식을 가지는지 구분한다. RTS라면 0x10, BAM방식을 가진다면 0x20을 가진다.

두 번째 차이는, Byte 4에서 흐름 제어 바이트를 설정하는 부분이다. RTS의 Byte 4는 송신측이 한 번의 CTS구간에서 보낼 수 있는 최대 패킷의 수를 의미한다. 예를 들어 Byte 4에 0x02를 넣는다면 한번에 전송 가능한 패킷을 2개로 제한한다. 이후 대상 노드는 패킷을 수신후, 수용가능한 패킷의 양을 담아서 다시 응답하게 된다.

이후 수신측은 CTS로 실제 이번에 받을 패킷 수와 시작 패킷 번호를 알려준다.

이때 BAM방식에서는 이를 사용하지 않기에 0xFF로 고정하여 둔다.

아래 이미지를 참고하면 보다 이해에 도움이 될 것이다.