CAN Bus Communication
How the Solterra charger uses CAN bus to communicate with the battery BMS - the protocol, state handshaking, message flow, and what happens when the communication link breaks.
What is CAN Bus?
CAN (Controller Area Network) is a robust, differential serial bus originally designed for automotive applications. It allows multiple devices - charger, BMS, vehicle controller - to share a single 2-wire bus (CAN_H and CAN_L) and communicate using message IDs with built-in error detection.
In the Solterra charger context, CAN enables the charger to receive real-time battery status from the BMS and for the BMS to command the charger with exact voltage and current limits - enabling safe, efficient, closed-loop charging that voltage-only chargers cannot achieve.
Charger-BMS Communication Flow
When AC power is connected, the charger follows a strict communication sequence before delivering any charge current.
Charger-BMS State Machine
A cleaner state view of the charger logic: listen first, validate CAN and battery voltage, use activation only when needed, then branch clearly into charging, completion, or fault.
View Mermaid Code
flowchart TD
AC["STATE 0<br/>AC DETECTED<br/>AC input is connected"]
LSN["STATE 1<br/>LISTENING<br/>Passive CAN listen window for 5 seconds"]
HSK["STATE 2A<br/>CAN HANDSHAKE<br/>Read BMS voltage, limits, and charge request"]
VCHK{"Battery voltage<br/>already present?"}
ACT["STATE 2B<br/>ACTIVATION<br/>Pulse Vmax / Ilow for up to 10 seconds"]
CHG["STATE 3<br/>CHARGING<br/>Closed-loop current and voltage control"]
DONE["STATE 4<br/>CHARGE COMPLETE<br/>BMS stop command or current tapers to near zero"]
FLT["STATE F<br/>FAULT MODE<br/>No CAN and no sensed voltage after activation"]
NOTE1["PASSIVE LISTEN WINDOW<br/>No charge output is allowed during the 5 second listen window"]
NOTE2["ACTIVATION RECOVERY PATH<br/>Used only when the BMS is asleep, isolated, or still holding the MOSFET open"]
AC -->|T = 0| LSN
LSN -->|CAN detected within 5 s| HSK
HSK -->|Evaluate pack state| VCHK
VCHK -->|Voltage present| CHG
CHG -->|BMS stop command or current tapers| DONE
LSN -->|No CAN after 5 s| ACT
VCHK -->|0 V / MOSFET open| ACT
ACT -->|Comms recovered and voltage sensed before 10 s| CHG
ACT -->|10 second timeout| FLT
NOTE1 -.-> LSN
NOTE2 -.-> ACT
class AC state-idle
class LSN state-listen
class HSK state-handshake
class VCHK state-decision
class ACT state-activation
class CHG state-charge
class DONE state-complete
class FLT state-fault
class NOTE1,NOTE2 state-note
linkStyle 0 stroke:#6f665b,stroke-width:2px;
linkStyle 1 stroke:#37d67a,stroke-width:2.4px;
linkStyle 2 stroke:#7cb3ff,stroke-width:2.2px;
linkStyle 3 stroke:#37d67a,stroke-width:2.4px;
linkStyle 4 stroke:#37d67a,stroke-width:2.2px;
linkStyle 5 stroke:#fa913c,stroke-width:2.4px;
linkStyle 6 stroke:#fa913c,stroke-width:2.4px;
linkStyle 7 stroke:#37d67a,stroke-width:2.5px;
linkStyle 8 stroke:#f87171,stroke-width:2.4px;
linkStyle 9 stroke:#8b96a9,stroke-width:1.8px;
linkStyle 10 stroke:#fa913c,stroke-width:1.8px; Immediately upon AC connection, the charger enters a passive listening state. No output is produced. The charger listens on the CAN bus for messages from the BMS. This 5-second window allows the BMS to boot and establish communication before the charger acts.
If the BMS responds within 5 seconds, the charger reads the battery's current voltage, state of charge, and requested charge limits. If the battery voltage is already above the minimum threshold, the charger proceeds directly to normal charging. If battery voltage reads 0V (BMS MOSFETs are open), the charger initiates the Activation procedure.
During charging, the BMS continuously broadcasts charge parameters: max charge voltage, max charge current, and protection flags. The charger adjusts its output in real time to stay within these limits. This enables precise SOC-based charging profiles (CC/CV) and allows the BMS to reduce or stop charging if a cell approaches a limit.
The BMS sends a stop-charge command when target SOC is reached, or the charger self-terminates when output current drops to near-zero at the CV voltage. The relay opens, output ceases, and the green LED lights constant - indicating charge complete and safe power-off.
BMS Message Types
| Direction | Message Purpose | Key Data Fields | Update Rate |
|---|---|---|---|
| BMS -> Charger | Charge Request | Max_V, Max_I, SOC, Status | 100 ms |
| BMS -> Charger | Protection Flags | OVP, OTP, OCP, CellBalance | 100 ms |
| Charger -> BMS | Charger Status | V_out, I_out, State, Fault | 100 ms |
| Charger -> BMS | Heartbeat | Alive counter | 1000 ms |
What Happens When CAN Fails?
CAN Lost During Charging
If the CAN link drops mid-charge, the charger has no updated setpoints from the BMS. Depending on configuration, the charger may continue at the last known setpoints for a brief timeout window, then reduce current to a safe minimum or stop entirely. A fault LED pattern will activate.
CAN Never Established
If 5 seconds pass with no CAN messages, the charger assumes either the battery is deeply discharged (BMS is off) or a wiring fault. It enters Activation Mode - pulsing Vmax/Ilow to try to wake the battery. If no voltage appears within 10 seconds, the charger enters fault mode. See the Activation page.
Common CAN Wiring Issues
- CAN_H and CAN_L swapped (differential reversed)
- Missing 120 ohm termination at one or both ends
- Corroded or intermittent connector pins
- Incorrect baud rate configured
- Ground loop (CAN GND not tied to chassis)
Diagnosing CAN Issues
Measure between CAN_H and CAN_L with the bus active. Expect ~2.5V idle, swinging to ~3.5V (dominant) / ~1.5V (recessive). A flat line at 0V or 5V indicates a short or open fault. Use a USB-CAN adapter (SavvyCAN / ZCANPRO) to verify message traffic.
Tools: SavvyCAN | ZCANPRO | PCAN-View