Files
split-flap-controller/software/pc_client/doc/sfbus-proto.md
2025-09-18 16:38:06 +02:00

116 lines
3.6 KiB
Markdown

# SplitflapBus protocol
The SFBus is an RS485 based protocol. It has a singular master node and up to 32 client nodes per interface. It can adress up to 65536 devices.
## Packet format (1.0)
```
+------------++----------+--------+---------+----------------+-----------+
| Start-Byte | Protocol- | Frame- | Adress | Payload | Stop-Byte |
| | Version | Length | | | |
| 0x2B | 0x00 | 1 byte | 2 bytes | framelegth - 3 | 0x24 |
+------------+-----------+--------+---------+----------------+-----------+
The frame length includes the address and stop-byte
Therefor, the payload is framelegth - 3.
```
## Packet format (2.0)
*This i not yet implemented!!*
```
+------------++----------+--------+---------+----------------+-----------+
| Start-Byte | Protocol- | Frame- | Adress | Payload | Checksum |
| | Version | Length | | | |
| 0x2B | 0x00 | 1 byte | 2 bytes | framelegth - 4 | 2 bytes |
+------------+-----------+--------+---------+----------------+-----------+
The frame length includes the address and stop-byte
Therefor, the payload is framelegth - 4.
```
## Payload format (Protocol Version 1.0 + 2.0)
The first byte of the payload is the command. This tells the controller
what to do or what data to expect next.
```
+----------+----------------+
| Command | Payload |
| Byte | |
| 1 Byte | framelegth - 4 |
+----------+----------------+
```
### Ping
Check if a module is present under this device id
- Payload: `0xFE`
- Expected response: `0xFF`
### Reset
Resets the device controller. Should be done after address or calibration change.
Can also be done to clear error flags
- Paylad `0x30`
- Expects no response.
### Motor power on
- Paylad `0x21`
- Expects no response.
### Motor power off
- Paylad `0x20`
- Expects no response.
### Display flap
- Paylad `0x10 <1 byte: flap id>`
- Expects no response.
### Display flap with full rotation
- Paylad `0x11 <1 byte: flap id>`
- Expects no response.
### Read EEPROM
- Payload `0xF0`
- Response is `0xAA` followed by content of EEPROM (5 bytes). See mapping below.
### Write EEPROM
- Payload `0xF1 <5 bytes of eeprom content>`
- Response is `0xAA` followed by new content of EEPROM. See mapping below.
### Get controller status
- Payload `0xF8`
- Response is 7 bytes long.
```
+--------+------------+------------+
| Byte 0 | Byte 1 - 2 | Byte 3 - 6 |
| 8-Bit | 16-Bit | 32-Bit |
| Status | Voltage | Rotations |
+--------+------------+------------+
| | |
| | +-> uint32 counter of total rotations
| |
| +-> uint16 raw ADC readings.
| double __voltage = ((double)_voltage / 1024) * 55;
|
+-> Bit 0: delta too big. Sensed position not equal to expected position
Bit 1: no home found. Cannot sense home magnet.
Bit 2: fuse blown
Bit 4: device powered down. Can be changed by sending: 0x21
Bit 5: failsafe active. Device failed cirtically and stopped operation.
can be recovered with reset: 0x30
Bit 6: device busy. Device is currently moving to the next flap position
```
## EEPROM format
```
+------------+------------+--------+
| Byte 0 - 1 | Byte 2 - 5 | Byte 6 |
| 16-Bit | 32-Bit | 8-Bit |
| Address | Rotations | Okay |
+------------+------------+--------+
| | |
| | +-> do not change
| |
| +-> uint32 counter of total rotations
|
+-> uint16 device address
```