From 94f87db5c50abdbed2a1bd6c8cbc9ea3857cd746 Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Tue, 12 Sep 2023 23:13:50 +0300 Subject: [PATCH] add command reset, fix some troubles --- .../TSYS_controller/can_process.c | 5 +++ .../TSYS_controller/can_process.h | 1 + F0:F030,F042,F072/TSYS_controller/i2c.h | 2 +- F0:F030,F042,F072/TSYS_controller/main.c | 6 ++- F0:F030,F042,F072/TSYS_controller/proto.c | 13 ++++-- .../TSYS_controller/sensors_manage.c | 39 +++++++++++------- F0:F030,F042,F072/TSYS_controller/tsys01.bin | Bin 20824 -> 21928 bytes F0:F030,F042,F072/TSYS_controller/usart.c | 26 ++++++++---- F0:F030,F042,F072/TSYS_controller/version.inc | 6 +-- 9 files changed, 64 insertions(+), 34 deletions(-) diff --git a/F0:F030,F042,F072/TSYS_controller/can_process.c b/F0:F030,F042,F072/TSYS_controller/can_process.c index b850a73..4437138 100644 --- a/F0:F030,F042,F072/TSYS_controller/can_process.c +++ b/F0:F030,F042,F072/TSYS_controller/can_process.c @@ -113,6 +113,8 @@ void can_messages_proc(){ SEND("DUMMY"); bufputchar('0' + (data[1]==CMD_DUMMY0 ? 0 : 1)); newline(); + b[0] = CMD_PING; + can_send_data(b, 1); // return to slave: pong break; case CMD_PING: // pong can_send_data(b, 1); @@ -174,6 +176,9 @@ void can_messages_proc(){ *((uint32_t*)&b[2]) = Tms; can_send_data(b, 6); break; + case CMD_RESET_MCU: + NVIC_SystemReset(); + break; } }else if(data[0] == DATA_MARK){ // process received data char Ns = '0' + data[1]; diff --git a/F0:F030,F042,F072/TSYS_controller/can_process.h b/F0:F030,F042,F072/TSYS_controller/can_process.h index d78fc4b..a57f8a4 100644 --- a/F0:F030,F042,F072/TSYS_controller/can_process.h +++ b/F0:F030,F042,F072/TSYS_controller/can_process.h @@ -50,6 +50,7 @@ typedef enum{ CMD_REINIT_SENSORS, // (re)init sensors CMD_GETBUILDNO, // request for firmware build number CMD_SYSTIME, // get system time + CMD_RESET_MCU, // reset MCU // dummy commands for test purposes CMD_DUMMY0 = 0xDA, CMD_DUMMY1 = 0xAD diff --git a/F0:F030,F042,F072/TSYS_controller/i2c.h b/F0:F030,F042,F072/TSYS_controller/i2c.h index 7c6ab65..97b99af 100644 --- a/F0:F030,F042,F072/TSYS_controller/i2c.h +++ b/F0:F030,F042,F072/TSYS_controller/i2c.h @@ -35,7 +35,7 @@ #define TSYS01_START_CONV (0x48) #define TSYS01_PROM_ADDR0 (0xA0) // conversion time (with reserve) -#define CONV_TIME (15) +#define CONV_TIME (25) uint8_t read_i2c(uint8_t addr, uint32_t *data, uint8_t nbytes); uint8_t write_i2c(uint8_t addr, uint8_t data); diff --git a/F0:F030,F042,F072/TSYS_controller/main.c b/F0:F030,F042,F072/TSYS_controller/main.c index 869c306..21841e4 100644 --- a/F0:F030,F042,F072/TSYS_controller/main.c +++ b/F0:F030,F042,F072/TSYS_controller/main.c @@ -44,6 +44,7 @@ void sys_tick_handler(void){ ++Tms; } +#if 0 static void iwdg_setup(){ /* Enable the peripheral clock RTC */ /* (1) Enable the LSI (40kHz) */ @@ -64,6 +65,7 @@ static void iwdg_setup(){ while(IWDG->SR); /* (5) */ IWDG->KR = IWDG_REFRESH; /* (6) */ } +#endif int main(void){ uint32_t lastT = 0, lastS = 0, lastB = 0; @@ -81,7 +83,7 @@ int main(void){ RCC->CSR |= RCC_CSR_RMVF; // remove reset flags USB_setup(); sensors_init(); - iwdg_setup(); + //iwdg_setup(); while (1){ IWDG->KR = IWDG_REFRESH; // refresh watchdog @@ -130,7 +132,7 @@ int main(void){ #endif cmd_parser(txt, 0); } - if(lastB - Tms > 99){ // run `sendbuf` each 100ms + if(lastB - Tms > 249){ // run `sendbuf` each 250ms sendbuf(); lastB = Tms; } diff --git a/F0:F030,F042,F072/TSYS_controller/proto.c b/F0:F030,F042,F072/TSYS_controller/proto.c index cd7f675..c66e2df 100644 --- a/F0:F030,F042,F072/TSYS_controller/proto.c +++ b/F0:F030,F042,F072/TSYS_controller/proto.c @@ -58,7 +58,7 @@ void sendbuf(){ if(blen == 0) return; *bptr = 0; if(USBcmd) USB_send(buff); - else while(LINE_BUSY == usart_send(buff, blen)){IWDG->KR = IWDG_REFRESH;} + else for(int i = 0; (i < 9999) && (LINE_BUSY == usart_send(buff, blen)); ++i){IWDG->KR = IWDG_REFRESH;} bptr = buff; blen = 0; } @@ -69,7 +69,7 @@ void addtobuf(const char *txt){ if(l > UARTBUFSZ){ sendbuf(); // send prevoius data in buffer if(USBcmd) USB_send(txt); - else while(LINE_BUSY == usart_send_blocking(txt, l)){IWDG->KR = IWDG_REFRESH;} + else for(int i = 0; (i < 9999) && (LINE_BUSY == usart_send_blocking(txt, l)); ++i){IWDG->KR = IWDG_REFRESH;} }else{ if(blen+l > UARTBUFSZ){ sendbuf(); @@ -222,6 +222,10 @@ void cmd_parser(char *txt, uint8_t isUSB){ } } switch(_1st){ + case '#': + if(ID == BCAST_ID) NVIC_SystemReset(); + CANsend(ID, CMD_RESET_MCU, _1st); + break; case '@': debugmode = !debugmode; SEND("DEBUG mode "); @@ -336,7 +340,7 @@ void cmd_parser(char *txt, uint8_t isUSB){ CANsend(ID, CMD_START_MEASUREMENT, _1st); break; case 't': - if(!sensors_scan_mode) sensors_start(); + sensors_start(); break; case 'u': SEND("Unique ID CAN mode\n"); @@ -380,8 +384,9 @@ void cmd_parser(char *txt, uint8_t isUSB){ SEND("https://github.com/eddyem/tsys01/tree/master/STM32/TSYS_controller build#" BUILD_NUMBER " @ " BUILD_DATE "\n"); SEND( "ALL little letters - without CAN messaging\n" + "# - reset MCU (self or with given ID like '1#')\n" "0..7 - send command to given controller (0 - this) instead of broadcast\n" - "@ - set/reset debug mode\n" + "@ - set/clear debug mode\n" "a - get raw ADC values\n" "B - send broadcast CAN dummy message\n" "b - get/set CAN bus baudrate\n" diff --git a/F0:F030,F042,F072/TSYS_controller/sensors_manage.c b/F0:F030,F042,F072/TSYS_controller/sensors_manage.c index 20b67b0..a53766a 100644 --- a/F0:F030,F042,F072/TSYS_controller/sensors_manage.c +++ b/F0:F030,F042,F072/TSYS_controller/sensors_manage.c @@ -116,11 +116,13 @@ void sensors_off(){ static int sensors_on(){ mesg("Turn on sensors"); curr_mul_addr = 0; + sensors_scan_mode = 0; MUL_OFF(); if(SENSORS_OVERCURNT()){ mesg("OVERCURRENT!"); SENSORS_OFF(); Sstate = (++overcurnt_ctr > 32) ? SENS_OVERCURNT_OFF : SENS_OVERCURNT; + if(Sstate == SENS_OVERCURNT_OFF) mesg("sensors_on() ---> OFF by overcurrent"); return FALSE; }else{ mesg("Powered on"); @@ -143,7 +145,7 @@ void sensors_init(){ * do nothing if measurement processing */ void sensors_start(){ - if(sensors_scan_mode) return; + //if(sensors_scan_mode) return; switch(Sstate){ case SENS_SLEEPING: Sstate = SENS_START_MSRMNT; @@ -263,11 +265,13 @@ static uint8_t gettempproc(){ if(BAD_TEMPERATURE != (Temperatures[curr_mul_addr][i] = calc_t(t, i))){ err = 0; ++Ntemp_measured; - } + mesg(" got one T"); + }else mesg(" bad T"); } } if(err){ write_i2c(Taddr[i], TSYS01_RESET); + mesg(" i2c err"); } } return TRUE; @@ -357,9 +361,11 @@ void showtemperature(){ void sensors_process(){ static int8_t NsentOverCAN = -1; // number of T (N*10+p) sent over CAN bus; -1 - nothing to send if(SENSORS_OVERCURNT()){ + mesg("sensors_process(): overcurrent!"); MUL_OFF(); SENSORS_OFF(); Sstate = (++overcurnt_ctr > 32) ? SENS_OVERCURNT_OFF : SENS_OVERCURNT; + if(Sstate == SENS_OVERCURNT_OFF) mesg("sensors_process(): ---> OFF by overcurrent"); return; } switch(Sstate){ @@ -368,18 +374,19 @@ void sensors_process(){ i2c_setup(CURRENT_SPEED); Sstate = SENS_RESETING; lastSensT = Tms; - NsentOverCAN = -1; + //NsentOverCAN = -1; break; case SENS_RESETING: // reset & discovery procedure - if(NsentOverCAN == -1){ + /*if(NsentOverCAN == -1){ mesg("SENS_RESETING"); NsentOverCAN = 0; - } + }*/ if(Tms - lastSensT > POWERUP_TIME){ if(sensors_scan(resetproc)){ count_sensors(); // get total amount of sensors if(Nsens_present){ Sstate = SENS_GET_COEFFS; + mesg("SENS_RESETING -> SENS_GET_COEFFS"); }else{ // no sensors found mesg("No sensors found -> off"); sensors_off(); @@ -388,39 +395,39 @@ void sensors_process(){ } break; case SENS_GET_COEFFS: // get coefficients - mesg("SENS_GET_COEFFS"); if(sensors_scan(getcoefsproc)){ Sstate = SENS_SLEEPING; // sleep after got coefficients + mesg("SENS_GET_COEFFS -> SENS_SLEEPING"); } break; case SENS_START_MSRMNT: // send all sensors command to start measurements - mesg("SENS_START_MSRMNT"); if(sensors_scan(msrtempproc)){ lastSensT = Tms; Sstate = SENS_WAITING; Ntemp_measured = 0; // reset value of good measurements + mesg("SENS_START_MSRMNT -> SENS_WAITING"); } break; case SENS_WAITING: // wait for end of conversion - mesg("SENS_WAITING"); if(Tms - lastSensT > CONV_TIME){ - NsentOverCAN = -1; + //NsentOverCAN = -1; + mesg("SENS_WAITING -> SENS_GATHERING"); Sstate = SENS_GATHERING; } break; case SENS_GATHERING: // scan all sensors, get thermal data & calculate temperature - if(NsentOverCAN < 0){ - mesg("SENS_SLEEPING"); + /*if(NsentOverCAN < 0){ + mesg("SENS_GATHERING"); NsentOverCAN = 0; - } + }*/ if(sensors_scan(gettempproc)){ lastSensT = Tms; NsentOverCAN = 0; Sstate = SENS_SENDING_DATA; + mesg("SENS_GATHERING -> SENS_SENDING_DATA"); } break; case SENS_SENDING_DATA: - mesg("SENS_SENDING_DATA"); if(Nsens_present == 0){ mesg("No sensors found -> off"); sensors_off(); @@ -430,6 +437,7 @@ void sensors_process(){ NsentOverCAN = send_temperatures(NsentOverCAN); // call sending T process if(NsentOverCAN < 0){ // all data sent -> sleep Sstate = SENS_SLEEPING; + mesg("SENS_SENDING_DATA -> SENS_SLEEPING"); /* if(Nsens_present != Ntemp_measured){ // restart sensors only after measurements sent mesg("restart"); @@ -439,13 +447,14 @@ void sensors_process(){ } break; case SENS_SLEEPING: // wait for `SLEEP_TIME` till next measurements in scan mode - if(NsentOverCAN < 0){ + /*if(NsentOverCAN < 0){ mesg("SENS_SLEEPING"); NsentOverCAN = 0; - } + }*/ if(sensors_scan_mode){ // sleep until next measurement start if(Tms - lastSensT > SLEEP_TIME){ Sstate = SENS_START_MSRMNT; + mesg("SENS_SLEEPING -> SENS_START_MSRMNT"); } } break; diff --git a/F0:F030,F042,F072/TSYS_controller/tsys01.bin b/F0:F030,F042,F072/TSYS_controller/tsys01.bin index 3fde2233d4c8904053c461953c1c79183d4bbd5f..e7a9af54ab970febce5cbfd08ffdaa6a4fd16cb9 100755 GIT binary patch delta 7620 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 delta 6517 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 ZgE8>8>T+4;<@ynnZ$ZDBeR^Hd{{gp{w#oni diff --git a/F0:F030,F042,F072/TSYS_controller/usart.c b/F0:F030,F042,F072/TSYS_controller/usart.c index 4f018ce..a08409d 100644 --- a/F0:F030,F042,F072/TSYS_controller/usart.c +++ b/F0:F030,F042,F072/TSYS_controller/usart.c @@ -29,6 +29,7 @@ #include "usb.h" #endif +#define WAITFOR (72000000) extern volatile uint32_t Tms; static int datalen[2] = {0,0}; // received data line length (including '\n') @@ -62,14 +63,14 @@ TXstatus usart_send(const char *str, int len){ if(!txrdy) return LINE_BUSY; if(len > UARTBUFSZ) return STR_TOO_LONG; txrdy = 0; - IWDG->KR = IWDG_REFRESH; #ifdef EBUG USB_send("\n\n\nUSART send:\n"); USB_send(str); USB_send("\n\n"); #endif memcpy(tbuf, str, len); - while(!(USARTX->ISR & USART_ISR_TXE)); // no refresh of WD to prevent weird things + for(int i = 0; (i < WAITFOR) && !(USARTX->ISR & USART_ISR_TXE); ++i){IWDG->KR = IWDG_REFRESH;} + if(!(USARTX->ISR & USART_ISR_TXE)) return LINE_BUSY; #if USARTNUM == 2 DMA1_Channel4->CCR &= ~DMA_CCR_EN; DMA1_Channel4->CNDTR = len; @@ -80,25 +81,32 @@ TXstatus usart_send(const char *str, int len){ DMA1_Channel2->CCR |= DMA_CCR_EN; #else #error "Not implemented" +#endif +#ifdef EBUG + USB_send(" -> start transmission\n"); #endif return ALL_OK; } TXstatus usart_send_blocking(const char *str, int len){ if(!txrdy) return LINE_BUSY; - int i; bufovr = 0; IWDG->KR = IWDG_REFRESH; - while(!(USARTX->ISR & USART_ISR_TXE)); // no refresh of WD to prevent weird things + for(int i = 0; (i < WAITFOR) && !(USARTX->ISR & USART_ISR_TXE); ++i){IWDG->KR = IWDG_REFRESH;} + if(!(USARTX->ISR & USART_ISR_TXE)) return LINE_BUSY; #ifdef EBUG USB_send("\n\n\nUSART send blocking:\n"); USB_send(str); - USB_send("\n\n"); + USB_send("\n"); #endif - for(i = 0; i < len; ++i){ + for(int l = 0; l < len; ++l){ USARTX -> TDR = *str++; - while(!(USARTX->ISR & USART_ISR_TXE)){IWDG->KR = IWDG_REFRESH;}; + for(int i = 0; (i < WAITFOR) && !(USARTX->ISR & USART_ISR_TXE); ++i){IWDG->KR = IWDG_REFRESH;} + if(!(USARTX->ISR & USART_ISR_TXE)) return LINE_BUSY; } +#ifdef EBUG + USB_send(" -> done\n"); +#endif return ALL_OK; } /* @@ -135,7 +143,7 @@ void usart_setup(){ USART2->BRR = 480000 / 1152; USART2->CR3 = USART_CR3_DMAT; // enable DMA Tx USART2->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE; // 1start,8data,nstop; enable Rx,Tx,USART - while(!(USART2->ISR & USART_ISR_TC)); // polling idle frame Transmission + for(int i = 0; (i < WAITFOR) && !(USART2->ISR & USART_ISR_TC); ++i){IWDG->KR = IWDG_REFRESH;} // polling idle frame Transmission USART2->ICR |= USART_ICR_TCCF; // clear TC flag USART2->CR1 |= USART_CR1_RXNEIE; NVIC_EnableIRQ(USART2_IRQn); @@ -159,7 +167,7 @@ void usart_setup(){ USART1->BRR = 480000 / 1152; USART1->CR3 = USART_CR3_DMAT; // enable DMA Tx USART1->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE; // 1start,8data,nstop; enable Rx,Tx,USART - while(!(USART1->ISR & USART_ISR_TC)); // polling idle frame Transmission + for(int i = 0; (i < WAITFOR) && !(USART1->ISR & USART_ISR_TC); ++i){IWDG->KR = IWDG_REFRESH;} // polling idle frame Transmission USART1->ICR |= USART_ICR_TCCF; // clear TC flag USART1->CR1 |= USART_CR1_RXNEIE; NVIC_EnableIRQ(USART1_IRQn); diff --git a/F0:F030,F042,F072/TSYS_controller/version.inc b/F0:F030,F042,F072/TSYS_controller/version.inc index 339b156..f662976 100644 --- a/F0:F030,F042,F072/TSYS_controller/version.inc +++ b/F0:F030,F042,F072/TSYS_controller/version.inc @@ -1,3 +1,3 @@ -#define BUILD_NUMBER "66" -#define BUILD_DATE "2023-09-11" -#define BUILDNO 66 +#define BUILD_NUMBER "80" +#define BUILD_DATE "2023-09-12" +#define BUILDNO 80