NMEA 2000 CAN Interface¶
Circuit Overview¶
This circuit gives the ESP32-S3 a galvanically isolated CAN interface to the vessel's NMEA 2000 backbone. Isolation matters on marine networks. Every NMEA 2000 device shares one bus, and devices powered from different battery banks can sit several volts apart at 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 ground domains are present in the design, and they are easy to confuse:
| Domain | Ground reference | Power source |
|---|---|---|
| Main board logic side | GND (regulator-internal ground, referenced through the Regulator Ground Wire at J2 terminal 2) | 3.3 V from TLV62569 |
| Boat-side CAN domain | ISOLGND_CAN (vessel NMEA 2000 backbone ground) | 5 V from MPM3610 buck, fed by BOAT_12V (NMEA 2000 connector power) |
This one port carries every 250 kbps protocol the XREG-010 speaks. NMEA 2000, Victron VE.Can (VREG), and RV-C all share it. What gets decoded on each is on NMEA 2000 and External Interfaces.
The only galvanic isolation in the circuit is across the ISO1050DUB transceiver (2.5 kVRMS). The MPM3610 buck converter is not isolated: its input ground (PGND pins 12/13/14) and its output ground (AGND pin 3) both tie to ISOLGND_CAN. The "ISOL" in ISOLGND_CAN says that this ground node is isolated from main board GND by the ISO1050, not that the MPM3610 is doing anything about it. The MPM3610 steps boat 12 V down to 5 V on the boat-ground side of the barrier.
Power Supply Section¶
Input Path¶
| Designator | Part | Function | Notes |
|---|---|---|---|
| BOAT_12V | U18 / NMEA 2000 connector pin 2 | Raw vessel 12 V from the backbone | Nominal 9 to 16 V operating |
| D16 | 1N5819WS (40 V, 1 A Schottky, SOD-323) | Series reverse-polarity protection | Vf ≈ 0.3 V at 20 to 30 mA |
| D17 | SMBJ16CA (bidirectional TVS, SMB) | Transient surge clamp | 16 V working, 17.8 V breakdown minimum, clamp ≈ 26 V at 1 A. Connected from MPM3610 IN to ISOLGND_CAN |
| C7 | 10 µF (0603) | MPM3610 input bulk filter | Placed close to the U11 IN pin |
D17 sits after D16, between the 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, since both are TI-grade wide-Vin step-down regulators. The MPM3610 was selected for three reasons.
- Integrated inductor. The MPM3610 is a power module with the inductor sealed inside the QFN-20 package, which removes one passive and one critical layout loop. On a board this dense that is a real PCB saving.
- Lower Vin maximum (21 V) is fine here. The CAN power input is the NMEA 2000 12 V backbone, never the alternator B+ rail. The wider-Vin LMR36510 would be wasted headroom.
- 2 MHz switching frequency against the LMR36510's 400 kHz lets the MPM3610 reach 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 to 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 to 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%) with ±1% on both divider resistors gives a Vout window of 4.83 V to 5.11 V, all inside the ISO1050 VCC2 rated range of 3 V to 5.5 V.
Output Stage and Local Decoupling¶
| Component | Function |
|---|---|
| C36, 22 µF, 16 V | Output cap at MPM3610 OUT (pins 7/8/9/20), the only capacitor on the isolated 5 V rail |
| ISOLGND_CAN | Output ground, the 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 at the D16 cathode. That 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 the right behavior for a network-side supply that has to come up whenever the vessel powers the bus.
CAN Transceiver, ISO1050DUB¶
Why an isolated transceiver¶
A non-isolated CAN transceiver such as the TJA1051 is electrically simpler and cheaper, but it requires the CAN ground and the host-MCU ground to sit 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. The 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 through 4 reference main board GND. Pins 5 through 8 reference ISOLGND_CAN. The barrier between them sustains 2.5 kVRMS for 60 seconds per the datasheet and provides 50 kV/µs minimum common-mode transient immunity.
Why the GPIO assignment matters¶
The ESP32-S3 has a flexible IO matrix, so almost any GPIO can host UART or CAN peripherals. GPIO16 and GPIO17 were chosen because they fall in the bottom block of pins on the WROOM-1 module, physically adjacent to where the ISO1050 sits on the PCB. That keeps the digital traces between the MCU and the transceiver short, which matters for CAN signal integrity at 250 kbps.
CAN Bus Physical Interface¶
Connector (U18)¶
The NMEA 2000 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, which is conventional NMEA 2000 practice. The shield carries no signal current; it is bonded at one point only, to drain ESD.
Termination¶
A CAN network is one long twisted pair, the backbone. Devices hang off it on short drop cables through T-connectors. A signal traveling down a wire that ends in nothing bounces back like an echo, and the echo corrupts the next bits. A 120 Ω resistor across the two data wires at each physical end of the backbone absorbs the signal instead. Two 120 Ω resistors in parallel present 60 Ω to every transmitter, which is the load the ISO1050 current figures further down assume.
term ---[T]-----[T]-----[T]-----[T]--- term <- 120 Ω plug at each END of the backbone
| | | |
MFD XREG-010 GPS engine <- devices on drops, none terminated
An end device is a device that physically sits at one end of the backbone with nothing beyond it. In NMEA 2000 that is normally not a device at all. The backbone ends in a T carrying a terminator plug, a small cap with a 120 Ω resistor inside, and no device has termination built in.
The board carries a single 120 Ω resistor, R37, in series with J15, a two-pin footprint left unpopulated. The rule for closing it is about position, not count.
- Regulator on a proper backbone with two terminator plugs. Leave J15 open. This holds whether there are twenty other devices on the bus or the regulator is the only one. Even a bench setup of one T and two terminator plugs needs no jumper.
- Regulator joined to one other box by a single cable, no T-connectors, and no terminator plugs. Both ends need a resistor. Bridge J15 with a header and jumper or a wire link, or put a T with a terminator plug next to the regulator and skip the soldering.
Three terminators load the bus to 40 Ω, the signal shrinks, and errors appear. No terminators leave the echoes in place, which short cables at 250 kbps often survive and long ones do not.
The meter check¶
Power the network off and measure across pins 4 and 5 at any T.
| Reading | Meaning |
|---|---|
| About 60 Ω | Correct, two terminators |
| About 120 Ω | One terminator missing |
| About 40 Ω | One terminator too many |
| Open | No terminators |
RV-C¶
RV-C uses the same wiring rules, a backbone with 120 Ω at each end, and many RV-C devices carry a termination jumper for the case where they are the end. The J15 logic is unchanged: bridge it only if the regulator is physically the end and nothing else terminates there.
BMS CAN¶
A BMS CAN link is usually direct, one cable between the BMS and one other box, which is the second case above. The regulator end then needs termination, either J15 or a terminator plug on a T. Most BMS units have their own resistor built in or switchable, so check that end before adding one at the regulator.
The common BMS CAN protocols run at 500 kbps, and the firmware runs this port at 250 kbps. The driver supports 500 kbps, so the gap is a firmware change and not a hardware one.
Power Consumption¶
Standby (CAN idle, no traffic)¶
| Component | Current at boat-12V side |
|---|---|
| MPM3610 quiescent (VFB = 1 V, VAAM = 0.5 V) | 200 µA (datasheet typical) |
| ISO1050 (both sides idle) | ~3 mA from VCC1 plus ~5 mA from VCC2, about 25 mA-equivalent reflected to boat 12 V |
| Total at 12 V | ~20 to 25 mA |
The dominant current is the ISO1050 itself rather than the buck converter. The ISO1050 has no enable or standby pin, so this current can only be removed by cutting its supply, which is covered under Future Plans.
Active (250 kbps traffic)¶
ISO1050 VCC2 supply current rises to 20 to 25 mA during dominant bit transmission, driving into the 60 Ω that a correctly terminated bus presents. The buck draws an additional 10 to 15 mA at boat 12 V. Total boat-side draw is about 30 mA. A bus with a third terminator fitted pulls the driver harder for a smaller differential swing, which is the electrical reason the count in the meter check table matters.
Sleep¶
The MPM3610 EN pin is tied to its own input through R40, so the buck cannot be shut down by software. Giving the CAN interface a deep-sleep mode means re-routing EN to an ESP32 GPIO, which needs a board respin.
Circuit Operation¶
Power Conversion Flow¶
- BOAT_12V, from NMEA 2000 connector pin 2, into the D16 reverse-polarity diode
- Into the D17 TVS clamp to ISOLGND_CAN
- Into MPM3610 IN with C7 as the input cap
- The MPM3610 generates 5 V on its OUT pins, referenced to ISOLGND_CAN
- C36 filters the 5 V rail
- The 5 V rail powers ISO1050 VCC2
The buck provides no isolation. ISOLGND_CAN connects directly back through the buck to the negative terminal of BOAT_12V at U18 pin 3 (NET_C).
CAN Data Flow¶
- Transmit: ESP32 GPIO17 into ISO1050 TXD (pin 3), across the barrier, out through the CANH/CANL drivers to the bus
- Receive: bus into the CANH/CANL receiver, across the barrier, out of RXD (pin 2) to ESP32 GPIO16
The barrier is bidirectional and crossed once per direction. Propagation delay through the ISO1050 is about 150 ns, far less than a single 4 µs CAN bit at 250 kbps.
Both directions are used in firmware. Transmit ships off. With both it and the RV-C producer off, the regulator is a silent listener that never claims a source address. Turning on Transmit on NMEA2K (Setup → Integrations → NMEA 2000) and rebooting makes the regulator a node on the backbone, publishing battery, alternator, charger, temperature, and engine messages. Transmit RV-C (Setup → Integrations → RV-C) is a separate switch that claims the same address on the same wire and publishes RV-C charger, DC-source, and fault messages instead. Either switch alone is enough to make the regulator a node. See External Interfaces and NMEA 2000 in Detail.
Ground Domains¶
- Main board GND: referenced through the Regulator Ground Wire (J2 terminal 2), which lands on battery negative, or on the shunt's load side when the shunt is in the negative lead
- ISOLGND_CAN: referenced to vessel NMEA 2000 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 to 16 V nominal from the NMEA 2000 backbone |
| Isolation rating | 2.5 kVRMS per the ISO1050DUB datasheet |
| CAN standard | NMEA 2000 (CAN 2.0 B at 250 kbps) |
| Connector | Micro-C / DeviceNet style at U18 |
| Termination | 120 Ω on board, selected by J15, open as shipped |
| Idle current at 12 V | ~20 to 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 to 5 V on the boat-ground side |
| U18 | Micro-C connector breakout | NMEA 2000 backbone interface |
| D16 | 1N5819WS | Reverse-polarity Schottky |
| D17 | SMBJ16CA | Bidirectional TVS (16 V working, ~26 V clamp) |
| R37 | 120 Ω | Bus termination, in series with J15 |
| 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 |
| C36 | 22 µF | MPM3610 output filter |
| J15 | Two-pin footprint, unpopulated | Termination enable, bridge only at a physical end of the bus |
Future Plans¶
- Software-controlled CAN shutdown. Re-route MPM3610 EN to an ESP32 GPIO so the whole CAN subsystem can be powered down during deep sleep, saving about 25 mA of boat-side current. Requires a PCB respin.
- Second termination resistor footprint. R37 gives the board one 120 Ω resistor, which terminates one end. A second footprint in parallel would let the board present 60 Ω on its own, for a short direct link where the box at the far end carries no terminator of any kind. Bridging J15 and fitting a terminator plug at the far end does the same job today.