From d23d2ab89d302211586e093456938a3c7b81931e Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Wed, 1 Mar 2023 22:03:03 +0300 Subject: [PATCH] Still don't work :( --- F3:F303/Multistepper/commonproto.c | 49 ++++++++++++-- F3:F303/Multistepper/commonproto.h | 22 ++++--- F3:F303/Multistepper/flash.c | 4 +- F3:F303/Multistepper/flash.h | 13 +++- F3:F303/Multistepper/hashgen/hdr.c | 15 +++++ F3:F303/Multistepper/hashgen/hdr.h | 3 + F3:F303/Multistepper/hashgen/helpcmds.in | 3 + F3:F303/Multistepper/hashgen/testdic | 3 + F3:F303/Multistepper/main.c | 4 ++ F3:F303/Multistepper/multistepper.bin | Bin 28936 -> 30300 bytes F3:F303/Multistepper/pdnuart.c | 80 ++++++++++++++++++++--- F3:F303/Multistepper/pdnuart.h | 9 ++- F3:F303/Multistepper/proto.c | 27 ++++++-- F3:F303/Multistepper/tmc2209.h | 2 +- F3:F303/Multistepper/version.inc | 4 +- 15 files changed, 204 insertions(+), 34 deletions(-) diff --git a/F3:F303/Multistepper/commonproto.c b/F3:F303/Multistepper/commonproto.c index 9bd6966..169c51c 100644 --- a/F3:F303/Multistepper/commonproto.c +++ b/F3:F303/Multistepper/commonproto.c @@ -87,6 +87,17 @@ errcodes cu_diagn(uint8_t _U_ par, int32_t _U_ *val){ return ERR_BADCMD; } +errcodes cu_drvtype(uint8_t par, int32_t *val){ + uint8_t n; CHECKN(n, par); + motflags_t *fl = &the_conf.motflags[n]; + if(ISSETTER(par)){ + if(*val >= DRVTYPE_AMOUNT) return ERR_BADVAL; + fl->drvtype = *val; + } + *val = fl->drvtype; + return ERR_OK; +} + errcodes cu_emstop(uint8_t _U_ par, int32_t _U_ *val){ uint8_t n; CHECKN(n, par); emstopmotor(n); @@ -235,6 +246,10 @@ errcodes cu_microsteps(uint8_t _U_ par, int32_t _U_ *val){ if(m != 1< PCLK/(MOTORTIM_PSC+1)/(MOTORTIM_ARRMIN+1)) return ERR_BADVAL; the_conf.microsteps[n] = m; + motflags_t *f = the_conf.motflags; + if(f->drvtype == DRVTYPE_UART){ + if(!pdnuart_microsteps(n, m)) return ERR_CANTRUN; + } update_stepper(n); } *val = the_conf.microsteps[n]; @@ -244,7 +259,7 @@ errcodes cu_microsteps(uint8_t _U_ par, int32_t _U_ *val){ errcodes cu_minspeed(uint8_t _U_ par, int32_t _U_ *val){ uint8_t n; CHECKN(n, par); if(ISSETTER(par)){ - if(*val >= the_conf.maxspd[n]) return ERR_BADVAL; + if(*val >= the_conf.maxspd[n] || *val < 0) return ERR_BADVAL; the_conf.minspd[n] = getSPD(n, *val); update_stepper(n); } @@ -252,6 +267,20 @@ errcodes cu_minspeed(uint8_t _U_ par, int32_t _U_ *val){ return ERR_OK; } +errcodes cu_motcurrent(uint8_t par, int32_t *val){ + uint8_t n; CHECKN(n, par); + if(ISSETTER(par)){ + if(*val < 1 || *val > 32) return ERR_BADVAL; + the_conf.motcurrent[n] = *val; + motflags_t *f = the_conf.motflags; + if(f->drvtype == DRVTYPE_UART){ + if(!pdnuart_setcurrent(n, *val)) return ERR_CANTRUN; + } + } + *val = the_conf.motcurrent[n]; + return ERR_OK; +} + errcodes cu_motflags(uint8_t _U_ par, int32_t _U_ *val){ uint8_t n; CHECKN(n, par); if(ISSETTER(par)){ @@ -262,6 +291,15 @@ errcodes cu_motflags(uint8_t _U_ par, int32_t _U_ *val){ return ERR_OK; } +errcodes cu_motno(uint8_t _U_ par, int32_t _U_ *val){ + if(*val < 0 || *val >= MOTORSNO) return ERR_BADVAL; + if(ISSETTER(par)){ + if(!pdnuart_setmotno(*val)) return ERR_CANTRUN; + } + *val = pdnuart_getmotno(); + return ERR_OK; +} + errcodes cu_motmul(uint8_t _U_ par, int32_t _U_ *val){ return ERR_BADCMD; } @@ -275,9 +313,9 @@ errcodes cu_motreinit(uint8_t _U_ par, int32_t _U_ *val){ errcodes cu_pdn(uint8_t par, int32_t *val){ uint8_t n = PARBASE(par); if(ISSETTER(par)){ - if(!pdnuart_writereg(0, n, *val)) return ERR_CANTRUN; + if(!pdnuart_writereg(n, *val)) return ERR_CANTRUN; } - if(!pdnuart_readreg(0, n, (uint32_t*)val)) return ERR_CANTRUN; + if(!pdnuart_readreg(n, (uint32_t*)val)) return ERR_CANTRUN; return ERR_OK; } @@ -449,5 +487,8 @@ const char* cancmds[CCMD_AMOUNT] = { [CCMD_USARTSTATUS] = "usartstatus", [CCMD_VDRIVE] = "vdrive", [CCMD_VFIVE] = "vfive", - [CCMD_PDN] = "pdn" + [CCMD_PDN] = "pdn", + [CCMD_MOTNO] = "motno", + [CCMD_DRVTYPE] = "drvtype", + [CCMD_MOTCURRENT] = "motcurrent", }; diff --git a/F3:F303/Multistepper/commonproto.h b/F3:F303/Multistepper/commonproto.h index e9788bb..0b369bb 100644 --- a/F3:F303/Multistepper/commonproto.h +++ b/F3:F303/Multistepper/commonproto.h @@ -86,14 +86,17 @@ enum{ ,CCMD_MOTORSTATE // motor state ,CCMD_ENCPOS // position of encoder (independing on settings) ,CCMD_SETPOS // set motor position - ,CCMD_MOTMUL - ,CCMD_DIAGN - ,CCMD_ERASEFLASH - ,CCMD_UDATA - ,CCMD_USARTSTATUS - ,CCMD_VDRIVE - ,CCMD_VFIVE - ,CCMD_PDN + ,CCMD_MOTMUL // operations with motor multiplexer + ,CCMD_DIAGN // DIAGN state for all motors + ,CCMD_ERASEFLASH // erase full storage + ,CCMD_UDATA // incoming data by USART1 + ,CCMD_USARTSTATUS // current status of USART1 + ,CCMD_VDRIVE // Vdrive voltage + ,CCMD_VFIVE // 5V voltage + ,CCMD_PDN // write/read TMC2209 registers over UART + ,CCMD_MOTNO // motor number for next PDN command + ,CCMD_DRVTYPE // driver type (0 - only step/dir, 1 - UART, 2 - SPI, 3 - reserved) + ,CCMD_MOTCURRENT // motor current (1..32 for 1/32..32/32 of max current) // should be the last: ,CCMD_AMOUNT // amount of common commands }; @@ -108,6 +111,7 @@ errcodes cu_adc(uint8_t par, int32_t *val); errcodes cu_button(uint8_t par, int32_t *val); errcodes cu_canid(uint8_t par, int32_t *val); errcodes cu_diagn(uint8_t par, int32_t *val); +errcodes cu_drvtype(uint8_t par, int32_t *val); errcodes cu_emstop(uint8_t par, int32_t *val); errcodes cu_eraseflash(uint8_t par, int32_t *val); errcodes cu_esw(uint8_t par, int32_t *val); @@ -122,7 +126,9 @@ errcodes cu_mcut(uint8_t par, int32_t *val); errcodes cu_mcuvdd(uint8_t par, int32_t *val); errcodes cu_microsteps(uint8_t par, int32_t *val); errcodes cu_minspeed(uint8_t par, int32_t *val); +errcodes cu_motcurrent(uint8_t par, int32_t *val); errcodes cu_motflags(uint8_t par, int32_t *val); +errcodes cu_motno(uint8_t par, int32_t *val); errcodes cu_motmul(uint8_t par, int32_t *val); errcodes cu_motreinit(uint8_t par, int32_t *val); errcodes cu_pdn(uint8_t par, int32_t *val); diff --git a/F3:F303/Multistepper/flash.c b/F3:F303/Multistepper/flash.c index d963443..c120c35 100644 --- a/F3:F303/Multistepper/flash.c +++ b/F3:F303/Multistepper/flash.c @@ -32,7 +32,7 @@ static const uint32_t FLASH_blocksize = (uint32_t)&_BLOCKSIZE; // max amount of Config records stored (will be recalculate in flashstorage_init() static uint32_t maxCnum = 1024 / sizeof(user_conf); // can't use blocksize here -#define DEFMF {.donthold = 1} +#define DEFMF {.donthold = 1, .drvtype = DRVTYPE_UART} #define USERCONF_INITIALIZER { \ .userconf_sz = sizeof(user_conf) \ @@ -226,6 +226,8 @@ int fn_dumpconf(uint32_t _U_ hash, char _U_ *args){ // "dumpconf" (3271513185) printu(the_conf.minspd[i]); PROPNAME("maxsteps"); printu(the_conf.maxsteps[i]); + PROPNAME("motcurrent"); + printu(the_conf.motcurrent[i]); PROPNAME("motflags"); printuhex(*((uint8_t*)&the_conf.motflags[i])); PROPNAME("eswreaction"); diff --git a/F3:F303/Multistepper/flash.h b/F3:F303/Multistepper/flash.h index 21fcf75..c59322b 100644 --- a/F3:F303/Multistepper/flash.h +++ b/F3:F303/Multistepper/flash.h @@ -38,7 +38,16 @@ #define FLASH_SIZE *((uint16_t*)FLASH_SIZE_REG) -#define MOTFLAGS_AMOUNT 6 +#define MOTFLAGS_AMOUNT 7 + +enum{ + DRVTYPE_SIMPLE, + DRVTYPE_UART, + DRVTYPE_SPI, + DRVTYPE_RESERVED, + DRVTYPE_AMOUNT +}; + // motor flags typedef struct{ uint8_t reverse : 1; // bit0 - reversing motor rotation @@ -47,6 +56,7 @@ typedef struct{ uint8_t donthold : 1; // bit3 - clear power @ stop (don't hold motor when stopped) uint8_t eswinv : 1; // bit4 - inverse end-switches uint8_t keeppos : 1; // bit5 - keep current position (as servo motor) - NOT USED HERE!!! + uint8_t drvtype : 2; // bits 6,7 - driver type (0 - only step/dir, 1 - UART, 2 - SPI, 3 - reserved) } motflags_t; /* @@ -63,6 +73,7 @@ typedef struct __attribute__((packed, aligned(4))){ uint32_t maxsteps[MOTORSNO]; // maximal amount of steps motflags_t motflags[MOTORSNO]; // motor's flags uint8_t ESW_reaction[MOTORSNO]; // end-switches reaction (esw_react) + uint8_t motcurrent[MOTORSNO]; // IRUN as fraction of max current (1..32) uint8_t isSPI; // ==1 if there's SPI drivers instead of UART } user_conf; diff --git a/F3:F303/Multistepper/hashgen/hdr.c b/F3:F303/Multistepper/hashgen/hdr.c index 8e9ca17..0f6e5bf 100644 --- a/F3:F303/Multistepper/hashgen/hdr.c +++ b/F3:F303/Multistepper/hashgen/hdr.c @@ -46,6 +46,8 @@ int fn_canstat(uint32_t _U_ hash, char _U_ *args) WAL; // "canstat" (237384179) int fn_diagn(uint32_t _U_ hash, char _U_ *args) WAL; // "diagn" (2334137736) +int fn_drvtype(uint32_t _U_ hash, char _U_ *args) WAL; // "drvtype" (3930242451) + int fn_dumpcmd(uint32_t _U_ hash, char _U_ *args) WAL; // "dumpcmd" (1223955823) int fn_dumpconf(uint32_t _U_ hash, char _U_ *args) WAL; // "dumpconf" (3271513185) @@ -84,10 +86,14 @@ int fn_microsteps(uint32_t _U_ hash, char _U_ *args) WAL; // "microsteps" (39743 int fn_minspeed(uint32_t _U_ hash, char _U_ *args) WAL; // "minspeed" (3234848090) +int fn_motcurrent(uint32_t _U_ hash, char _U_ *args) WAL; // "motcurrent" (1926997848) + int fn_motflags(uint32_t _U_ hash, char _U_ *args) WAL; // "motflags" (2153634658) int fn_motmul(uint32_t _U_ hash, char _U_ *args) WAL; // "motmul" (1543400099) +int fn_motno(uint32_t _U_ hash, char _U_ *args) WAL; // "motno" (544673586) + int fn_motreinit(uint32_t _U_ hash, char _U_ *args) WAL; // "motreinit" (199682784) int fn_pdn(uint32_t _U_ hash, char _U_ *args) WAL; // "pdn" (2963275719) @@ -197,6 +203,9 @@ int parsecmd(const char *str){ case CMD_DIAGN: return fn_diagn(h, args); break; + case CMD_DRVTYPE: + return fn_drvtype(h, args); + break; case CMD_DUMPCMD: return fn_dumpcmd(h, args); break; @@ -254,12 +263,18 @@ int parsecmd(const char *str){ case CMD_MINSPEED: return fn_minspeed(h, args); break; + case CMD_MOTCURRENT: + return fn_motcurrent(h, args); + break; case CMD_MOTFLAGS: return fn_motflags(h, args); break; case CMD_MOTMUL: return fn_motmul(h, args); break; + case CMD_MOTNO: + return fn_motno(h, args); + break; case CMD_MOTREINIT: return fn_motreinit(h, args); break; diff --git a/F3:F303/Multistepper/hashgen/hdr.h b/F3:F303/Multistepper/hashgen/hdr.h index a4c134a..872029f 100644 --- a/F3:F303/Multistepper/hashgen/hdr.h +++ b/F3:F303/Multistepper/hashgen/hdr.h @@ -31,6 +31,7 @@ int parsecmd(const char *cmdwargs); #define CMD_CANSPEED (549265992) #define CMD_CANSTAT (237384179) #define CMD_DIAGN (2334137736) +#define CMD_DRVTYPE (3930242451) #define CMD_DUMPCMD (1223955823) #define CMD_DUMPCONF (3271513185) #define CMD_DUMPERR (1223989764) @@ -50,8 +51,10 @@ int parsecmd(const char *cmdwargs); #define CMD_MCUVDD (2517587080) #define CMD_MICROSTEPS (3974395854) #define CMD_MINSPEED (3234848090) +#define CMD_MOTCURRENT (1926997848) #define CMD_MOTFLAGS (2153634658) #define CMD_MOTMUL (1543400099) +#define CMD_MOTNO (544673586) #define CMD_MOTREINIT (199682784) #define CMD_PDN (2963275719) #define CMD_PING (10561715) diff --git a/F3:F303/Multistepper/hashgen/helpcmds.in b/F3:F303/Multistepper/hashgen/helpcmds.in index e557709..d03b2aa 100644 --- a/F3:F303/Multistepper/hashgen/helpcmds.in +++ b/F3:F303/Multistepper/hashgen/helpcmds.in @@ -16,6 +16,7 @@ "canspeed - GS CAN speed (reinit if setter)\n" "canstat - G CAN status\n" "diagn[N]* - G DIAG state of motor N (or all)\n" + "drvtypeN - GS driver type (0 - only step/dir, 1 - UART, 2 - SPI, 3 - reserved)\n" "dumperr - dump error codes\n" "dumpcmd - dump command codes\n" "dumpconf - dump current configuration\n" @@ -35,8 +36,10 @@ "mcuvdd - G MCU Vdd\n" "microstepsN - GS microsteps settings (2^0..2^9)\n" "minspeedN - min speed (steps per sec)\n" + "motcurrentN - GS motor current (1..32 for 1/32..32/32 of max current)\n" "motflagsN - motorN flags\n" "motmul* - GS external multiplexer status (<0 - disable, 0..7 - enable and set address)\n" + "motno - GS motor number for next `pdn` commands\n" "motreinit - re-init motors after configuration changed\n" "pdnN - GS read/write TMC2209 registers over uart @ motor0\n" "ping - echo given command back\n" diff --git a/F3:F303/Multistepper/hashgen/testdic b/F3:F303/Multistepper/hashgen/testdic index 1c1ff4f..daaab7e 100644 --- a/F3:F303/Multistepper/hashgen/testdic +++ b/F3:F303/Multistepper/hashgen/testdic @@ -16,6 +16,7 @@ cansend canspeed canstat diagn +drvtype dumperr dumpcmd dumpconf @@ -35,8 +36,10 @@ mcut mcuvdd microsteps minspeed +motcurrent motflags motmul +motno motreinit pdn ping diff --git a/F3:F303/Multistepper/main.c b/F3:F303/Multistepper/main.c index 6fa117f..86aaa0c 100644 --- a/F3:F303/Multistepper/main.c +++ b/F3:F303/Multistepper/main.c @@ -51,6 +51,10 @@ int main(void){ adc_setup(); pdnuart_setup(); USBPU_ON(); + for(int i = 0; i < MOTORSNO; ++i){ + motflags_t flag = the_conf.motflags[i]; + if(flag.drvtype == DRVTYPE_UART) pdnuart_init(i); + } uint32_t ctr = 0; CAN_message *can_mesg; while(1){ diff --git a/F3:F303/Multistepper/multistepper.bin b/F3:F303/Multistepper/multistepper.bin index d4b0917e315a1f1085b55c74695dca5b632bfd6c..0fc5ae46b0a1c8d60759fe89198b196403d00c5e 100755 GIT binary patch delta 12038 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 TB+Yno@tpnZ?=nAndBT4I +#include "flash.h" #include "hardware.h" #include "proto.h" +#include "tmc2209.h" extern volatile uint32_t Tms; +static uint8_t motorno = 0; #define MAXBUFLEN (8) // timeout, milliseconds @@ -66,16 +69,18 @@ void pdnuart_setup(){ setup_usart(1); } -static int rwreg(uint8_t motorno, uint8_t reg, uint32_t data, int w){ +static int rwreg(uint8_t reg, uint32_t data, int w){ if(motorno >= MOTORSNO || reg & 0x80) return FALSE; + uint32_t x = Tms; + while(Tms - x < 1); int no = motorno >> 2; uint8_t outbuf[MAXBUFLEN]; - outbuf[0] = 0xa0; + outbuf[0] = 0x05; outbuf[1] = motorno - (no << 2); - outbuf[2] = reg << 1; + outbuf[2] = reg; int nbytes = 3; if(w){ - outbuf[2] |= 1; + outbuf[2] |= 0x80; for(int i = 6; i > 2; --i){ outbuf[i] = data & 0xff; data >>= 8; @@ -85,20 +90,25 @@ static int rwreg(uint8_t motorno, uint8_t reg, uint32_t data, int w){ calcCRC(outbuf, nbytes); ++nbytes; for(int i = 0; i < nbytes; ++i){ + USB_sendstr("Send byte "); USB_putbyte('0'+i); USB_sendstr(": "); printuhex(outbuf[i]); newline(); USART[no]->TDR = outbuf[i]; // transmit while(!(USART[no]->ISR & USART_ISR_TXE)); + int l = 0; + for(; l < 10000; ++l) if(USART[no]->ISR & USART_ISR_RXNE) break; + if(l == 10000) USND("Nothing received"); + else {USB_sendstr("Rcv: "); printuhex(USART[no]->RDR); newline();} } return TRUE; } // return FALSE if failed -int pdnuart_writereg(uint8_t motorno, uint8_t reg, uint32_t data){ - return rwreg(motorno, reg, data, 1); +int pdnuart_writereg(uint8_t reg, uint32_t data){ + return rwreg(reg, data, 1); } // return FALSE if failed -int pdnuart_readreg(uint8_t motorno, uint8_t reg, uint32_t *data){ - if(!rwreg(motorno, reg, 0, 0)) return FALSE; +int pdnuart_readreg(uint8_t reg, uint32_t *data){ + if(!rwreg(reg, 0, 0)) return FALSE; uint32_t Tstart = Tms; uint8_t buf[8]; int no = motorno >> 2; @@ -117,6 +127,60 @@ int pdnuart_readreg(uint8_t motorno, uint8_t reg, uint32_t *data){ return TRUE; } +static int readregister(uint8_t no, uint8_t reg, uint32_t *data){ + int n = motorno; motorno = no; + int r = pdnuart_readreg(reg, data); + motorno = n; + return r; +} + +static int writeregister(uint8_t no, uint8_t reg, uint32_t data){ + int n = motorno; motorno = no; + int r = pdnuart_writereg(reg, data); + motorno = n; + return r; +} + +uint8_t pdnuart_getmotno(){ + return motorno; +} + +int pdnuart_setmotno(uint8_t no){ + if(no >= MOTORSNO) return FALSE; + motorno = no; + return TRUE; +} + +// write val into IHOLD_IRUN over UART to n'th motor +int pdnuart_setcurrent(uint8_t no, uint8_t val){ + TMC2209_ihold_irun_reg_t regval; + if(!readregister(no, TMC2209Reg_IHOLD_IRUN, ®val.value)) return FALSE; + regval.irun = val; + return writeregister(no, TMC2209Reg_IHOLD_IRUN, regval.value); +} + +// set microsteps over UART +int pdnuart_microsteps(uint8_t no, uint32_t val){ + if(val > 256) return FALSE; + TMC2209_chopconf_reg_t regval; + if(!readregister(no, TMC2209Reg_CHOPCONF, ®val.value)) return FALSE; + if(val == 256) regval.mres = 0; + else regval.mres = MSB(val) + 1; + return writeregister(no, TMC2209Reg_CHOPCONF, regval.value); +} + +// init driver number `no` +int pdnuart_init(uint8_t no){ + TMC2209_gconf_reg_t gconf; + if(!readregister(no, TMC2209Reg_GCONF, &gconf.value)) return FALSE; + gconf.pdn_disable = 1; // PDN now is UART + gconf.mstep_reg_select = 1; // microsteps are by MSTEP + if(!writeregister(no, TMC2209Reg_GCONF, gconf.value)) return FALSE; + if(!pdnuart_microsteps(no, the_conf.microsteps[no])) return FALSE; + if(!pdnuart_setcurrent(no, the_conf.motcurrent[no])) return FALSE; + return TRUE; +} + /* static void parseRx(int no){ USB_sendstr("Got from "); diff --git a/F3:F303/Multistepper/pdnuart.h b/F3:F303/Multistepper/pdnuart.h index 3636f22..c036beb 100644 --- a/F3:F303/Multistepper/pdnuart.h +++ b/F3:F303/Multistepper/pdnuart.h @@ -21,5 +21,10 @@ #include void pdnuart_setup(); -int pdnuart_writereg(uint8_t motorno, uint8_t reg, uint32_t data); -int pdnuart_readreg(uint8_t motorno, uint8_t reg, uint32_t *data); +int pdnuart_writereg(uint8_t reg, uint32_t data); +int pdnuart_readreg(uint8_t reg, uint32_t *data); +int pdnuart_setmotno(uint8_t no); +uint8_t pdnuart_getmotno(); +int pdnuart_setcurrent(uint8_t no, uint8_t val); +int pdnuart_microsteps(uint8_t no, uint32_t val); +int pdnuart_init(uint8_t no); diff --git a/F3:F303/Multistepper/proto.c b/F3:F303/Multistepper/proto.c index 1311e12..d79191b 100644 --- a/F3:F303/Multistepper/proto.c +++ b/F3:F303/Multistepper/proto.c @@ -405,12 +405,13 @@ int fn_time(uint32_t _U_ hash, char _U_ *args){ // "time" (19148340) static const char* motfl[MOTFLAGS_AMOUNT] = { - "reverse - invert motor's rotation", - "[reserved]", - "[reserved]", - "donthold - clear motor's power after stop", - "eswinv - inverse end-switches (1->0 instead of 0->1)", - "[reserved]" + "0: reverse - invert motor's rotation", + "1: [reserved]", + "2: [reserved]", + "3: donthold - clear motor's power after stop", + "4: eswinv - inverse end-switches (1->0 instead of 0->1)", + "5: [reserved]", + "6,7: drvtype - driver type (0 - only step/dir, 1 - UART, 2 - SPI, 3 - reserved)" }; static const char *eswfl[ESW_AMOUNT] = { [ESW_IGNORE] = "ignore end-switches", @@ -568,6 +569,9 @@ static int canusb_function(uint32_t hash, char *args){ case CMD_DIAGN: e = cu_diagn(par, &val); break; + case CMD_DRVTYPE: + e = cu_drvtype(par, &val); + break; case CMD_EMSTOP: e = cu_emstop(par, &val); break; @@ -612,12 +616,18 @@ static int canusb_function(uint32_t hash, char *args){ case CMD_MINSPEED: e = cu_minspeed(par, &val); break; + case CMD_MOTCURRENT: + e = cu_motcurrent(par, &val); + break; case CMD_MOTFLAGS: e = cu_motflags(par, &val); break; case CMD_MOTMUL: e = cu_motmul(par, &val); break; + case CMD_MOTNO: + e = cu_motno(par, &val); + break; case CMD_MOTREINIT: e = cu_motreinit(par, &val); break; @@ -674,7 +684,7 @@ static int canusb_function(uint32_t hash, char *args){ USB_sendstr(errtxt[e]); newline(); }else{ USB_sendstr("OK par"); - if(par != CANMESG_NOPAR) printu(PARBASE(par)); + if(PARBASE(par) != CANMESG_NOPAR) printu(PARBASE(par)); USB_putbyte('='); printi(val); newline(); } @@ -689,6 +699,7 @@ int fn_accel(uint32_t _U_ hash, char _U_ *args) AL; //* "accel" (1490521981) int fn_adc(uint32_t _U_ hash, char _U_ *args) AL; // "adc" (2963026093) int fn_button(uint32_t _U_ hash, char _U_ *args) AL; // "button" (1093508897) int fn_diagn(uint32_t _U_ hash, char _U_ *args) AL; //* "diagn" (2334137736) +int fn_drvtype(uint32_t _U_ hash, char _U_ *args) AL; // "drvtype" (3930242451) int fn_emstop(uint32_t _U_ hash, char _U_ *args) AL; //* "emstop" (2965919005) int fn_eraseflash(uint32_t _U_ hash, char _U_ *args) AL; //* "eraseflash" (3177247267) int fn_esw(uint32_t _U_ hash, char _U_ *args) AL; // "esw" (2963094612) @@ -703,8 +714,10 @@ int fn_mcut(uint32_t _U_ hash, char _U_ *args) AL; // "mcut" (4022718) int fn_mcuvdd(uint32_t _U_ hash, char _U_ *args) AL; // "mcuvdd" (2517587080) int fn_microsteps(uint32_t _U_ hash, char _U_ *args) AL; //* "microsteps" (3974395854) int fn_minspeed(uint32_t _U_ hash, char _U_ *args) AL; //* "minspeed" (3234848090) +int fn_motcurrent(uint32_t _U_ hash, char _U_ *args) AL; // "motcurrent" (1926997848) int fn_motflags(uint32_t _U_ hash, char _U_ *args) AL; //* "motflags" (2153634658) int fn_motmul(uint32_t _U_ hash, char _U_ *args) AL; //* "motmul" (1543400099) +int fn_motno(uint32_t _U_ hash, char _U_ *args) AL; // "motno" (544673586) int fn_motreinit(uint32_t _U_ hash, char _U_ *args) AL; //* "motreinit" (199682784) int fn_pdn(uint32_t _U_ hash, char _U_ *args) AL; // "pdn" (2963275719) int fn_ping(uint32_t _U_ hash, char _U_ *args) AL; // "ping" (10561715) diff --git a/F3:F303/Multistepper/tmc2209.h b/F3:F303/Multistepper/tmc2209.h index 8448bcd..bb486b3 100644 --- a/F3:F303/Multistepper/tmc2209.h +++ b/F3:F303/Multistepper/tmc2209.h @@ -707,7 +707,7 @@ typedef struct { TMC2209_status_t driver_status; - trinamic_config_t config; +// trinamic_config_t config; } TMC2209_t; #pragma pack(pop) diff --git a/F3:F303/Multistepper/version.inc b/F3:F303/Multistepper/version.inc index e6cecc3..29c91ef 100644 --- a/F3:F303/Multistepper/version.inc +++ b/F3:F303/Multistepper/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "84" -#define BUILD_DATE "2023-02-26" +#define BUILD_NUMBER "95" +#define BUILD_DATE "2023-03-01"