Skip to content

MSCB protocol

This section specifies the node-bus protocol implemented by the current software and firmware.

Communication model

MSCB uses a master/slave exchange on a half-duplex RS-485 bus. A master sends an address cycle followed by a command. Only the addressed node replies. More than one master can share a bus when ownership is passed through the token-ring mechanism; ordinary node traffic remains master initiated.

Each serial character has an additional ninth data bit:

  • ninth bit 1: address byte;
  • ninth bit 0: command, parameter, response, or CRC byte.

This lets every node recognize an address cycle in hardware, without parsing all traffic. The bit order and electrical levels are described under RS-485 bus.

Command-byte encoding

The upper five bits identify the command family. The lower three bits encode the number of bytes that follow the command byte:

Low bits Meaning
06 Exactly that many bytes follow
7 A separate length field follows

For the extended form, a length byte below 0x80 represents 0–127 bytes. If its high bit is set, it is the most significant byte of a two-byte, 15-bit length, allowing 128–32767 bytes. The length counts command parameters and data, but not the command byte or final CRC.

Examples:

0xA1 index crc                         READ, 1-byte payload
0xAF 0x06 first last data... crc       WRITE_RANGE, 6-byte payload
0xBF 0x80 0x07 ... crc                 READ_MEM, long length = 7

Byte order

Multi-byte parameters are generally sent least significant byte first. Several command formats deliberately specify another order, notably 16-bit node addresses and variable values, which are transmitted most significant byte first. Follow the byte order shown in each command table; it is authoritative for that field.

CRC-8

All complete command and response telegrams use an 8-bit CRC with polynomial x⁸ + x⁵ + x⁴ + 1 (0x31). The CRC covers the command or response byte and all length, parameter, and data bytes before the CRC. Address-cycle bytes are not part of the command CRC.

Reference algorithm:

unsigned char crc8(const unsigned char *data, int len)
{
    unsigned char crc = 0;
    while (len--) {
        crc ^= *data++;
        for (int i = 0; i < 8; i++)
            crc = (crc & 0x80) ? (crc << 1) ^ 0x31 : crc << 1;
    }
    return crc;
}

A receiver silently discards a telegram with a bad CRC. For acknowledged writes the node returns the received command CRC; the master compares it and retries if it differs.

Address cycle

An address telegram is the command byte, the address bytes listed below, and a CRC. Every byte of that telegram, including the CRC, is sent with the ninth bit set.

Command Value Bytes following Purpose
MCMD_ADDR_NODE8 0x09 node low byte Select an 8-bit node address
MCMD_ADDR_NODE16 0x0A node MSB, node LSB Select a 16-bit node address
MCMD_ADDR_GRP8 0x11 group low byte Select an 8-bit group address
MCMD_ADDR_GRP16 0x12 group MSB, group LSB Select a 16-bit group address
MCMD_ADDR_BC 0x10 none Broadcast to all nodes
MCMD_PING8 0x19 node low byte Probe an 8-bit node address
MCMD_PING16 0x1A node MSB, node LSB Probe a 16-bit node address

Fresh nodes use node address 0xFFFF. Ping is itself an address-cycle command; a matching node responds with 0x78 and no CRC. The response target is an acknowledgement within 100 µs, while the documented master ping timeout is 400 µs.

For an 8-bit address cycle, every participating node must have a zero high address byte. Once a node or group is selected it remains selected for normal commands until another address cycle is issued.

Group and broadcast addressing can only be used with operations that do not need a unique reply: unacknowledged write, set baud rate, freeze, and synchronization. A group address cannot safely be used with a normal read or acknowledged write because several nodes could transmit simultaneously.

Transaction shape

sequenceDiagram
    participant M as Master
    participant S as Submaster
    participant N as Addressed node
    M->>S: UDP request
    S->>N: address cycle (bit 9 = 1)
    S->>N: command + parameters + CRC (bit 9 = 0)
    N-->>S: ACK/data + CRC
    S-->>M: UDP reply

The UDP envelope is a submaster transport and is not placed on the RS-485 wire. See Ethernet transport.

Variable model

A node exposes up to 256 variables at indexes 0–255. A variable has a width of 1–256 bytes, a name, flags, a unit and metric prefix, and optional status bits. Nodes normally map variables onto RAM and copy persistent values to flash or EEPROM when FLASH is issued. Metadata queries make the network self-documenting; no central register map is required.

Node firmware invokes its application hook when a variable is read or written, allowing the value to be transferred to an ADC, DAC, or other physical entity. Pure configuration variables can remain as local RAM values.

Robustness rules

  • Discard any telegram whose CRC is wrong.
  • An omitted channel/index defaults to zero for commands that permit that shorthand.
  • On an acknowledged write, compare the returned CRC with the command CRC and retry on mismatch.
  • Do not expect replies to group or broadcast operations.
  • Use the timeout class appropriate to the operation; flash and upgrade are intentionally much slower than reads.

Continue with the command reference and response formats.