CAN Bus Servo Communication Protocol
1. Introduction
This document describes the data-area application-layer communication protocol for Fashion Star CAN bus servo. The protocol supports parameter reads and writes, status queries, and motion control between a host controller and a servo. It also defines response packets, continuous writes, buffered commits, the public memory table, byte order, and response-matching rules.
1.1 Scope
This document applies to host-controller development, PC configuration software development, system integration, and communication testing for Fashion Star CAN bus servo.
Protocol Version
This document is based on protocol version 0.2.0.04172025. Different models or firmware versions may add or remove addresses or adjust parameter semantics. Before integration, confirm the target servo model and firmware version.
- Addresses not listed in this document are undefined and must not be accessed.
- Before product integration, confirm the target servo model, firmware version, CAN link-layer configuration, and the units and ranges of all parameters used.
1.2 Protocol Boundaries
This document defines only the contents of the data field in CAN data frames. It does not define the CAN arbitration ID, standard or extended frames, data or remote frames, the initial physical-layer baud rate, termination resistance, the maximum number of nodes, or how CAN FD is used.
Warning
CAN link-layer configuration must follow the applicable datasheet or complete-system interface specification. Do not infer any configuration that has not been explicitly published.
2. General Conventions
2.1 Byte Numbering and Packet Length
Byte1in the original protocol corresponds toData[0]in this document; subsequent bytes follow in sequence.- DLC indicates the actual number of data bytes used by an application-layer packet. The sender must set the DLC as specified by the command, and the receiver must validate the DLC before parsing the data.
- The maximum packet length in this protocol is 8 bytes.
2.2 Command Identifier
Data[0] is a single-byte ASCII command identifier. For example, the byte value of r is 0x72, while the byte value of R is 0x52. Command identifiers are case-sensitive.
2.3 Servo ID
Data[1] is the single-byte ServoID. The range of IDs allowed for ordinary unicast communication depends on the configuration constraints of the specific product; the reference document does not provide the complete range.
ServoID = 0xFF is explicitly used only to broadcast to buffered servo units in the synchronous-motion scenario during continuous writes. Outside this scenario, do not assume that all firmware versions or commands support 0xFF broadcasts. Commands that produce a response must not be broadcast, because multiple nodes may transmit responses simultaneously.
2.4 Parameter Width and Byte Order
Except for the source-table anomaly specifically described in Section 5.4, each parameter in the memory table is 2 bytes long. Packets place the low byte first and the high byte second:
Value = Value_L | (Value_H << 8)
Adjacent addresses whose names contain (L) and (H) together form 32-bit data. The (L) address stores the low 16 bits, and the (H) address stores the high 16 bits:
Value32 = Word_L | (Word_H << 16)
Little-Endian Byte Order
Multibyte data uses little-endian byte order, with the low-order byte first and the high-order byte second. Unless a specific parameter states otherwise, do not infer its signedness, engineering unit, scale factor, or physical-quantity conversion.
2.5 Validation, Errors, and Timeouts
- The reference document does not define an application-layer checksum or CRC field. The CAN link layer still uses CAN's own error-detection mechanisms.
- The reference document does not define error responses for illegal commands, illegal addresses, writes to read-only addresses, or out-of-range parameters.
- The reference document does not specify response timeouts, retry counts, or duplicate-command handling. The host controller must determine these values based on the target product and bus load.
- A post-write response returns the current value at the corresponding address after the device performs the write. The host controller must compare the requested value with the response value and must not assume that the requested value was accepted unchanged merely because a response was received.
3. Control Commands
The following table summarizes the application-layer control commands for a CAN bus servo. Command identifiers are case-sensitive.
| CMD | Hex | Direction | Function | DLC | Response |
|---|---|---|---|---|---|
r |
0x72 |
Host -> servo | Read one parameter | 3 | v, DLC = 5 |
R |
0x52 |
Host -> servo | Read two parameters | 4 | V, DLC = 8 |
w |
0x77 |
Host -> servo | Write one parameter | 5 | No response |
W |
0x57 |
Host -> servo | Write two parameters | 8 | No response |
x |
0x78 |
Host -> servo | Write one parameter and respond | 5 | v, DLC = 5 |
X |
0x58 |
Host -> servo | Write two parameters and respond | 8 | V, DLC = 8 |
Q |
0x51 |
Host -> servo | Begin continuous writes | 2 | No response |
q |
0x71 |
Host -> servo | End continuous writes and commit | 2 | No response |
v |
0x76 |
servo -> Host | Single-parameter response | 5 | Triggered by r or x |
V |
0x56 |
servo -> Host | Dual-parameter response | 8 | Triggered by R or X |
4. Packet Structure
4.1 Read One Parameter
- Request command:
r(0x72) - Response command:
v(0x76)
4.1.1 Request Packet
| Byte | Field | Description |
|---|---|---|
Data[0] |
CMD |
Fixed at r (0x72) |
Data[1] |
ServoID |
Target servo ID |
Data[2] |
Addr |
Parameter address |
4.1.2 Response Packet
| Byte | Field | Description |
|---|---|---|
Data[0] |
CMD |
Fixed at v (0x76) |
Data[1] |
ServoID |
Responding servo ID |
Data[2] |
Addr |
Parameter address; must match the request |
Data[3] |
Value_L |
Parameter low byte |
Data[4] |
Value_H |
Parameter high byte |
4.2 Read Two Parameters
- Request command:
R(0x52) - Response command:
V(0x56)
4.2.1 Request Packet
| Byte | Field | Description |
|---|---|---|
Data[0] |
CMD |
Fixed at R (0x52) |
Data[1] |
ServoID |
Target servo ID |
Data[2] |
Addr_A |
Parameter A address |
Data[3] |
Addr_B |
Parameter B address |
4.2.2 Response Packet
| Byte | Field | Description |
|---|---|---|
Data[0] |
CMD |
Fixed at V (0x56) |
Data[1] |
ServoID |
Responding servo ID |
Data[2] |
Addr_A |
Parameter A address; must match the request |
Data[3] |
Value_A_L |
Parameter A low byte |
Data[4] |
Value_A_H |
Parameter A high byte |
Data[5] |
Addr_B |
Parameter B address; must match the request |
Data[6] |
Value_B_L |
Parameter B low byte |
Data[7] |
Value_B_H |
Parameter B high byte |
4.3 Write One Parameter
- Write command without response:
w(0x77) - Write command with response:
x(0x78)
4.3.1 Command Packet
| Byte | Field | Description |
|---|---|---|
Data[0] |
CMD |
w (0x77) or x (0x78) |
Data[1] |
ServoID |
Target servo ID |
Data[2] |
Addr |
Parameter address |
Data[3] |
Value_L |
Parameter low byte |
Data[4] |
Value_H |
Parameter high byte |
Response Rules
w does not produce a response after a write. After a write, x uses a 5-byte v packet to return the current value at the corresponding address. The host controller must compare the requested value with the response value and must not assume that the requested value was accepted unchanged merely because a response was received.
4.4 Write Two Parameters
- Write command without response:
W(0x57) - Write command with response:
X(0x58)
4.4.1 Command Packet
| Byte | Field | Description |
|---|---|---|
Data[0] |
CMD |
W (0x57) or X (0x58) |
Data[1] |
ServoID |
Target servo ID |
Data[2] |
Addr_A |
Parameter A address |
Data[3] |
Value_A_L |
Parameter A low byte |
Data[4] |
Value_A_H |
Parameter A high byte |
Data[5] |
Addr_B |
Parameter B address |
Data[6] |
Value_B_L |
Parameter B low byte |
Data[7] |
Value_B_H |
Parameter B high byte |
Response Rules
W does not produce a response after a write. After a write, X uses an 8-byte V packet to return the current values at the two corresponding addresses. The host controller must verify both addresses, their order, and the actual response values.
4.5 Continuous Writes
4.5.1 Begin Continuous Writes
| Byte | Field | Description |
|---|---|---|
Data[0] |
CMD |
Fixed at Q (0x51) |
Data[1] |
ServoID |
Target servo ID |
4.5.2 End and Commit
| Byte | Field | Description |
|---|---|---|
Data[0] |
CMD |
Fixed at q (0x71) |
Data[1] |
ServoID |
Target servo ID |
4.5.3 Continuous-Write Rules
- After the servo receives
Q, subsequent parameter writes first enter the buffer. - The buffer accepts up to eight
worWpackets. After receiving the eighth packet, the device automatically performs one write operation. - During continuous writes,
xandXare handled aswandW, respectively, and no response is sent. - Receiving
rorRduring continuous writes does not change the continuous-write behavior. - After receiving
q, the device stops accepting continuous-write parameters and writes all buffered parameters in a single operation. - The reference document does not state whether the device automatically exits the buffered state after writing the eighth packet. The host controller must not rely on undefined behavior and must explicitly send
qto complete the process.
Synchronous Motion
Write the motion parameters at addresses 0x50-0x58 while the device is in the buffered state, and then write 0x0001 to address 0x59. This trigger can use a specified ServoID or ServoID = 0xFF to broadcast to buffered servo units. Do not wait for a device response after a broadcast trigger.
5. Memory Table
5.1 Table Notes
- The unit of “Length” is bytes.
- “-” means that the reference document does not specify a value; it does not mean that the value is 0.
- “Not published” means that the access attribute has not been made public.
- Parameters without a specified unit, scale, or range may only be accessed as raw values and must not be converted into engineering quantities without supporting documentation.
5.2 Device Information and Real-Time Status
| Address | Parameter | Length | Readable | Writable | Default | Range/Enumeration | Unit | Description |
|---|---|---|---|---|---|---|---|---|
0x01 |
servo Model | 2 | Yes | Not published | - | - | - | - |
0x02 |
Firmware Version | 2 | Yes | Not published | - | - | - | - |
0x03 |
servo Serial Number (L) | 2 | Yes | Not published | - | - | - | Serial number low 16 bits |
0x04 |
servo Serial Number (H) | 2 | Yes | Not published | - | - | - | Serial number high 16 bits |
0x10 |
servo Voltage | 2 | Yes | No | - | - | Not specified | - |
0x11 |
servo Current | 2 | Yes | No | - | - | Not specified | - |
0x12 |
servo Power | 2 | Yes | No | - | - | Not specified | - |
0x13 |
servo Temperature | 2 | Yes | No | - | - | Not specified | - |
0x14 |
servo Status | 2 | Yes | No | - | - | - | - |
0x15 |
Current Angle in Multi-Turn Mode (L) | 2 | Yes | No | - | - | Not specified | Current angle low 16 bits |
0x16 |
Current Angle in Multi-Turn Mode (H) | 2 | Yes | No | - | - | Not specified | Current angle high 16 bits |
0x17 |
Turn Count | 2 | Yes | No | - | - | turns | - |
0x18 |
Current Angle (Single-Turn Mode) | 2 | Yes | No | - | - | Not specified | - |
5.3 Motion Control
| Address | Parameter | Length | Readable | Writable | Default | Range/Enumeration | Unit | Description |
|---|---|---|---|---|---|---|---|---|
0x28 |
Damping Mode Power | 2 | Yes | Yes | - | - | mW | Enters damping mode after writing |
0x50 |
Time to Target Angle (L) | 2 | Yes | Yes | - | - | ms | Time low 16 bits |
0x51 |
Time to Target Angle (H) | 2 | Yes | Yes | - | - | ms | Time high 16 bits |
0x52 |
Angle Mode Selection | 2 | Yes | Yes | - | 0: Default; 1: Based on acceleration/deceleration; 2: Based on speed |
- | - |
0x53 |
Specified Angle (L) | 2 | Yes | Yes | - | - | 0.1° | Specified angle low 16 bits |
0x54 |
Specified Angle (H) | 2 | Yes | Yes | - | - | 0.1° | Specified angle high 16 bits |
0x55 |
Angle Mode Operating Power | 2 | Yes | Yes | - | - | mW | - |
0x56 |
Acceleration-Phase Time at Startup | 2 | Yes | Yes | - | - | ms | - |
0x57 |
Deceleration-Phase Time Near Target | 2 | Yes | Yes | - | - | ms | - |
0x58 |
Maximum Speed to Target Angle | 2 | Yes | Yes | - | - | 0.1°/s | - |
0x59 |
Execute Angle Motion | 2 | Yes | Yes | - | 0: Default, no action; 1: Execute |
- | Executes the motion parameters already written to 0x50-0x58 |
5.4 Control and Reset
| Address | Parameter | Length | Readable | Writable | Default | Range/Enumeration | Unit | Description |
|---|---|---|---|---|---|---|---|---|
0x78 |
User Data Reset | 2 | No | Yes | 0 |
0-65535 |
- | Resets the user data area to factory defaults |
0x79 |
Clear Current Turn Count | 2 | No | Yes | - | 0: Default; 1: Clear turn count |
- | - |
0x7A |
Origin Setting | 2 | No | Yes | - | 0: Set the current servo angle to 0°; nonzero value: restore factory settings |
- | - |
0x7B |
Stop Control Mode | 2 | No | Yes | - | 0x10: Release torque after stopping (unlocked); 0x11: Maintain holding torque after stopping; 0x12: Enter damping state after stopping |
- |
Note
In the source table for 0x78, the maximum value is listed as 0 and the minimum value as 65535. This document corrects the valid unsigned 16-bit raw-value range to 0-65535.
5.5 Communication and Protection Configuration
| Address | Parameter | Length | Readable | Writable | Default | Range/Enumeration | Unit | Description |
|---|---|---|---|---|---|---|---|---|
0x80 |
Control Response | 2 | Yes | Yes | - | Not specified | - | - |
0x81 |
servo ID | 2 | Yes | Yes | - | 0-254 | - | - |
0x82 |
Baud Rate | 2 | Yes | Yes | 6 |
See Section 5.6 | - | Default: 500 kbps |
0x83 |
Stall Unlock Protection | 2 | Yes | Yes | - | Not specified | - | - |
0x84 |
Stall Power Limit | 2 | Yes | Yes | - | Not specified | mW | - |
0x85 |
Undervoltage Protection Voltage | 2 | Yes | Yes | - | Not specified | mV | - |
0x86 |
Overvoltage Protection Voltage | 2 | Yes | Yes | - | Not specified | mV | - |
0x87 |
Temperature Protection Threshold | 2 | Yes | Yes | - | Not specified | - | - |
0x88 |
Power Protection Threshold | 2 | Yes | Yes | - | Not specified | mW | - |
0x89 |
Current Protection Threshold | 2 | Yes | Yes | - | Not specified | mA | - |
0x8A |
Acceleration | 2 | Yes | Yes | - | Not specified | Not specified | - |
0x8B |
Power Protection Hysteresis Parameter | 2 | Yes | Yes | - | Not specified | Not specified | - |
0x8C |
Power-On Torque Lock Switch | 2 | Yes | Yes | - | Not specified | - | - |
0x8D |
Wheel Mode Brake Switch | 2 | Yes | Yes | - | Not specified | - | - |
0x8E |
Angle Limit Switch | 2 | Yes | Yes | - | Not specified | - | - |
0x8F |
Power-On Soft-Start Switch | 2 | Yes | Yes | - | Not specified | - | - |
0x90 |
Power-On Soft-Start Time | 2 | Yes | Yes | - | Not specified | ms | - |
0x91 |
Upper Angle Limit | 2 | Yes | Yes | - | Not specified | 0.1° | - |
0x92 |
Lower Angle Limit | 2 | Yes | Yes | - | Not specified | 0.1° | - |
0x93 |
Center Offset | 2 | Yes | Yes | - | Not specified | 0.1° | - |
5.6 Baud Rate Enumeration
| Parameter Value | CAN Baud Rate |
|---|---|
0 |
50 kbps |
1 |
100 kbps |
2 |
125 kbps |
3 |
200 kbps |
4 |
250 kbps |
5 |
400 kbps |
6 |
500 kbps (default) |
7 |
750 kbps |
8 |
800 kbps |
9 |
1 Mbps |
6. Communication Examples
The following examples show only the application-layer data field and do not include link-layer settings such as the CAN arbitration ID. All bytes are shown in hexadecimal.
6.1 Read the Raw Current Single-Turn Angle
请求:72 01 18
响应:76 01 18 34 12
The raw response value is 0x1234.
6.2 Write and Verify One Parameter
Example: Write the value 0x0520 to address 0x85 on ServoID = 0x01.
Request data:
78 01 85 20 05
If the write succeeds, the device must return:
76 01 85 20 05
6.3 Commit Buffered Motion Parameters
51 01 # Q:开始连续写入
77 01 52 01 00 # w:角度模式选择 = 1
77 01 59 01 00 # w:执行角度运动 = 1,先进入缓存
71 01 # q:提交缓存并结束连续写入
7. Host Controller Implementation Requirements
- Command identifiers must be case-sensitive.
- Multibyte parameters must be encoded and parsed with the low byte first.
- When receiving a response, validate at least the DLC, command,
ServoID, and address. For a dual-parameter response, also validate both addresses and their order. - For responses to
xandX, compare the actual response values with the requested values. - Do not wait for a response to
xorXduring continuous writes. - For write-only parameters, verify the result according to the specific function outcome or product definition.
- Do not independently define meanings in a public interface for parameters whose units, scaling, signedness, status bits, or effective timing have not been published.
- Before changing the servo ID or baud rate, design a communication-recovery and device-identification procedure.