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개로 제한한다. 이후 대상 노드는 패킷을 수신후, 수용가능한 패킷의 양을 담아서 다시 응답하게 된다.