RV-C Protocol

RV-C is a CAN-based communication network specifically designed for Recreation Vehicles (RVs/motorhomes). It allows all devices in an RV (lights, awnings, climate control, generators, inverters, etc.) to communicate with each other and be controlled from a central interface.

  • Developed by: Recreation Vehicle Industry Association (RVIA)
  • Based on: CAN 2.0B (Controller Area Network) - the same technology used in automotive applications
  • Website: www.rv-c.com ↗

The Big Picture - How It Works

Think of RV-C like a shared communication bus where all devices can talk and listen:

  1. All devices are connected to two twisted wires (CAN_H and CAN_L)
  2. Devices broadcast messages on the bus that everyone can hear
  3. Each message has a unique ID (DGN) that tells what kind of data it contains
  4. Devices filter messages and only process the ones relevant to them
  5. No master device - it’s a peer-to-peer network where everyone is equal

Physical Layer

Wiring

  • Cable: Twisted pair (2 wires: CAN_H = White, CAN_L = Blue)
  • Optional wires: Power (Red/Black) and Shield (Bare)
  • Wire size: 15-24 AWG (typically 18 or 20 AWG)
  • Topology: Linear bus with short drops (star topology NOT allowed)

Bus Configuration

[Device]   [Device]            [Device]   [Device]
    |          |                    |          |
====*==========*====================*==========*====
120Ω                                           120Ω
(terminator)                         (terminator)
         ^----- Main trunk line ------^

Important Limits

  • Max devices: 172 nodes on one bus
  • Max bus length: Depends on wire gauge (e.g., 265m for 20 AWG)
  • Max drop length: 6 meters per device
  • Termination: Two 120Ω resistors (one at each end)
  • Speed: 250 kbit/s (fixed)

Message Structure

Every RV-C message uses the CAN extended frame format (29-bit identifier + 8 data bytes).

The Message ID Breakdown

The 29-bit CAN ID is divided into meaningful parts:

┌─────────────────────────────────────────────────┐
│   Priority  │ DGN-High │  DGN-Low  │   Source   │
│   (3 bits)  │ (7 bits) │  (8 bits) │  Address   │
│             │          │           │  (8 bits)  │
└─────────────────────────────────────────────────┘
    Bits         Bits       Bits         Bits
   28-26        24-18      15-8          7-0

Components:

  • Priority (3 bits): Message urgency (0=highest, 7=lowest, usually 6 for status)
  • DGN (Data Group Number, 17 bits): Identifies what type of data this is
    • DGN-High (7 bits): Main message category
    • DGN-Low (8 bits): Either sub-category OR target address for commands
  • Source Address (8 bits): Which device sent this message (0-253)

Data Payload

Always 8 bytes of data, even if not all are used. Unused bytes are filled with 0xFF.

Key Concepts

Source Address (SA)

Every device on the network needs a unique 8-bit address (0-253).

Two ways to get an address:

  • Static: Hard-coded address (e.g., Generator is always 35)
  • Dynamic: Device claims an address at startup using address claiming procedure

Important:

  • Source Address identifies the microprocessor/node, not the physical device
  • One microprocessor can handle multiple devices (e.g., one board controlling 3 awnings)

Device Type

Defines what a device can do. Examples:

  • Awning
  • Thermostat (Climate Control)
  • Generator
  • Inverter
  • DC Load (lights, pumps, etc.)
  • Water Heater

Each device type has:

  • Specific messages (DGNs) it can send/receive
  • A Default Source Address (DSA) for diagnostics

Instance

Since RVs often have multiple devices of the same type (e.g., 7 awnings, 4 thermostats), RV-C uses instances to distinguish them.

How it works:

  • Instance is the first data byte in multi-instance device messages
  • Instance 1 = Main Patio Awning
  • Instance 2 = Side Awning
  • Instance 3 = Rear Awning, etc.

