CAN Protocol
Note
This document describes the CAN Protocol. For examples of usage, check out our CAN Bus Guide.
Overview
The ODrive CANSimple protocol uses standard 11-bit message identifiers.
CANSimple Message ID
node_id: The node ID of the ODrive (
<axis>.config.can.node_id
). Can be configured viaodrivetool
or the GUI.cmd_id: The Command ID, identifying the message type. All available commands are listed in Messages.
Messages prefixed with
Set_
are messages that the host can send to the ODrive.Messages prefixed with
Get_
are messages that the ODrive can send to the host. These messages can be enabled as Cyclic Messages or requested explicitly by the master. To explicitly request a message, the master sends a message with the RTR bit set, and the ODrive responds with the same ID and corresponding payload. (A message with of RTR=0 and an empty payload can also be used, but is susceptible to collisions with the ODrive’s response.)All values are encoded in little endian (aka Intel format, aka least significant byte first).
Floats are encoded with the standard IEEE 754 Float format.
CMD ID |
Name |
Direction |
Signals |
---|---|---|---|
0x000 |
ODrive → Host |
Protocol_Version Hw_Version_Major Hw_Version_Minor Hw_Version_Variant Fw_Version_Major Fw_Version_Minor Fw_Version_Revision Fw_Version_Unreleased |
|
0x001 |
ODrive → Host |
Axis_Error Axis_State Procedure_Result Trajectory_Done_Flag |
|
0x002 |
Host → ODrive |
||
0x003 |
ODrive → Host |
Active_Errors Disarm_Reason |
|
0x004 |
Host → ODrive |
Opcode Endpoint_ID Reserved Value |
|
0x005 |
ODrive → Host |
Reserved0 Endpoint_ID Reserved1 Value |
|
0x006 |
Host → ODrive |
Axis_Node_ID |
|
0x007 |
Host → ODrive |
Axis_Requested_State |
|
0x009 |
ODrive → Host |
Pos_Estimate Vel_Estimate |
|
0x00b |
Host → ODrive |
Control_Mode Input_Mode |
|
0x00c |
Host → ODrive |
Input_Pos Vel_FF Torque_FF |
|
0x00d |
Host → ODrive |
Input_Vel Input_Torque_FF |
|
0x00e |
Host → ODrive |
Input_Torque |
|
0x00f |
Host → ODrive |
Velocity_Limit Current_Limit |
|
0x011 |
Host → ODrive |
Traj_Vel_Limit |
|
0x012 |
Host → ODrive |
Traj_Accel_Limit Traj_Decel_Limit |
|
0x013 |
Host → ODrive |
Traj_Inertia |
|
0x014 |
ODrive → Host |
Iq_Setpoint Iq_Measured |
|
0x015 |
ODrive → Host |
FET_Temperature Motor_Temperature |
|
0x016 |
Host → ODrive |
||
0x017 |
ODrive → Host |
Bus_Voltage Bus_Current |
|
0x018 |
Host → ODrive |
||
0x019 |
Host → ODrive |
Position |
|
0x01a |
Host → ODrive |
Pos_Gain |
|
0x01b |
Host → ODrive |
Vel_Gain Vel_Integrator_Gain |
|
0x01c |
ODrive → Host |
Torque_Target Torque_Estimate |
|
0x01f |
Host → ODrive |
Cyclic Messages
The ODrive can be configured to send some messages periodically without a request
from the host. This is done by setting the desired send intervals in <odrv>.axis.config.can
. An interval of 0
disables the message.
Message |
Configuration ( |
Default Interval |
---|---|---|
100 ms |
||
10 ms |
||
disabled |
||
disabled |
||
disabled |
||
disabled |
||
disabled |
Watchdog
The ODrive’s watchdog timer can be used as a safety feature to disable the motor when CAN communication is disrupted.
See axis.config.enable_watchdog
on how to enable the watchdog timer.
Each valid CAN message (with the correct node_id
and a valid cmd_id
) received by the ODrive resets its watchdog timer.
DBC Files
DBC files are machine-readable database files that describe CAN message formats.
The CANSimple .dbc file for each firmware version can be downloaded here.
Several tools and libraries exist to ingest DBC files. For example you can use the free CANdb++ software from Vector to view the database.
Interoperability with CANopen
ODrives can coexist with CANopen devices on the same bus if caution is taken with the node ID assignment.
The following table lists the valid combinations of node IDs for both CANopen and CANsimple.
CANOpen node IDs |
ODrive CANSimple node IDs |
---|---|
32 … 127 |
0x10, 0x18, 0x20, 0x28 |
64 … 127 |
0x10, 0x11, 0x18, 0x19, 0x20, 0x21, 0x28, 0x29 |
96 … 127 |
0x10, 0x11, 0x12, 0x18, 0x19, 0x1A, 0x20, 0x21, 0x22, 0x28, 0x29, 0x2A |
Messages
Get_Version
Command ID: 0x00
Direction: ODrive → Host
Start Byte |
Name |
Type |
Description |
---|---|---|---|
0 |
Protocol_Version |
uint8 |
Always reported as 2 |
1 |
Hw_Version_Major |
uint8 |
|
2 |
Hw_Version_Minor |
uint8 |
|
3 |
Hw_Version_Variant |
uint8 |
|
4 |
Fw_Version_Major |
uint8 |
|
5 |
Fw_Version_Minor |
uint8 |
|
6 |
Fw_Version_Revision |
uint8 |
|
7 |
Fw_Version_Unreleased |
uint8 |
Heartbeat
Command ID: 0x01
Direction: ODrive → Host
Start Byte |
Name |
Type |
Description |
---|---|---|---|
0 |
Axis_Error |
uint32 |
|
4 |
Axis_State |
uint8 |
|
5 |
Procedure_Result |
uint8 |
|
6 |
Trajectory_Done_Flag |
uint8 |
|
Estop
Command ID: 0x02
Direction: Host → ODrive
Empty Payload
Causes the axis to disarm with ESTOP_REQUESTED
.
Get_Error
Command ID: 0x03
Direction: ODrive → Host
Start Byte |
Name |
Type |
Description |
---|---|---|---|
0 |
Active_Errors |
uint32 |
|
4 |
Disarm_Reason |
uint32 |
RxSdo
Command ID: 0x04
Direction: Host → ODrive
Start Byte |
Name |
Type |
Description |
---|---|---|---|
0 |
Opcode |
uint8 |
0: read, 1: write |
1 |
Endpoint_ID |
uint16 |
Endpoint ID as found in |
3 |
Reserved |
uint8 |
|
4 |
Value |
uint32 |
Data type and length depend on endpoint ID |
Sent by the host to read or write from/to arbitrary parameters. See Arbitrary Parameter Access for details.
TxSdo
Command ID: 0x05
Direction: ODrive → Host
Start Byte |
Name |
Type |
Description |
---|---|---|---|
0 |
Reserved0 |
uint8 |
|
1 |
Endpoint_ID |
uint16 |
Endpoint ID as found in |
3 |
Reserved1 |
uint8 |
|
4 |
Value |
uint32 |
Data type and length depend on endpoint ID |
Sent by the ODrive in response to an RxSdo with Opcode=READ. See Arbitrary Parameter Access for details.
Set_Axis_Node_ID
Command ID: 0x06
Direction: Host → ODrive
Start Byte |
Name |
Type |
Description |
---|---|---|---|
0 |
Axis_Node_ID |
uint32 |
Set_Axis_State
Command ID: 0x07
Direction: Host → ODrive
Start Byte |
Name |
Type |
Description |
---|---|---|---|
0 |
Axis_Requested_State |
uint32 |
Get_Encoder_Estimates
Command ID: 0x09
Direction: ODrive → Host
Start Byte |
Name |
Type |
Unit |
Description |
---|---|---|---|---|
0 |
Pos_Estimate |
float32 |
rev |
depending on |
4 |
Vel_Estimate |
float32 |
rev/s |
This message is sent by the ODrive periodically by default. See also Cyclic Messages.
Set_Controller_Mode
Command ID: 0x0b
Direction: Host → ODrive
Start Byte |
Name |
Type |
Description |
---|---|---|---|
0 |
Control_Mode |
uint32 |
|
4 |
Input_Mode |
uint32 |
Set_Input_Pos
Command ID: 0x0c
Direction: Host → ODrive
Start Byte |
Name |
Type |
Unit |
Description |
---|---|---|---|---|
0 |
Input_Pos |
float32 |
rev |
|
4 |
Vel_FF |
int16 |
0.001 rev/s |
|
6 |
Torque_FF |
int16 |
0.001 Nm |
Set_Input_Vel
Command ID: 0x0d
Direction: Host → ODrive
Start Byte |
Name |
Type |
Unit |
Description |
---|---|---|---|---|
0 |
Input_Vel |
float32 |
rev/s |
|
4 |
Input_Torque_FF |
float32 |
Nm |
Set_Input_Torque
Command ID: 0x0e
Direction: Host → ODrive
Start Byte |
Name |
Type |
Unit |
Description |
---|---|---|---|---|
0 |
Input_Torque |
float32 |
Nm |
Set_Limits
Command ID: 0x0f
Direction: Host → ODrive
Start Byte |
Name |
Type |
Unit |
Description |
---|---|---|---|---|
0 |
Velocity_Limit |
float32 |
rev/s |
|
4 |
Current_Limit |
float32 |
A |
Set_Traj_Vel_Limit
Command ID: 0x11
Direction: Host → ODrive
Start Byte |
Name |
Type |
Unit |
Description |
---|---|---|---|---|
0 |
Traj_Vel_Limit |
float32 |
rev/s |
Set_Traj_Accel_Limits
Command ID: 0x12
Direction: Host → ODrive
Start Byte |
Name |
Type |
Unit |
Description |
---|---|---|---|---|
0 |
Traj_Accel_Limit |
float32 |
rev/s^2 |
|
4 |
Traj_Decel_Limit |
float32 |
rev/s^2 |
Set_Traj_Inertia
Command ID: 0x13
Direction: Host → ODrive
Start Byte |
Name |
Type |
Unit |
Description |
---|---|---|---|---|
0 |
Traj_Inertia |
float32 |
Nm/(rev/s^2) |
Get_Iq
Command ID: 0x14
Direction: ODrive → Host
Start Byte |
Name |
Type |
Unit |
Description |
---|---|---|---|---|
0 |
Iq_Setpoint |
float32 |
A |
|
4 |
Iq_Measured |
float32 |
A |
Get_Temperature
Command ID: 0x15
Direction: ODrive → Host
Start Byte |
Name |
Type |
Unit |
Description |
---|---|---|---|---|
0 |
FET_Temperature |
float32 |
deg C |
|
4 |
Motor_Temperature |
float32 |
deg C |
Reboot
Command ID: 0x16
Direction: Host → ODrive
Empty Payload
Reboots the ODrive (if it is in IDLE
). Equivalent to calling reboot()
.
Get_Bus_Voltage_Current
Command ID: 0x17
Direction: ODrive → Host
Start Byte |
Name |
Type |
Unit |
Description |
---|---|---|---|---|
0 |
Bus_Voltage |
float32 |
V |
|
4 |
Bus_Current |
float32 |
A |
Clear_Errors
Command ID: 0x18
Direction: Host → ODrive
Empty Payload
Equivalent to calling clear_errors()
.
Set_Absolute_Position
Command ID: 0x19
Direction: Host → ODrive
Start Byte |
Name |
Type |
Unit |
Description |
---|---|---|---|---|
0 |
Position |
float32 |
rev |
new position |
Equivalent to calling set_abs_pos()
.
Set_Pos_Gain
Command ID: 0x1a
Direction: Host → ODrive
Start Byte |
Name |
Type |
Unit |
Description |
---|---|---|---|---|
0 |
Pos_Gain |
float32 |
(rev/s) / rev |
Set_Vel_Gains
Command ID: 0x1b
Direction: Host → ODrive
Start Byte |
Name |
Type |
Unit |
Description |
---|---|---|---|---|
0 |
Vel_Gain |
float32 |
Nm / (rev/s) |
|
4 |
Vel_Integrator_Gain |
float32 |
Nm / rev |
Get_Torques
Command ID: 0x1c
Direction: ODrive → Host
Start Byte |
Name |
Type |
Unit |
Description |
---|---|---|---|---|
0 |
Torque_Target |
float32 |
Nm |
|
4 |
Torque_Estimate |
float32 |
Nm |
Enter_DFU_Mode
Command ID: 0x1f
Direction: Host → ODrive
Empty Payload
Puts the ODrive into DFU mode (see ODrive Firmware Deployment System). Equivalent to calling enter_dfu_mode2()
.