From 867abe359aa297c4e61104ef45462b98cf015733 Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Thu, 2 Dec 2021 17:46:26 +0300 Subject: [PATCH] fix problems with CANbus, add USB-dump of error & command codes for CAN --- F0-nolib/3steppersLB/can.c | 22 ++++-- F0-nolib/3steppersLB/can.h | 3 - F0-nolib/3steppersLB/commonproto.h | 12 +-- F0-nolib/3steppersLB/flash.h | 2 +- F0-nolib/3steppersLB/main.c | 24 +++--- F0-nolib/3steppersLB/steppers.bin | Bin 24276 -> 24988 bytes F0-nolib/3steppersLB/strfunct.c | 120 +++++++++++++++++++++-------- F0-nolib/3steppersLB/version.inc | 4 +- 8 files changed, 123 insertions(+), 64 deletions(-) diff --git a/F0-nolib/3steppersLB/can.c b/F0-nolib/3steppersLB/can.c index d506da3..e52f899 100644 --- a/F0-nolib/3steppersLB/can.c +++ b/F0-nolib/3steppersLB/can.c @@ -203,7 +203,7 @@ CAN_status can_send(uint8_t *msg, uint8_t len, uint16_t target_id){ return CAN_BUSY; } #ifdef EBUG - DBG("Send data. Len="); printu(len); + DBG("Send data"); SEND("Len="); printu(len); SEND(", tagid="); printuhex(target_id); SEND(", data="); for(int i = 0; i < len; ++i){ @@ -254,6 +254,10 @@ static void can_process_fifo(uint8_t fifo_num){ // CAN_RDTxR: (16-31) - timestamp, (8-15) - filter match index, (0-3) - data length CAN_message msg; uint8_t *dat = msg.data; + { // set all data to 0 + uint32_t *dptr = (uint32_t*)msg.data; + dptr[0] = dptr[1] = 0; + } uint8_t len = box->RDTR & 0x0f; msg.length = len; msg.ID = box->RIR >> 21; @@ -287,7 +291,7 @@ static void can_process_fifo(uint8_t fifo_num){ dat[0] = lb & 0xff; } } - if(msg.ID == OUTPID) parseCANcommand(&msg); + if(msg.ID == the_conf.CANID) parseCANcommand(&msg); if(CAN_messagebuf_push(&msg)) return; // error: buffer is full, try later *RFxR |= CAN_RF0R_RFOM0; // release fifo for access to next message } @@ -313,14 +317,17 @@ TRUE_INLINE void parseCANcommand(CAN_message *msg){ int N = 1000; // we don't check msg here as it cannot be NULL #ifdef EBUG - SEND("Get data: "); + DBG("Get data"); for(int i = 0; i < msg->length; ++i){ printuhex(msg->data[i]); bufputchar(' '); } - NL(); + newline(); #endif if(msg->length == 0) goto sendmessage; // PING uint16_t Index = *(uint16_t*)msg->data; +#ifdef EBUG + SEND("Index = "); printu(Index); newline(); +#endif if(Index >= CMD_AMOUNT){ formerr(msg, ERR_BADCMD); goto sendmessage; @@ -338,12 +345,17 @@ TRUE_INLINE void parseCANcommand(CAN_message *msg){ formerr(msg, ERR_WRONGLEN); goto sendmessage; } +#ifdef EBUG + SEND("Run command\n"); +#endif errcodes ec = cmdlist[Index](par, val); if(ec != ERR_OK){ formerr(msg, ec); + }else{ + msg->length = 8; } sendmessage: - while(CAN_BUSY == can_send(msg->data, msg->length, OUTPID)) + while(CAN_BUSY == can_send(msg->data, msg->length, the_conf.CANID)) if(--N == 0) break; } diff --git a/F0-nolib/3steppersLB/can.h b/F0-nolib/3steppersLB/can.h index af9724e..ced8329 100644 --- a/F0-nolib/3steppersLB/can.h +++ b/F0-nolib/3steppersLB/can.h @@ -23,9 +23,6 @@ #include "flash.h" #include "hardware.h" -// output messages identifier -#define OUTPID (the_conf.CANID) - // CAN ID mask (11 bits) #define CANIDMASK (0x7ff) diff --git a/F0-nolib/3steppersLB/commonproto.h b/F0-nolib/3steppersLB/commonproto.h index efb5756..07e1c26 100644 --- a/F0-nolib/3steppersLB/commonproto.h +++ b/F0-nolib/3steppersLB/commonproto.h @@ -37,12 +37,12 @@ // error codes for answer message typedef enum{ - ERR_OK, // all OK - ERR_BADPAR, // parameter's value is wrong - ERR_BADVAL, // wrong parameter's value - ERR_WRONGLEN, // wrong message length - ERR_BADCMD, // unknown command - ERR_CANTRUN, // can't run given command due to bad parameters or other + ERR_OK, // 0 - all OK + ERR_BADPAR, // 1 - parameter's value is wrong + ERR_BADVAL, // 2 - wrong parameter's value + ERR_WRONGLEN, // 3 - wrong message length + ERR_BADCMD, // 4 - unknown command + ERR_CANTRUN, // 5 - can't run given command due to bad parameters or other } errcodes; // pointer to function for command execution, both should be non-NULL for common cases diff --git a/F0-nolib/3steppersLB/flash.h b/F0-nolib/3steppersLB/flash.h index a557426..5794a20 100644 --- a/F0-nolib/3steppersLB/flash.h +++ b/F0-nolib/3steppersLB/flash.h @@ -50,7 +50,7 @@ typedef struct{ uint8_t encreverse : 1; // bit1 - reversing encoder rotation TODO: configure encoder's timer to downcounting uint8_t haveencoder : 1; // bit2 - have encoder uint8_t donthold : 1; // bit3 - clear power @ stop (don't hold motor when stopped) - uint8_t eswinv : 1; // bit4 - invers end-switches + uint8_t eswinv : 1; // bit4 - inverse end-switches uint8_t keeppos : 1; // bit5 - keep current position (as servo motor) } motflags_t; diff --git a/F0-nolib/3steppersLB/main.c b/F0-nolib/3steppersLB/main.c index ee016ff..9ac0c20 100644 --- a/F0-nolib/3steppersLB/main.c +++ b/F0-nolib/3steppersLB/main.c @@ -77,7 +77,7 @@ int main(void){ flashstorage_init(); // should be called before any other functions gpio_setup(); USB_setup(); - CAN_setup(DEFAULT_CAN_SPEED); + CAN_setup(the_conf.CANspeed); adc_setup(); init_steppers(); RCC->CSR |= RCC_CSR_RMVF; // remove reset flags @@ -102,19 +102,17 @@ int main(void){ process_steppers(); IWDG->KR = IWDG_REFRESH; while((can_mesg = CAN_messagebuf_pop())){ - if(can_mesg && isgood(can_mesg->ID)){ - if(ShowMsgs){ // new data in buff - IWDG->KR = IWDG_REFRESH; - len = can_mesg->length; - printu(Tms); - SEND(" #"); - printuhex(can_mesg->ID); - for(ctr = 0; ctr < len; ++ctr){ - SEND(" "); - printuhex(can_mesg->data[ctr]); - } - newline(); sendbuf(); + if(can_mesg && ShowMsgs && isgood(can_mesg->ID)){ + IWDG->KR = IWDG_REFRESH; + len = can_mesg->length; + printu(Tms); + SEND(" #"); + printuhex(can_mesg->ID); + for(ctr = 0; ctr < len; ++ctr){ + SEND(" "); + printuhex(can_mesg->data[ctr]); } + newline(); sendbuf(); } } IWDG->KR = IWDG_REFRESH; diff --git a/F0-nolib/3steppersLB/steppers.bin b/F0-nolib/3steppersLB/steppers.bin index b5dbaaee083457c4715ad0105bb0503a1e097b7b..0aaace9e3e09753aab987dc37d7ddd370557e691 100755 GIT binary patch delta 6765 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 U>DZ#o;sop!ur+qh7-T@UYBSc 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 diff --git a/F0-nolib/3steppersLB/strfunct.c b/F0-nolib/3steppersLB/strfunct.c index aa22dc4..5476950 100644 --- a/F0-nolib/3steppersLB/strfunct.c +++ b/F0-nolib/3steppersLB/strfunct.c @@ -356,6 +356,7 @@ void canid(char *txt){ int32_t N; if(eq != getnum(eq, &N) && N > -1 && N < 0xfff){ the_conf.CANID = (uint16_t)N; + CAN_reinit(the_conf.CANspeed); good = TRUE; } } @@ -396,27 +397,38 @@ void getcounter(_U_ char *txt){ void wdcheck(_U_ char *txt){ while(1){nop();} } -/* -void stp_check(char *txt){ - uint8_t N = *txt - '0'; - if(N < 3){ - MOTOR_EN(N); - MOTOR_CW(N); - mottimers[N]->ARR = 300; - mottimers[N]->CR1 |= TIM_CR1_CEN; - }else{ - for(N = 0; N < 3; ++N){ - MOTOR_DIS(N); - MOTOR_CCW(N); - mottimers[N]->CR1 &= ~TIM_CR1_CEN; - } - } -}*/ +typedef struct{ + errcodes code; + const char *descr; +} codetext; +static const codetext errtxt[] = { + {ERR_OK, "all OK"}, + {ERR_BADPAR, "wrong parameter's value"}, + {ERR_BADVAL, "wrong setter of parameter"}, + {ERR_WRONGLEN, "bad message length"}, + {ERR_BADCMD, "unknown command"}, + {ERR_CANTRUN, "temporary can't run given command"}, + {-1, NULL} +}; + +void dumperrcodes(_U_ char *txt){ + const codetext *c = errtxt; + SEND("Error codes:\n"); + while(c->descr){ + printu(c->code); + SEND(" - "); + SEND(c->descr); + newline(); + ++c; + } + sendbuf(); +} typedef void(*specfpointer)(char *arg); enum{ + SCMD_NONE, // omit zero SCMD_IGNORE, SCMD_DELIGNLIST, SCMD_DFU, @@ -431,16 +443,39 @@ enum{ SCMD_DUMPCONF, SCMD_GETCTR, SCMD_WD, + SCMD_DUMPERR, + SCMD_DUMPCMD, //SCMD_ST, SCMD_AMOUNT }; +void dumpcmdcodes(_U_ char *txt); + +static specfpointer speccmdlist[SCMD_AMOUNT] = { + [SCMD_IGNORE] = addIGN, + [SCMD_DELIGNLIST] = delignlist, + [SCMD_DFU] = bootldr, + [SCMD_FILTER] = add_filter, + [SCMD_CANSPEED] = CANini, + [SCMD_CANID] = canid, + [SCMD_LISTFILTERS] = list_filters, + [SCMD_IGNBUF] = print_ign_buf, + [SCMD_PAUSE] = inpause, + [SCMD_RESUME] = inresume, + [SCMD_SEND] = sendCANcommand, + [SCMD_DUMPCONF] = dump_userconf, + [SCMD_GETCTR] = getcounter, + [SCMD_WD] = wdcheck, + [SCMD_DUMPCMD] = dumpcmdcodes, + [SCMD_DUMPERR] = dumperrcodes, + //[SCMD_ST] = stp_check, +}; + typedef struct{ int cmd_code; // CMD_... or <0 for usb-only commands const char *command; // text command (up to 65536 commands) const char *help; // help message for text protocol } commands; - // the main commands list, index is CAN command code static const commands textcommands[] = { // different commands @@ -489,6 +524,8 @@ static const commands textcommands[] = { {-SCMD_CANSPEED, "canspeed", "CAN bus speed"}, {-SCMD_DELIGNLIST, "delignlist", "delete ignore list"}, {-SCMD_DFU, "dfu", "activate DFU mode"}, + {-SCMD_DUMPERR, "dumperr", "dump error codes"}, + {-SCMD_DUMPCMD, "dumpcmd", "dump command codes"}, {-SCMD_DUMPCONF, "dumpconf", "dump current configuration"}, {-SCMD_FILTER, "filter", "add/modify filter, format: bank# FIFO# mode(M/I) num0 [num1 [num2 [num3]]]"}, {-SCMD_GETCTR, "getctr", "get TIM1/2/3 counters"}, @@ -503,24 +540,39 @@ static const commands textcommands[] = { {0, NULL, NULL} }; +void dumpcmdcodes(_U_ char *txt){ + SEND("Commands list:\n"); + for(uint16_t i = 0; i < CMD_AMOUNT; ++i){ + printu(i); + SEND(" - "); + const commands *c = textcommands; + while(c->command){ + if(c->cmd_code == i && *c->command){ + SEND(c->help); break; + } + ++c; + } + newline(); + } + sendbuf(); +} -static specfpointer speccmdlist[SCMD_AMOUNT] = { - [SCMD_IGNORE] = addIGN, - [SCMD_DELIGNLIST] = delignlist, - [SCMD_DFU] = bootldr, - [SCMD_FILTER] = add_filter, - [SCMD_CANSPEED] = CANini, - [SCMD_CANID] = canid, - [SCMD_LISTFILTERS] = list_filters, - [SCMD_IGNBUF] = print_ign_buf, - [SCMD_PAUSE] = inpause, - [SCMD_RESUME] = inresume, - [SCMD_SEND] = sendCANcommand, - [SCMD_DUMPCONF] = dump_userconf, - [SCMD_GETCTR] = getcounter, - [SCMD_WD] = wdcheck, - //[SCMD_ST] = stp_check, -}; +/* +void stp_check(char *txt){ + uint8_t N = *txt - '0'; + if(N < 3){ + MOTOR_EN(N); + MOTOR_CW(N); + mottimers[N]->ARR = 300; + mottimers[N]->CR1 |= TIM_CR1_CEN; + }else{ + for(N = 0; N < 3; ++N){ + MOTOR_DIS(N); + MOTOR_CCW(N); + mottimers[N]->CR1 &= ~TIM_CR1_CEN; + } + } +}*/ static void showHelp(){ SEND("https://github.com/eddyem/stm32samples/tree/master/F0-nolib/3steppersLB build#" BUILD_NUMBER " @ " BUILD_DATE "\n"); diff --git a/F0-nolib/3steppersLB/version.inc b/F0-nolib/3steppersLB/version.inc index 3a5ed44..eb844db 100644 --- a/F0-nolib/3steppersLB/version.inc +++ b/F0-nolib/3steppersLB/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "129" -#define BUILD_DATE "2021-12-01" +#define BUILD_NUMBER "139" +#define BUILD_DATE "2021-12-02"