Key difference:

  • Source Address = Which microprocessor sent the message
  • Instance = Which physical device is being described/controlled

Example: One thermostat controller (SA=100) can control 4 zones (Instances 1-4)

Message Types

1. Information Sharing (Status Messages)

Devices broadcast their status periodically:

  • Generator: “I’m running at 50% load, 240V AC, 3500 RPM”
  • Battery Monitor: “Battery is 85% charged, 13.2V, 15A charging”
  • Thermostat: “Zone 1 is 72°F, set to 70°F, AC is running”

Characteristics:

  • Priority: Usually 6
  • Broadcast interval: Varies (50ms minimum gap)
  • May broadcast “on change” or on schedule

2. Control Messages (Commands)

Devices send commands to other devices:

  • User panel → Awning: “Extend awning #2”
  • Thermostat → Air conditioner: “Turn on, set to 70°F”

Target addressing:

  • For multi-instance devices: First data byte contains target instance
  • For direct commands: DGN-Low contains target source address

3. Information Request

A device can request immediate data from others:

  • “Please send me your current temperature reading NOW”
  • Uses special DGN: EA00h

4. Diagnostics Messages (DM-RV)

Every device must report its health status:

  • Operating status (normal, warning, error)
  • Fault codes (which component failed)
  • Sent periodically, even when nothing is wrong

Special Data Values

RV-C defines two universal values for all data types:

“Data Not Available”

  • All bits set to 1 (0xFF, 0xFFFF, etc.)
  • Meaning depends on context:
    • In commands: “Don’t change this value”
    • In status: “This sensor is not supported” or “Data not ready yet”

“Error / Out of Range”

  • All bits set to 1 except the MSB (0xFE, 0xFFFE, etc.)
  • In status: “Sensor error or abnormal condition”
  • Never used in commands

Practical Example: Controlling an Awning

Let’s walk through extending awning #2:

1. User presses “Extend” on control panel

2. Panel sends AWNING_COMMAND message:

CAN ID:
  Priority: 3 (high, because it's a command)
  DGN: 1FED9 (Awning Command)
  Source Address: 80 (control panel)

Data Bytes:
  Byte 0: 2 (Instance = Awning #2)
  Byte 1: 1 (Command = Extend)
  Byte 2-7: 0xFF (not used)

3. Awning controller receives message

  • Listens for DGN 1FED9
  • Checks Byte 0 (instance): “Is this for me?”
  • Instance = 2? Yes! Execute command.

4. Awning extends and broadcasts status

CAN ID:
  Priority: 6 (normal status)
  DGN: 1FEE5 (Awning Status)
  Source Address: 45 (awning controller)

Data Bytes:
  Byte 0: 2 (Instance = Awning #2)
  Byte 1: 50 (Position = 50% extended)
  Byte 2: 1 (Status = Extending)
  Byte 3-7: Other status data

5. Panel receives status and updates display

  • “Awning #2: Extending… 50%”

Compliance Levels

RV-C defines two compliance levels:

Level One

Basic network participation

  • Address claiming (if dynamic)
  • Respond to required messages
  • Maintain network integrity

Level Two

Full interoperability

  • Use appropriate DGNs for device type
  • Proper diagnostics reporting
  • Meaningful error responses (NAKs)
  • Document all features

Quick Reference: Common DGNs

Here are some frequently used Data Group Numbers:

DGN (hex)NamePurpose
1FFFFDM-RVDiagnostic message (health status)
1FED9AWNING_COMMANDControl awning
1FEE5AWNING_STATUSAwning position/status
1FFE1THERMOSTAT_COMMANDControl HVAC
1FEF7DC_DIMMER_COMMAND_2Control lights
1FFC7DC_SOURCE_STATUS_1Battery voltage/current
EA00REQUEST_DGNRequest immediate data
EE00ADDRESS_CLAIMEDDynamic address claim

(Full list of 100+ DGNs in Section 6 of the specification)

Protocol References