MIT Polling Reply Guide
This page describes the BXI motor MIT-mode reply frame and the AUX polling reply format enabled by mit_aux_enable. After the host sends MIT control frames periodically, the motor returns one status frame for each valid control frame; AUX polling data reuses the last two bytes of that reply frame.
Unless otherwise noted, CAN IDs, data bytes, raw values, and example values in this page are hexadecimal. Physical values, frequencies, and unit conversion results are shown in decimal.
1. Check Before Use
MIT replies are triggered by MIT control frames from the host. The motor responds to these control frame IDs:
| Control frame CAN ID | Description |
|---|---|
can_id | Unicast MIT control frame for the current motor |
0x7FF | Broadcast MIT control frame; the motor reads its own 8-byte control block according to can_id |
The motor reply frame uses master_id as its CAN ID. By default:
master_id = can_id | 0x010
For example, when can_id=1, the default master_id=0x11, so the host should receive reply frames with CAN ID 0x11. When can_id is changed, the program normally updates master_id together with it. master_id can also be changed independently through registers. See "Motor Register Communication Protocol" and the register map for the matching version for register commands and register selection.
Warning
When polling multiple motors in MIT mode, make sure their master_id values do not conflict. Otherwise, multiple motors may reply with the same CAN ID and the host cannot reliably distinguish the sources.
2. MIT Reply Frame Format
The MIT reply frame is always 8 bytes:
| Field | Content |
|---|---|
| CAN ID | master_id |
| DLC | 8 |
data[0] | Current motor can_id |
data[1..5] | Position, velocity, and torque feedback |
data[6..7] | Temperature feedback by default; AUX polling data when mit_aux_enable is enabled |
The byte layout is:
| Reply frame | data[0] | data[1] | data[2] | data[3] | data[4] | data[5] | data[6] | data[7] |
|---|---|---|---|---|---|---|---|---|
mit_aux_enable=0 | ID | POS[15:8] | POS[7:0] | VEL[11:4] | VEL[3:0] and TOR[11:8] | TOR[7:0] | NTC1 | NTC2 |
mit_aux_enable=1 | ID | POS[15:8] | POS[7:0] | VEL[11:4] | VEL[3:0] and TOR[11:8] | TOR[7:0] | aux[15:8] | aux[7:0] |
Position, velocity, torque, and AUX are packed as bit fields with the high bits first. See the final "Bit-Field Parsing Notes" section.
3. Basic Feedback Parsing
First parse the raw values from data[1..5]:
id_raw = data[0]
pos_raw = (data[1] << 8) | data[2]
vel_raw = (data[3] << 4) | (data[4] >> 4)
tor_raw = ((data[4] & 0x0F) << 8) | data[5]
Then convert raw values back to physical values with linear mapping:
value = raw * (max - min) / ((1 << bits) - 1) + min
The ranges below come from motor configuration. They may differ between motor models or configurations, so read the related configuration values or check the register map for the matching version before parsing.
| Field | Width | Default range |
|---|---|---|
POS | 16 bit | [-max_pos, max_pos], default [-12.5, 12.5] rad |
VEL | 12 bit | [-max_vel, max_vel], default [-45.0, 45.0] rad/s |
TOR | 12 bit | [-max_tor, max_tor], default value depends on the motor model |
Common parsing formulas:
position_rad = uint_to_float(pos_raw, -max_pos, max_pos, 16)
velocity_rad_s = uint_to_float(vel_raw, -max_vel, max_vel, 12)
torque_Nm = uint_to_float(tor_raw, -max_tor, max_tor, 12)
Note
In normal operation, TOR is torque feedback. When current-test functions are enabled, the program may use this field to return q-axis current instead. Use the current program state as the final reference.
4. AUX Polling Reply Parsing
mit_aux_enable controls the last two bytes of the MIT reply:
mit_aux_enable = 0 -> legacy protocol: data[6]=NTC1, data[7]=NTC2, both 8-bit encoded
mit_aux_enable = 1 -> AUX polling: data[6..7] carry aux_id + payload
mit_aux_enable is disabled by default after power-on and is not saved to Flash. To receive AUX polling data, the host must write mit_aux_enable=1 for the current run. In the currently checked programs, this configuration item is at 0x6D; for different configuration versions, use the matching register map as the final reference.
When enabled, data[6..7] is parsed as one 16-bit AUX field:
aux = (data[6] << 8) | data[7]
aux_id = (aux >> 12) & 0x0F
payload = aux & 0x0FFF
Equivalent split:
aux_id = data[6] >> 4
payload = ((data[6] & 0x0F) << 8) | data[7]
Do not infer the data type from the frame index. Parse aux_id in every frame, then interpret payload according to that aux_id.
5. AUX Polling Order and Rate
AUX IDs rotate in this order:
0x0 -> 0x1 -> 0x2 -> 0x3 -> 0x4 -> 0x5 -> 0x6 -> 0x7 -> 0x8 -> 0x9 -> 0xF -> 0x0
The total AUX rate equals the MIT reply rate. Each item updates at roughly the MIT reply rate divided by 11.
| MIT reply rate | Single item rate |
|---|---|
| 1000 Hz | 90.9 Hz |
| 500 Hz | 45.5 Hz |
| 100 Hz | 9.1 Hz |
6. AUX Data Parsing
aux_id | Data | payload parsing | Communication range | Resolution |
|---|---|---|---|---|
0x0 | NTC1 temperature | temp_C = payload / 10.0 - 30.0 | -30.0..150.0 C | 0.1 C |
0x1 | NTC2 temperature | temp_C = payload / 10.0 - 30.0 | -30.0..150.0 C | 0.1 C |
0x2 | Winding temperature observer | temp_C = payload / 10.0 - 30.0 | -30.0..150.0 C | 0.1 C |
0x3 | Bus voltage v_bus | v_bus = payload / 10.0 | 0.0..100.0 V | 0.1 V |
0x4 | Bus current i_bus_filt | current_A = payload / 10.0 - 150.0 | -150.0..150.0 A | 0.1 A |
0x5 | q-axis current i_q_filt | current_A = payload / 10.0 - 150.0 | -150.0..150.0 A | 0.1 A |
0x6 | d-axis current i_d_filt | current_A = payload / 10.0 - 150.0 | -150.0..150.0 A | 0.1 A |
0x7 | Program state and runtime flags | See bit definitions below | 0x000..0xFFF | bitfield |
0x8 | Thermal derating coefficient temper_coefficient | coeff = payload / 1000.0 | 0.000..1.000 | 0.001 |
0x9 | Voltage utilization | util = payload / 1000.0 | 0.000..2.000 | 0.001 |
0xF | Heartbeat counter | heartbeat = payload | 0..4095, wraps | 1 |
payload = 0xFFF means the data is invalid or unsupported by the current program. Heartbeat 0xF is the exception, because it naturally wraps through 0xFFF.
When parsing payload, first use aux_id to identify the data type, then treat payload as an unsigned integer and apply the corresponding formula. The divisions, offsets, and unit conversions in the table are decimal calculations.
Temperature data includes aux_id=0x0, 0x1, and 0x2:
payload = 0x02BC = 700
temp_C = 700 / 10.0 - 30.0 = 40.0 C
Voltage data uses aux_id=0x3:
payload = 0x0F0 = 240
v_bus = 240 / 10.0 = 24.0 V
Current data includes aux_id=0x4, 0x5, and 0x6:
payload = 0x05DC = 1500
current_A = 1500 / 10.0 - 150.0 = 0.0 A
Coefficient data includes aux_id=0x8 and 0x9:
payload = 0x02EE = 750
coeff = 750 / 1000.0 = 0.750
util = 750 / 1000.0 = 0.750
Heartbeat aux_id=0xF does not need unit conversion. payload is the current heartbeat count. It increments and wraps in the 12-bit range, so it can be used to check whether MIT replies are still updating.
7. Status Word 0x7
When aux_id=0x7, payload is a status word:
bit0..3 FSM state
bit4 FOC armed
bit5 ENCI calib_valid
bit6 ENCO calib_valid
bit7 field_weaken_mode
bit8 mit_mode
bit9..11 control_mode
bit6 is related to the external output encoder. It may remain 0 in programs that do not support that hardware or function.
Common FSM state values:
0 STARTUP
1 MENU
2 MOTOR
3 ENCI_AUTO
4 ENCI
5 ENCO
6 ENCI_SLS_AUTO
7 SETUP
8 ERROR
9 OPEN
10 SLS
8. Default Protocol Temperature Parsing
When mit_aux_enable=0, data[6] and data[7] are not an AUX field. They are two 8-bit temperature values:
ntc1_C = data[6] * 180.0 / 255.0 - 30.0
ntc2_C = data[7] * 180.0 / 255.0 - 30.0
In this mode, the MIT reply directly provides only NTC1 and NTC2 temperatures. Other AUX data requires mit_aux_enable to be enabled.
9. Parsing Example
Assume this reply is received:
11#017FFF7FF7FF30F0
CAN ID 0x11 is master_id, and the data bytes are:
data[0] = 0x01
data[1] = 0x7F
data[2] = 0xFF
data[3] = 0x7F
data[4] = 0xF7
data[5] = 0xFF
data[6] = 0x30
data[7] = 0xF0
The basic raw feedback values are:
pos_raw = 0x7FFF
vel_raw = 0x7FF
tor_raw = 0x7FF
If mit_aux_enable=1, the last two bytes parse as:
aux_id = 0x3
payload = 0x0F0
aux_id=0x3 means bus voltage, so:
v_bus = 0x0F0 / 10.0 = 24.0 V
10. Bit-Field Parsing Notes
POS, VEL, TOR, and aux in MIT reply frames are packed as bit fields with high bits first. Restore raw values with shifts and masks.
For example, when data[6]=0x30 and data[7]=0xF0:
aux = (0x30 << 8) | 0xF0 = 0x30F0
aux_id = (0x30F0 >> 12) & 0x0F = 0x3
payload = 0x30F0 & 0x0FFF = 0x0F0
Then parse payload with the formula for the corresponding aux_id to get the physical value or status field.