NMEA2000 CAN Interface¶
Circuit Overview¶
This circuit provides a galvanically isolated NMEA2000 CAN interface between the ESP32-S3 microcontroller and the vessel's NMEA2000 backbone. Isolation matters on marine networks: every NMEA2000 device shares a single bus, and devices powered from different battery banks can have several volts of ground offset between their local ground rails. Without isolation those ground offsets push current through the CAN transceiver's GND pin, distorting the differential signal and shortening transceiver life.
Two galvanic boundaries are present in the design, and it is important not to confuse them:
| Domain | Ground reference | Power source |
|---|---|---|
| Main board logic side | GND (regulator-internal ground, common with battery negative through the INA228 Kelvin path) | 3.3 V from TLV62569 |
| Boat-side CAN domain | ISOLGND_CAN (vessel NMEA2000 backbone ground) | 5 V from MPM3610 buck, fed by BOAT_12V (NMEA2000 connector power) |
The only galvanic isolation in the circuit is across the ISO1050DUB transceiver (2.5 kVRMS). The MPM3610 buck converter is non-isolated — its input ground (PGND pins 12/13/14) and output ground (AGND pin 3) are both tied to ISOLGND_CAN. The "ISOL" in ISOLGND_CAN refers to the fact that this ground node is isolated from main board GND by the ISO1050, not by anything the MPM3610 is doing. The MPM3610 simply steps boat 12 V down to 5 V, on the boat-ground side of the barrier.
Power Supply Section¶
Input Path¶
| Component | Function | Notes |
|---|---|---|
| BOAT_12V (J2 / NMEA2000 connector pin 2) | Raw vessel 12 V from NMEA2000 backbone | Nominal 9–16 V operating |
| D16 — 1N5819WS (40 V, 1 A Schottky, SOD-323) | Series reverse-polarity protection | Vf ≈ 0.3 V at typical 20–30 mA |
| D17 — SMBJ16CA (bidirectional TVS, SMB) | Transient surge clamp | Working voltage 16 V, breakdown 17.8 V min, clamp ≈ 26 V @ 1 A. Connected from MPM3610 IN to ISOLGND_CAN. |
| C7 — 10 µF (0603) | MPM3610 input bulk filter | Located close to U11 IN pin |
D17 is placed after D16 (between D16 cathode and ISOLGND_CAN), so the TVS protects the MPM3610 input from network-side transients. Placing the TVS before D16 would expose D16 to high reverse voltage during a negative surge.
Why MPM3610 (and why not LMR36510 again)¶
The board already uses an LMR36510 buck on the battery side to make the 5 V system rail. A second LMR36510 could in principle have replaced the MPM3610 here — both are TI-grade, wide-Vin step-down regulators. The MPM3610 was selected because:
- Integrated inductor. The MPM3610 is a power module with the inductor sealed inside the QFN-20 package, eliminating one passive and one critical layout loop. On a board this dense, that is a meaningful PCB savings.
- Lower Vin maximum (21 V) is fine here. The CAN power input is the NMEA2000 12 V backbone, never the alternator B+ rail. The wider-Vin LMR36510 would be wasted headroom.
- 2 MHz switching frequency vs. the LMR36510's 400 kHz lets the MPM3610 hit similar efficiency with a much smaller output capacitor.
MPM3610 (U11) Configuration¶
| Parameter | Value | Source |
|---|---|---|
| Manufacturer | Monolithic Power Systems (MPS) | datasheet |
| Family | MPM3610A — synchronous buck module with integrated inductor | datasheet |
| Package | QFN-20, 3 × 5 × 1.6 mm | datasheet |
| Vin range | 4.5 V – 21 V | datasheet |
| Max output current | 1.2 A continuous | datasheet |
| Switching frequency | 2 MHz typical | datasheet |
| Vfb (internal reference) | 0.798 V typical (786–810 mV at 25 °C) | datasheet |
| Topology | Non-isolated synchronous buck | datasheet |
Output Voltage Setting¶
Feedback divider:
- R41 = 100 kΩ 1% (FB to OUT)
- R49 = 19.1 kΩ 1% (FB to ISOLGND_CAN)
VOUT = VFB × (1 + R41 / R49) = 0.798 × (1 + 100 / 19.1) = 4.97 V (nominal 5 V on the isolated rail).
Worst-case Vref tolerance (±1.5%) and ±1% on both divider resistors give Vout window ≈ 4.83 V – 5.11 V, all within the ISO1050 VCC2 rated range (3 V – 5.5 V).
Output Stage and Local Decoupling¶
| Component | Function |
|---|---|
| C36 — 22 µF, 16 V | Bulk output cap at MPM3610 OUT (pins 7/8/9/20) |
| C35 — 1 µF | High-frequency bypass close to OUT |
| ISOLGND_CAN | Output ground = boat-side ground reference for the ISO1050 secondary |
Enable Path¶
The MPM3610 EN pin (U11 pin 17) is driven through R40 = 100 kΩ from the MPM3610 input net (D16 cathode). This forms a passive enable — whenever input power is present, EN is pulled up and the buck runs. No host control of EN is required, which is correct for a network-side power supply that must come up whenever the vessel powers the NMEA2000 bus.
Note: the original NMEA2K documentation referenced "FB_MPM divider R40 / R17" — that was wrong. R17 is part of the AIN1 (alternator current) divider on the main analog ground, completely unrelated to the MPM3610. The actual feedback network is R41 / R49 on the FB_MPM net. Updated 2026-05-23.
CAN Transceiver — ISO1050DUB¶
Why an isolated transceiver¶
A non-isolated CAN transceiver (e.g., TJA1051) is electrically simpler and cheaper, but it requires the CAN ground and the host-MCU ground to be at the same potential. On a boat that assumption is broken: the bow-thruster battery may sit 200 mV below the house bank ground, and that 200 mV is now common-mode at the transceiver. ISO1050 places a 2.5 kVRMS capacitive barrier between primary and secondary, decoupling those ground domains while still passing the digital TX/RX data.
Pin Configuration¶
| Pin | Name | Net | Function |
|---|---|---|---|
| 1 | VCC1 | 3V3 | Logic-side supply |
| 2 | RXD | GPIO16 (ESP32) | Receive data to MCU |
| 3 | TXD | GPIO17 (ESP32) | Transmit data from MCU |
| 4 | GND1 | GND (main board) | Logic-side ground |
| 5 | GND2 | ISOLGND_CAN | Bus-side ground |
| 6 | CANL | CANN | Differential low |
| 7 | CANH | CANP | Differential high |
| 8 | VCC2 | 5 V from MPM3610 | Bus-side supply |
Pins 1–4 reference main board GND. Pins 5–8 reference ISOLGND_CAN. The barrier between them sustains 2.5 kVRMS for 60 seconds (datasheet) and provides 50 kV/µs minimum CMTI (common-mode transient immunity).
Why the GPIO assignment matters¶
The ESP32-S3 has a flexible IO matrix — almost any GPIO can host UART/CAN peripherals. GPIO16 and GPIO17 were chosen because they fall in the bottom block of pins on the WROOM-1 module, physically adjacent to the ISO1050 placement on the PCB. This keeps the digital traces between the MCU and the transceiver short, which matters for CAN signal integrity at higher bit rates (250 kbps for NMEA2000).
CAN Bus Physical Interface¶
Connector (U18)¶
The NMEA2000 micro-C connector is broken out at U18 as a 5-pin field interface:
| Pin | Signal | Net |
|---|---|---|
| 1 | Shield | ISOLGND_CAN |
| 2 | NET_S (+12 V) | BOAT_12V |
| 3 | NET_C (GND) | ISOLGND_CAN |
| 4 | NET_H | CANP |
| 5 | NET_L | CANN |
Shield and NET_C both terminate to ISOLGND_CAN — this is conventional NMEA2000 practice. The shield carries no signal current; it is bonded only at one point to drain ESD.
Termination¶
NMEA2000 specifies 120 Ω termination at both ends of the backbone. The board carries a single 120 Ω resistor (R37) plus a jumper (J15) to enable it. Install the J15 jumper only if this device is physically at one end of the bus. In a typical installation, the backbone is already terminated at both ends by the NMEA2000 terminator plugs, and this board joins the middle of the backbone via a T-piece — in that case leave J15 open.
Power Consumption¶
Standby (CAN idle, no traffic)¶
| Component | Current at boat-12V side |
|---|---|
| MPM3610 quiescent (VFB=1V, VAAM=0.5V) | 200 µA (datasheet typical) |
| ISO1050 (both sides idle) | ~3 mA from VCC1 + ~5 mA from VCC2 → ~25 mA-equivalent reflected to boat 12 V |
| Total at 12 V | ~20–25 mA |
The dominant current is the ISO1050 itself, not the buck converter. Putting the ISO1050 into shutdown via its EN pin would save ~80% of this — currently unimplemented (see Future Plans).
Active (250 kbps NMEA2000 traffic)¶
ISO1050 VCC2 supply current rises to 20–25 mA during dominant bit transmission. Buck draws an additional 10–15 mA at boat 12 V. Total boat-side draw ≈ 30 mA.
Sleep¶
The MPM3610 EN pin is currently tied to its own input through R40, so the buck cannot be shut down by software. To enable a deep-sleep mode for the CAN interface, EN would have to be re-routed to an ESP32 GPIO; this requires a board respin.
Circuit Operation¶
Power Conversion Flow¶
- BOAT_12V (from NMEA2000 connector pin 2) → D16 reverse-polarity diode
- → D17 TVS clamp to ISOLGND_CAN
- → MPM3610 IN with C7 input cap
- MPM3610 generates 5 V on its OUT pins, referenced to ISOLGND_CAN
- C35 + C36 filter the 5 V rail
- 5 V powers ISO1050 VCC2
The buck does not provide isolation. ISOLGND_CAN connects directly back through the buck to BOAT_12V's negative terminal at U18 pin 3 (NET_C).
CAN Data Flow¶
- Transmit: ESP32 GPIO17 → ISO1050 TXD (pin 3) → barrier → CANH/CANL drivers → NMEA2000 bus
- Receive: NMEA2000 bus → CANH/CANL receiver → barrier → RXD (pin 2) → ESP32 GPIO16
The barrier is bidirectional and crossed once per direction. Propagation delay is ~150 ns through the ISO1050 — far less than a single 4 µs CAN bit at 250 kbps.
Ground Domains¶
- Main board GND: referenced to regulator battery negative through the INA228 Kelvin path
- ISOLGND_CAN: referenced to vessel NMEA2000 backbone NET_C
- Isolation barrier: inside the ISO1050 only
Even in a worst-case ground fault that places ISOLGND_CAN several volts away from main GND, the ISO1050 absorbs the common-mode shift and the digital RX/TX signaling to the ESP32 is unaffected.
Key Specifications¶
| Parameter | Value |
|---|---|
| Input voltage | 9–16 V nominal from NMEA2000 backbone |
| Isolation rating | 2.5 kVRMS per ISO1050DUB datasheet |
| CAN standard | NMEA2000 (CAN 2.0 B at 250 kbps) |
| Connector | Micro-C / DeviceNet style at U18 |
| Termination | Selectable 120 Ω via J15 |
| Idle current at 12 V | ~20–25 mA |
| Active current at 12 V | ~30 mA |
Component Summary¶
| Designator | Part | Function |
|---|---|---|
| U7 | ISO1050DUB | Galvanically isolated CAN transceiver (2.5 kVRMS) |
| U11 | MPM3610AGQV-P | Non-isolated 2 MHz buck module, 12 V → 5 V on boat-ground side |
| U18 | Micro-C connector breakout | NMEA2000 backbone interface |
| D16 | 1N5819WS | Reverse-polarity Schottky |
| D17 | SMBJ16CA | Bidirectional TVS (16 V working, ~26 V clamp) |
| R37 | 120 Ω | Selectable bus termination |
| R40 | 100 kΩ | MPM3610 EN pull-up |
| R41 / R49 | 100 kΩ / 19.1 kΩ | MPM3610 FB divider (sets 5.0 V) |
| C7 | 10 µF | MPM3610 input bulk |
| C35 / C36 | 1 µF / 22 µF | MPM3610 output filter |
| J15 | Jumper | Termination enable |
Future Plans¶
- Software-controlled CAN shutdown. Re-route MPM3610 EN to an ESP32 GPIO so the entire CAN subsystem can be powered down during deep sleep, saving ~25 mA of boat-side current. Requires PCB respin.
- Optional second termination resistor footprint. Currently only one 120 Ω termination is fitted. Some installers prefer to install both 60 Ω end terminations on the same device for short backbones. Adding a second optional resistor footprint would simplify those installations.