저는 CAN 통신의 핵심 구조와 작동 원리를 이렇게 이해하고 설명합니다. 원래 자동차에서 쓰이던 CAN이 배터리 시스템으로 확장되며, BMS를 이식한 현장에서도 충방전기 같은 곳에서 활용됩니다. 한 보드에 1개가 아닌 여러 노드가 연결되며, 각 노드가 정한 ID에 따라 읽기와 쓰기가 독립적으로 동작합니다. CAN 통신 구성에서 중요한 점은 노드의 주소처럼 고정된 IP나 MAC가 없고, 메시지 자체에 고유한 ID가 부여된다는 점입니다. 이로써 어떤 노드가 보낸 메시지인지 우선순위와 용도를 식별하게 됩니다.
구성 요소를 보면 SOF(Start of Frame)로 시작 신호를 보내고, Identifier는 11비트 또는 29비트로 구성되어 메시지의 이름과 우선순위를 결정합니다. 예를 들어 BMS_Status_ID나 Motor_Control_ID 같은 구분이 바로 이 영역에 들어갑니다. 그다음에 Control, 즉 DLC(Data Length Code)에는 뒤따를 데이터의 바이트 수를 알려주고, Data Field에는 실제 전송될 0~8 바이트의 물리 데이터가 담깁니다. 전송 중 데이터의 무결성을 확인하는 CRC도 있으며, 수신 노드가 정상 수신했다는 것을 ACK 비트를 통해 확인합니다. 이처럼 CAN은 이미 정형화된 프로토콜이기 때문에, 실제 구현에서 어떤 노드가 어떤 메시지를 수신할지 결정하는 일이 중요합니다.
현장 운영 측면에서 주로 두 가지를 맞추는 것이 핵심이라고 저는 봅니다. 첫째, Baud Rate입니다. 네트워크에 참여하는 모든 노드가 동일한 속도(예: 125 kbps, 250 kbps, 500 kbps, 1 Mbps)로 맞지 않으면 에러 패킷이 발생하고 버스 자체가 마비될 수 있습니다. 둘째, Acceptance Filtering입니다. 버스에는 수많은 메시지가 흘러가므로 MCU의 자원을 절약하기 위해 하드웨어 레벨에서 필요한 ID만 수신 인터럽트를 발생시키도록 마스크와 필터를 정교하게 설정합니다. 이 두 가지가 잘 맞아야 실제 환경에서 안정적이고 효율적인 통신이 가능해집니다.
원문 링크 : CAN 통신 간략 정리