Management of 8 independend steppers ==================================== Eighth stepper could be changed to 8 dependent multiplexed. Based on STM32F303VDT6. # Pinout (all GPIO outs are push-pull if not mentioned another) ### Sorted by pin number | Pin # | Pin name | function | settings | comment | |---------|-------------|-------------|---------------|---------------------| | 1 | PE2 | DIAG | in | `diag` output of TMC| | 2 | PE3 | MUL0 | slow out | multiplexer address | | 3 | PE4 | MUL1 | slow out | for DIAG input | | 4 | PE5 | MUL2 | slow out | | | 5 | PE6 | MUL EN | slow out | enable mul. | | 6 | (vbat) | - | - | | | 7 | PC13 | M0 L1 | slow in PU/out| enable motor | | 8 | PC14 | M0 L0 | slow in PU | direction of motor | | 9 | PC15 | M0 DIR | slow out | limit-switch 0 | | 10 | PF9 | M0 STEP | AF | clock of motor | | 11 | PF10 | M0 EN | slow out | l-s 0 or CS of SPI | | 12 | (OSC IN) | | | | | 13 | (OSC OUT) | | | | | 14 | (nrst) | | | reset | | 15 | PC0 | MOTMUL0 | slow out | external motors | | 16 | PC1 | MOTMUL1 | slow out | multiplexer | | 17 | PC2 | MOTMUL2 | slow out | | | 18 | PC3 | MOTMUL EN | slow out | | | 19 | PF2 | ADC2 in10 | ADC | 5V in / 2 | | 20 | (VSSA) | | | | | 21 | (VREF+) | | | | | 22 | (VDDA) | | | | | 23 | PA0 | ADC1 in1 | ADC | External ADC inputs | | 24 | PA1 | ADC1 in2 | ADC | | | 25 | PA2 | ADC1 in3 | ADC | | | 26 | PA3 | ADC1 in4 | ADC | | | 27 | (VSS) | | | | | 28 | (VDD) | | | | | 29 | PA4 | ADC2 in1 | ADC | Vdrive / 10 | | 30 | PA5 | SPI1 SCK | AF | In case of SPI TMC | | 31 | PA6 | SPI1 MISO | AF | | | 32 | PA7 | SPI1 MOSI | AF | | | 33 | PC4 | USART1 Tx | AF | External USART | | 34 | PC5 | USART1 Rx | AF | | | 35 | PB0 | M7 STEP | AF | | | 36 | PB1 | M7 EN | slow out | | | 37 | PB2 | M7 DIR | slow out | | | 38 | PE7 | M7 L0 | slow in PU | | | 39 | PE8 | M7 L1 | slow in PU/out| | | 40 | PE9 | M6 STEP | AF | | | 41 | PE10 | M6 L1 | slow in PU/out| | | 42 | PE11 | M6 L0 | slow in PU | | | 43 | PE12 | M6 DIR | slow out | | | 44 | PE13 | M6 EN | slow out | | | 45 | PE14 | OUT2 | slow in PU/out| external GPIO | | 46 | PE15 | OUT1 | slow in PU/out| | | 47 | PB10 | USART3 Tx | AF | USART for 4 of TMC | | 48 | PB11 | OUT0 | slow in PU/out| | | 49 | (VSS) | | | | | 50 | (VDD) | | | | | 51 | PB12 | SCRN DCRS | slow out | screen commands | | 52 | PB13 | SCRN SCK | AF | SPI for screen | | 53 | PB14 | SCRN MISO | AF | | | 54 | PB15 | SCRN MOSI | AF | | | 55 | PD8 | SCRN RST | slow out | reset screen | | 56 | PD9 | SCRN CS | slow out | activate screen | | 57 | PD10 | M5 L1 | slow in PU/out| | | 58 | PD11 | M5 L0 | slow in PU | | | 59 | PD12 | M5 STEP | AF | | | 60 | PD13 | M5 DIR | slow out | | | 61 | PD14 | M5 EN | slow out | | | 62 | PD15 | M4 L1 | slow in PU/out| | | 63 | PC6 | M4 STEP | AF | | | 64 | PC7 | M4 L0 | slow in PU | | | 65 | PC8 | M4 DIR | slow out | | | 66 | PC9 | M4 EN | slow out | | | 67 | PA8 | USBpu | slow out PP | USB DP pullup | | 68 | PA9 | BTN1 | slow in PU | buttons to operate | | 69 | PA10 | BTN2 (SDA) | slow in PU/AF | with screen | | 70 | PA11 | USB DM | AF | USB | | 71 | PA12 | USB DP | AF | | | 72 | PA13 | SWDIO | dflt | dbg/flash | | 73 | PF6 | BTN3 (SCL) | slow in PU/AF | (possible I2C2) | | 74 | (VSS) | | | | | 75 | (VDD) | | | | | 76 | PA14 | SWCLK | dflt | debug/sew | | 77 | PA15 | M3 STEP | AF | | | 78 | PC10 | M3 L0 | slow in PU | | | 79 | PC11 | M3 L1 | slow in PU/out| | | 80 | PC12 | M3 DIR | slow out | | | 81 | PD0 | CAN Rx | AF | CAN bus | | 82 | PD1 | CAN Tx | AF | | | 83 | PD2 | M3 EN | slow out | | | 84 | PD3 | BTN4 | slow in PU | | | 85 | PD4 | BTN5 | slow in PU | | | 86 | PD5 | BTN6 | slow in PU | | | 87 | PD6 | M2 L1 | slow in PU | | | 88 | PD7 | M2 L0 | slow in PU/out| | | 89 | PB3 | USART2 Tx | AF | USART for 4 of TMC | | 90 | PB4 | M2 DIR | slow out | | | 91 | PB5 | M2 STEP | AF | | | 92 | PB6 | M2 EN | slow out | | | 93 | PB7 | M1 L1 | slow in PU/out| | | 94 | (BOOT0) | | | boot mode | | 95 | PB8 | M1 STEP | AF | | | 96 | PB9 | M1 L0 | slow in PU | | | 97 | PE0 | M1 DIR | slow out | | | 98 | PE1 | M1 EN | slow out | | | 99 | (VSS) | | | | | 100 | (VDD) | | | | ### Some comments. **DIAG** input used to detect problems with TMC drivers (multiplexed by **MUL** outputs). Each motor have next control signals: **EN** - enable driver, **DIR** - rotation direction, **STEP** - microstepping clock signal, **L0** - zero end-switch, **L1** - max end-switch (or Cable Select for SPI-based TMC). **MOTMUL** - external multiplexer or other GPIO signals (e.g. to manage of 64 stepper motors). **ADC1 in** - four external ADC signals (0..3.3V). **SPI1** used to manage TMC drivers in case of SPI-based. **USART1** - to connect external something (master or slave). **OUT** - external GPIO. **USART2 Tx** used to manage USART-based TMC (numbers 0-3). **USART3 Tx** used to manage USART-based TMC (numbers 4-7). **SCRN** - control signals for SPI TFT screen. **BTN** - external button, keypad, joystick etc. Two of them could be connected to I2C devices. **USB** and **CAN** used as main device control buses. **SW** used as debugging/flashing. ### Sorted by ports (with AF numbers). | Pin # | Pin name | function | settings | comment | |---------|-------------|-------------|---------------|---------------------| | 23 | PA0 | ADC1 in1 | ADC | External ADC inputs | | 24 | PA1 | ADC1 in2 | ADC | | | 25 | PA2 | ADC1 in3 | ADC | | | 26 | PA3 | ADC1 in4 | ADC | | | 29 | PA4 | ADC2 in1 | ADC | Vdrive / 10 | | 30 | PA5 | SPI1 SCK | AF5 | In case of SPI TMC | | 31 | PA6 | SPI1 MISO | AF5 | | | 32 | PA7 | SPI1 MOSI | AF5 | | | 67 | PA8 | BTN0 | slow in PU | Buttons/joystick | | 68 | PA9 | BTN1 | slow in PU | to operate with | | 69 | PA10 | BTN2 (SDA) | slow in PU/AF4| screen | | 70 | PA11 | USB DM | USB | USB | | 71 | PA12 | USB DP | USB | | | 72 | PA13 | SWDIO/USBpu | dflt/slow out | USB pullup or dbg | | 76 | PA14 | SWCLK | dflt | debug/sew | | 77 | PA15 | M3 STEP | AF1 (T2ch1) | | | 35 | PB0 | M7 STEP | AF2 (T3ch3) | | | 36 | PB1 | M7 EN | slow out | | | 37 | PB2 | M7 DIR | slow out | | | 89 | PB3 | USART2 Tx | AF7 | USART for 4 of TMC | | 90 | PB4 | M2 DIR | slow out | | | 91 | PB5 | M2 STEP | AF10 (T17ch1) | | | 92 | PB6 | M2 EN | slow out | | | 93 | PB7 | M1 L1 | slow in PU/out| | | 95 | PB8 | M1 STEP | AF1 (T16ch1) | | | 96 | PB9 | M1 L0 | slow in PU | | | 47 | PB10 | USART3 Tx | AF7 | USART for 4 of TMC | | 48 | PB11 | OUT0 | slow in PU/out| | | 51 | PB12 | SCRN DCRS | slow out | screen commands | | 52 | PB13 | SCRN SCK | AF5 | SPI for screen | | 53 | PB14 | SCRN MISO | AF5 | | | 54 | PB15 | SCRN MOSI | AF5 | | | 15 | PC0 | MOTMUL0 | slow out | external motors | | 16 | PC1 | MOTMUL1 | slow out | multiplexer | | 17 | PC2 | MOTMUL2 | slow out | | | 18 | PC3 | MOTMUL EN | slow out | | | 33 | PC4 | USART1 Tx | AF7 | External USART | | 34 | PC5 | USART1 Rx | AF7 | | | 63 | PC6 | M4 STEP | AF4 (T8ch1) | | | 64 | PC7 | M4 L0 | slow in PU | | | 65 | PC8 | M4 DIR | slow out | | | 66 | PC9 | M4 EN | slow out | | | 78 | PC10 | M3 L0 | slow in PU | | | 79 | PC11 | M3 L1 | slow in PU/out| | | 80 | PC12 | M3 DIR | slow out | | | 7 | PC13 | M0 L1 | slow in PU/out| enable motor | | 8 | PC14 | M0 L0 | slow in PU | direction of motor | | 9 | PC15 | M0 DIR | slow out | limit-switch 0 | | 81 | PD0 | CAN Rx | AF7 | CAN bus | | 82 | PD1 | CAN Tx | AF7 | | | 83 | PD2 | M3 EN | slow out | | | 84 | PD3 | BTN4 | slow in PU | | | 85 | PD4 | BTN5 | slow in PU | | | 86 | PD5 | BTN6 | slow in PU | | | 87 | PD6 | M2 L1 | slow in PU | | | 88 | PD7 | M2 L0 | slow in PU/out| | | 55 | PD8 | SCRN RST | slow out | reset screen | | 56 | PD9 | SCRN CS | slow out | activate screen | | 57 | PD10 | M5 L1 | slow in PU/out| | | 58 | PD11 | M5 L0 | slow in PU | | | 59 | PD12 | M5 STEP | AF2 (T4ch1) | | | 60 | PD13 | M5 DIR | slow out | | | 61 | PD14 | M5 EN | slow out | | | 62 | PD15 | M4 L1 | slow in PU/out| | | 97 | PE0 | M1 DIR | slow out | | | 98 | PE1 | M1 EN | slow out | | | 1 | PE2 | DIAG | slow in PU | `diag` output of TMC| | 2 | PE3 | MUL0 | slow out | multiplexer address | | 3 | PE4 | MUL1 | slow out | for DIAG input | | 4 | PE5 | MUL2 | slow out | | | 5 | PE6 | MUL EN | slow out | enable mul. | | 38 | PE7 | M7 L0 | slow in PU | | | 39 | PE8 | M7 L1 | slow in PU/out| | | 40 | PE9 | M6 STEP | AF2 (T1ch1) | | | 41 | PE10 | M6 L1 | slow in PU/out| | | 42 | PE11 | M6 L0 | slow in PU | | | 43 | PE12 | M6 DIR | slow out | | | 44 | PE13 | M6 EN | slow out | | | 45 | PE14 | OUT2 | slow in PU/out| external GPIO | | 46 | PE15 | OUT1 | slow in PU/out| | | 19 | PF2 | ADC2 in10 | ADC | 5V in / 2 | | 73 | PF6 | BTN3 (SCL) | slow in PU/AF4| (possible I2C2) | | 10 | PF9 | M0 STEP | AF3 (T15ch1) | clock of motor | | 11 | PF10 | M0 EN | slow out | l-s 0 or CS of SPI | ## DMA usage * ADC1 - DMA1_ch1 * ADC2 - DMA2_ch1 # Stepper drivers connection After changing stepper type by soldering/desoldering appropriate jumpers, don't forget to change their types in settings (and save settings in MSU flash memory after checking it with `dumpconf`). Connection diagram for soldering jumpers shown on reverse side of PCB. Jumpers **A**, **B** and **C** allow to short the contacts of driver's pins 6 (CLK / DCO / ~SLEEP), 5 (PDN_UART / SDO / ~RESET) and 4 (SPREAD / CS / M2), respectively. Jumper **D1** connects MCU UART output with jumper **E1**, **D2** connects MCU MISO with same contact of **E1**. Jumpers **E1** and **E2** allows to pullup pin 5 of driver to be connected with 3.3V or UART/MISO. Jumper **F1** allows to connect pin 4 to CS line. **F2** connects pin 4 to 3.3V. Jumper **G1** connects pin 3 (MS2 / SCK / M1) to SCK line. **G2** connects this pin to 3.3V. Jumper **H1** connects pin pin 2 (MS1 / SDI / M0) to MOSI line **H2** connects it to 3.3V. So, depending on driver type and its mode you can solder these jumpers so, than driver can work over PDN-UART, SPI or configuration pins can select microstepping directly. ## DRV8825 and other simplest drivers Solder jumpers **E2**, **B** and **A** to connect **~RST** and **~SLP** to 3.3V. Microstepping selection produced by soldering **H2** (bit0), **G2** (bit1) and/or **C** (bit2). ## TMC2209 and other PDN-UART based Solder jumpers **D1** and **E1** to connect MCU UART2/UART3 to PDN-UART pin of driver. Solder jumpers **G2**/**H2** according address table (X - soldered, O - not soldered): | Address | G2 | H2 | |:-------:|:-----:|:-----:| | 0 | **O** | **O** | | 1 | **O** | **X** | | 2 | **X** | **O** | | 3 | **X** | **X** | | 4 | **O** | **O** | | 5 | **O** | **X** | | 6 | **X** | **O** | | 7 | **X** | **X** | ## TMC2130 and other SPI based (not negotiated yet) Solder jumpers **D2** and **E1** to connect MISO, **F1** to connect CS, **G1** for SCK and **H1** for MOSI. # Protocol ## Errors Error codes are in brackets: - **OK** (0) - all OK; - **BADPAR** (1) - bad parameter (`N`) value (e.g. greater than max available or absent); - **BADVAL** (2) - bad setter value (absent, text or over range); - **WRONGLEN** (3) - (only for CAN bus, you can't meet in text protocol) wrong CAN message length; - **BADCMD** (4) - unknown command, in case of USB proto user will see full command list instead of this error; - **CANTRUN** (5) - can't run required function. ## USB Used simple text protocol each string should contain one command and ends with `'\n'`. Uppercase N at the end of command means parameter number (No of motor, button, ADC channel etc). Getters and action commands have simplest format `command[N]`: some commands have no parameter, other have two variants - with and without parameter; wariant without parameter will act on all parameters (e.g. getter for all buttons) - in this case `N` enclosed in square brackets. Setters have format `command[N] = value`. The `value` is integer number, so in case floating values you need to multiply it by 1000 and write result. So, voltage and temperature are measured in millivolts and thousandths of degC respectively. Some commands (especially that have no CAN analogue) have non-standard format described later. They are not intended to be used in automatic control systems, only in manual mode. Answer for every (excluding special) setter and getter in case of success is `command[N]=value` showing current value for getter or new value for setter. In case of error you will see one of error mesages (message `OK` with errcode=0 usually not shown). Also you can get such answers: - `BADCMD` - wrong command (not in dictionary); - `BADARGS` - bad arguments format (e.g. for command `cansend` etc); - `FAIL` - if something wrong and parser got impermissible error code. In following list letter `G` means "getter", `S` - "setter", no of them - custom USB-only command. The number in brackets is CAN command code. The asterisk following command means that it isn't implemented yet (and maybe will be never implemented). ### absposN (35) GS Absolute stepper position in steps, setter just changes current value. E.g. you want to set current position as zero (be carefull: `gotoz` will zero position again on a zero-point limit switch). Maximum absolute value is `maxstepsN`. ### accelN (17) GS Stepper acceleration/deceleration on ramp (steps/s^2), only positive. Maximum value is `ACCELMAXSTEPS` from `flash.h`. ### adcN (4) G ADC value (N=0..3). ### buttonN (5) G Given (N=0..6) buttons' state. If number is right, returns two strings: `buttonN=state` (where `state` is `none`, `press`, `hold` or `release`) and `buttontmN=time` (where `time` is time from start of last event). !!!NOTE: Button numbering starts from 0, not 1 as shown on PCB!!! ### canerrcodes Print last CAN errcodes. Print "No errors" or last error code. ### canfilter DATA CAN bus hardware filters, format: bank# FIFO# mode(M/I) num0 [num1 [num2 [num3]]] . By default have two filters allowing to listen any CAN ID: Filter 0, FIFO0 in MASK mode: ID=0x01, MASK=0x01 Filter 1, FIFO1 in MASK mode: ID=0x00, MASK=0x01 ### canflood ID DATA Send or clear (if empty) flood message: ID byte0 ... byteN. On empy message return `NO ID given, send nothing!` (and stops flooding), or `Message parsed OK`. ### canfloodT N Flood period, N in milliseconds (N >= 0ms). ### canid [ID] Get or set CAN ID of device. Default CAN ID is "1". ### canignore [ID] Software ignore list (max 10 IDs), negative to delete all, non-negative to add next. ### canincrflood ID Send incremental flood message with given ID. Message have uint32_t little endian type and increments for each packet starting from 0. Empty command stops flooding (`canflood` too). ### canpause Pause filtered IN packets displaying. Returns `Pause CAN messages`. ### canreinit Reinit CAN with last settings. Returns `OK`. ### canresume Resume filtered IN packets displaying, returns `RESUME CAN messages`. ### cansend ID [data] Send data over CAN with given ID. If `data` is omitted, send empty message. In case of absence of `ACK` you can get message `CAN bus is off, try to restart it`. ### canspeed N CAN bus speed (in kbps, 50 <= N <= 1500) In case of setter, store new speed value in global parameters (and if you call `saveconf` later, it will be saved in flash memory). As getter show string like `canspeed=250kbps`. ### canstat Get CAN bus status: values of registers `CAN->MSR`, `CAN->TSR`, `CAN->RF0R` and `CAN->RF1F`. ### diagn[N] (37) G DIAG state of motor N (or all, in this case motor 0 is LSB of answer etc.). One means "all OK", zero is error state. ### drvtypeN (45) GS Nth driver type (0 - only step/dir, 1 - UART, 2 - SPI, 3 - reserved). This parameter is taken from `.drvtype` bits of `motflags` settings parameter. ### dumperr Dump error codes. Returns: Error codes: 0 - OK 1 - BADPAR 2 - BADVAL 3 - WRONGLEN 4 - BADCMD 5 - CANTRUN ### dumpcmd Dump command codes. Returns all list of CAN bus command codes. ### dumpconf Dump current configuration. Returns a lot of information both common (like CAN bus speed, ID and so on) and for each motor driver. You can call independeng getters for each of this parameter. ### dumpmotN Dump configuration of Nth motor only. ### dumpmotflags Dump motor flags' bits (for `motflagsN`) and reaction to limit switches (`eswreact`) values: Motor flags: bit0 - 0: reverse - invert motor's rotation bit1 - 1: [reserved] bit2 - 2: [reserved] bit3 - 3: donthold - clear motor's power after stop bit4 - 4: eswinv - inverse end-switches (1->0 instead of 0->1) bit5 - 5: [reserved] bit6 - 6,7: drvtype - driver type (0 - only step/dir, 1 - UART, 2 - SPI, 3 - reserved) End-switches reaction: 0 - ignore both end-switches 1 - ignore ESW1, ESW0 stops only when negative mowing 2 - stop @ esw in any moving direction 3 - stop only when moving in given direction (e.g. to minus @ESW0) ### dumpstates Dump motors' state codes (for getter `stateN`): Motor's state codes: 0 - relax 1 - acceleration 2 - moving 3 - moving at lowest speed 4 - deceleration 5 - stalled (not used here!) 6 - error ### emstop[N] (29) Emergency stop Nth motor or all (if `N` absent). Returns `OK` or error text. ### eraseflash [=N] (38) Erase flash data storage (full or only N'th page of it). Use this option only if you have problems when try to save current configuration. ### eswN (6) G Get end-switches state. Return two bits (for limit switches 0 and 1): 1 means "active", 0 - "passive". If you use SPI-based driver, only one switch available, so return will be 1-bit. ### eswreactN (24) GS End-switches (limit-switches) reaction: 0 - ignore both limits; 1 - ignore ESW1, stop on ESW0 only when moving to negative direction; 2 - stop on any limit switch independently from direction; 3 - stop only on switch corresponding to moving direction (i.e. ESW0 for negative and ESW1 for positive). You can modify this values on-the-fly (but only when steppers aren't moving). This can be usefull, for example, to rotate filter turret into given position using switch 1 to both as limit switch and position stopper. But even in state 0 (ignore) active state of both switches estimates as error and you won't be able to move motor. ### gotoN (26) GS Move motor to given absolute position. ### gotozN (32) Find zero position & refresh counters. The motor would rotate in reverse direction until limit switch 0 acts or amount of steps (parameter `maxsteps` of configuration) is exhausted. ### gpioconfN* GS GPIO configuration (0 - PUin, 1 - PPout, 2 - ODout), N=0..2. ### gpio[N] (12) GS GPIO values, N=0..2. Without `N` run for all GPIOs (each bit is state: 0/1, started from LSB which is zero channel). By default GPIOs are pulled up inputs, so setters won't do any effect. To reconfigure them as outputs use gpioconf when (if) it will be available. ### help Show this help. ### maxspeedN (18) GS Maximal motor speed (steps per sec). Depends on current microstep configuration. As speed depends on Nth motor's timer settings, you can't give any value you want. Speed recalculated through ARR value: ARR = 26MHz / microsteps / (speed - 1). Minimal value of ARR is 99 (260kHz), maximal is 0xffff (600Hz). And after that actual speed value calculated: speed = 26MHz / microsteps / (ARR + 1). And it can't be greater than 0xffff. So if your motor really can make, let's say, 32000 steps per second, you can run it only for microstepping not more than 2. ### maxstepsN (21) GS Maximal steps amount (from zero ESW) for given motor. This is limiting positive position and amount of steps to make when searching of zero limit switch. ### mcut (7) G Temperature of MCU in thousandths of degC. ### mcuvdd (8) G MCU Vdd value. ### microstepsN (16) GS Microsteps settings (2^0..2^9). Read `maxspeed` about relationship of maximal speed and microsteppings. ### minspeedN (19) GS Minimal motor speed (steps per sec), this is the starting speed of motor's ramp and default speed for `relslow` command, so don't try to make it too large. ### motcurrentN (46) GS Maximal motor current (1..32 for 1/32..32/32 of max current) for TMC drivers. In case of simplest drivers like DRV8825 you should set current using varistor on driver's board. ### motflagsN (23) GS Nth motor flags. To understand bit fields of these flags use `dumpmotflags`. ### motmul * (36) GS external multiplexer status (<0 - disable, 0..7 - enable and set address). ### motno (44) GS Motor number for next `pdn` commands (if you want to run custom commands by hands or in a batch). ### motreinit (25) Re-init motors after configuration changed. Some changes will run this automatically. Answer - "OK" or error text. ### pdnN (43) GS Read/write TMC2209 (and other UART-based drivers) registers over uart @ motor number `motno`. For `pdnN=X` `N` is register number, `X` is data to write into it. Due to protocol's particulars you can't work with registers with address more than 126 (0x7e). ### ping (1) Echo given command back. For CAN bus return original packet, for USB - given argumemt and parameter (but checking parameter). ### relposN (27) GS Relative (with ramp) move for given amount of steps (get remaining steps for getter). ### relslowN (28) GS Like `relpos` but with constant slowest speed (you can change it with `minspeed`). ### reset (9) Software reset. ### saveconf (13) Save current configuration into MCU flash memory. Answer - "OK" or error text. ### screen* GS Enable (1) or disable (0) screen. ### speedlimit (20) G Get limiting speed for current microsteps setting. ### stateN (33) G Get Nth motor state (`dumpstates`: 0-relax, 1-accel, 2-move, 3-mvslow, 4-decel, 5-stall, 6-err). ### stopN (30) Stop Nth motor with deceleration (moving by ramp). Answer - "OK" or error text. ### time (10) G Get time from start (ms). ### tmcbus * GS TMC control bus (0 - USART, 1 - SPI), unuseful command; use `motflags` instead. ### udata* (39) GS Data by usart in slave mode (text strings, '\\n'-terminated). ### usartstatus* (40) GS status of USART1 (0 - off, 1 - master, 2 - slave). ### vdrive (41) G Approximate voltage on Vdrive input, millivolts. ### vfive (42) G Approximate voltage on 5V bus, millivolts. ## CAN bus Default CAN ID is 1. Protocol use variable length incoming messages: from 2 bytes for simplest commands to all 8 bytes for common. Bytes (in time order): - **0**, **1** - little-endian command code. - **2** - parameter number (0..126), 127 means "no parameter", elder bit (0x80) is a setter flag (without it all rest part of message ignored). - **3** - (only in packets from controller) error code. - **4**...**8** - little-endian data. Command codes described in USB answer for `dumpcmd`: 1 - ping 4 - adc 5 - button 6 - esw 7 - mcut 8 - mcuvdd 9 - reset 10 - time 12 - gpio 13 - saveconf 16 - microsteps 17 - accel 18 - maxspeed 19 - minspeed 20 - speedlimit 21 - maxsteps 23 - motflags 24 - eswreact 25 - motreinit 26 - goto 27 - relpos 28 - relslow 29 - emstop 30 - stop 32 - gotoz 33 - state 35 - abspos 36 - motmul 37 - diagn 38 - eraseflash 41 - vdrive 42 - vfive 43 - pdn 44 - motno 45 - drvtype 46 - motcurrent Error codes (`dumperr`): 0 - OK 1 - BADPAR 2 - BADVAL 3 - WRONGLEN 4 - BADCMD 5 - CANTRUN