From e959c7dfe2984cb938e50bdce00cd88e398f4301 Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Mon, 11 Sep 2023 22:09:22 +0300 Subject: [PATCH] fixed some problems with USART --- .../TSYS_controller/can_process.c | 3 +- F0:F030,F042,F072/TSYS_controller/main.c | 4 ++ F0:F030,F042,F072/TSYS_controller/proto.c | 12 +++- .../TSYS_controller/sensors_manage.c | 31 +++++++--- F0:F030,F042,F072/TSYS_controller/tsys01.bin | Bin 22564 -> 20824 bytes F0:F030,F042,F072/TSYS_controller/usart.c | 24 +++++++- F0:F030,F042,F072/TSYS_controller/usart.h | 2 +- F0:F030,F042,F072/TSYS_controller/usb.c | 18 ++---- F0:F030,F042,F072/TSYS_controller/usb.h | 2 +- F0:F030,F042,F072/TSYS_controller/usb_lib.c | 55 ++++-------------- F0:F030,F042,F072/TSYS_controller/version.inc | 6 +- 11 files changed, 81 insertions(+), 76 deletions(-) diff --git a/F0:F030,F042,F072/TSYS_controller/can_process.c b/F0:F030,F042,F072/TSYS_controller/can_process.c index 1310141..b850a73 100644 --- a/F0:F030,F042,F072/TSYS_controller/can_process.c +++ b/F0:F030,F042,F072/TSYS_controller/can_process.c @@ -80,8 +80,7 @@ void can_messages_proc(){ #ifdef EBUG SEND("got message, len: "); bufputchar('0' + len); SEND(", data: "); - uint8_t ctr; - for(ctr = 0; ctr < len; ++ctr){ + for(int ctr = 0; ctr < len; ++ctr){ printuhex(can_mesg->data[ctr]); bufputchar(' '); } diff --git a/F0:F030,F042,F072/TSYS_controller/main.c b/F0:F030,F042,F072/TSYS_controller/main.c index 64a12ff..869c306 100644 --- a/F0:F030,F042,F072/TSYS_controller/main.c +++ b/F0:F030,F042,F072/TSYS_controller/main.c @@ -124,6 +124,10 @@ int main(void){ char *txt = NULL; r = usart_getline(&txt); txt[r] = 0; +#ifdef EBUG + USB_send("\n\nUSART got:\n"); + USB_send(txt); USB_send("\n\n"); +#endif cmd_parser(txt, 0); } if(lastB - Tms > 99){ // run `sendbuf` each 100ms diff --git a/F0:F030,F042,F072/TSYS_controller/proto.c b/F0:F030,F042,F072/TSYS_controller/proto.c index 4486cc4..cd7f675 100644 --- a/F0:F030,F042,F072/TSYS_controller/proto.c +++ b/F0:F030,F042,F072/TSYS_controller/proto.c @@ -37,7 +37,13 @@ extern volatile uint8_t canerror; extern volatile uint32_t Tms; static char buff[UARTBUFSZ+1], /* +1 - for USB send (it receive \0-terminated line) */ *bptr = buff; -static int blen = 0, USBcmd = 0, debugmode = 0; +static int blen = 0, USBcmd = 0, debugmode = +#ifdef EBUG + 1 +#else + 0 +#endif +; // LEDs are OFF by default uint8_t noLED = #ifdef EBUG @@ -70,9 +76,9 @@ void addtobuf(const char *txt){ } strcpy(bptr, txt); bptr += l; + *bptr = 0; + blen += l; } - *bptr = 0; - blen += l; } void bufputchar(char ch){ diff --git a/F0:F030,F042,F072/TSYS_controller/sensors_manage.c b/F0:F030,F042,F072/TSYS_controller/sensors_manage.c index 5f50c6b..20b67b0 100644 --- a/F0:F030,F042,F072/TSYS_controller/sensors_manage.c +++ b/F0:F030,F042,F072/TSYS_controller/sensors_manage.c @@ -65,7 +65,13 @@ const char *sensors_get_statename(SensorsState x){ // TODO: check if we can convert double to float! -const double mul[5] = {-1.5e-2, 1., -2., 4., -2.}; +#ifndef EBUG +#define TYPE double +#else +#define TYPE float +#endif + +const TYPE mul[5] = {-1.5e-2, 1., -2., 4., -2.}; /** * Get temperature & calculate it by polinome * T = (-2) * k4 * 10^{-21} * ADC16^4 @@ -86,10 +92,10 @@ static uint16_t calc_t(uint32_t t, int i){ } if(t < 600000 || t > 30000000) return BAD_TEMPERATURE; // wrong value - too small or too large int j; - double d = (double)t/256., tmp = 0.; + TYPE d = (TYPE)t/256., tmp = 0.; // k0*(-1.5e-2) + 0.1*1e-5*val*(1*k1 + 1e-5*val*(-2.*k2 + 1e-5*val*(4*k3 + 1e-5*val*(-2*k4)))) for(j = 4; j > 0; --j){ - tmp += mul[j] * (double)coeff[j]; + tmp += mul[j] * (TYPE)coeff[j]; tmp *= 1e-5*d; } tmp = tmp * 10. + 100. * mul[0] * coeff[0]; @@ -143,8 +149,12 @@ void sensors_start(){ Sstate = SENS_START_MSRMNT; break; case SENS_OFF: - overcurnt_ctr = 0; - if(sensors_on()) Sstate = SENS_START_MSRMNT; + if(Nsens_present){ // already gon N sensors - use this information + overcurnt_ctr = 0; + if(sensors_on()) Sstate = SENS_START_MSRMNT; + }else{ + sensors_init(); + } break; case SENS_OVERCURNT_OFF: sensors_init(); @@ -314,11 +324,11 @@ void showcoeffs(){ void showtemperature(){ int a, p; if(Nsens_present == 0){ - SEND("showtemperature(): no sensors found"); + SEND("showtemperature(): no sensors found\n"); return; } if(Ntemp_measured == 0){ - SEND("showtemperature(): no temperatures measured"); + SEND("showtemperature(): no temperatures measured\n"); return; } for(a = 0; a <= MUL_MAX_ADDRESS; ++a){ @@ -338,6 +348,7 @@ void showtemperature(){ } printu(t); newline(); + IWDG->KR = IWDG_REFRESH; } } } @@ -410,6 +421,12 @@ void sensors_process(){ break; case SENS_SENDING_DATA: mesg("SENS_SENDING_DATA"); + if(Nsens_present == 0){ + mesg("No sensors found -> off"); + sensors_off(); + NsentOverCAN = 0; + break; + } NsentOverCAN = send_temperatures(NsentOverCAN); // call sending T process if(NsentOverCAN < 0){ // all data sent -> sleep Sstate = SENS_SLEEPING; diff --git a/F0:F030,F042,F072/TSYS_controller/tsys01.bin b/F0:F030,F042,F072/TSYS_controller/tsys01.bin index d4fa982fe6dd4f314e51ac5b6d1fb61680f9831c..3fde2233d4c8904053c461953c1c79183d4bbd5f 100755 GIT binary patch literal 20824 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 diff --git a/F0:F030,F042,F072/TSYS_controller/usart.c b/F0:F030,F042,F072/TSYS_controller/usart.c index f149b12..4f018ce 100644 --- a/F0:F030,F042,F072/TSYS_controller/usart.c +++ b/F0:F030,F042,F072/TSYS_controller/usart.c @@ -25,6 +25,10 @@ #include "hardware.h" #include "usart.h" +#ifdef EBUG +#include "usb.h" +#endif + extern volatile uint32_t Tms; static int datalen[2] = {0,0}; // received data line length (including '\n') @@ -58,7 +62,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 #if USARTNUM == 2 DMA1_Channel4->CCR &= ~DMA_CCR_EN; DMA1_Channel4->CNDTR = len; @@ -77,13 +88,20 @@ 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 +#ifdef EBUG + USB_send("\n\n\nUSART send blocking:\n"); + USB_send(str); + USB_send("\n\n"); +#endif for(i = 0; i < len; ++i){ USARTX -> TDR = *str++; while(!(USARTX->ISR & USART_ISR_TXE)){IWDG->KR = IWDG_REFRESH;}; } return ALL_OK; } - +/* void usart_send_blck(const char *str){ while(!txrdy){IWDG->KR = IWDG_REFRESH;} bufovr = 0; @@ -91,7 +109,7 @@ void usart_send_blck(const char *str){ USARTX -> TDR = *str++; while(!(USARTX->ISR & USART_ISR_TXE)){IWDG->KR = IWDG_REFRESH;}; } -} +}*/ void usart_setup(){ // Nucleo's USART2 connected to VCP proxy of st-link @@ -199,6 +217,7 @@ void usart1_isr(){ #if USARTNUM == 2 void dma1_channel4_5_isr(){ if(DMA1->ISR & DMA_ISR_TCIF4){ // Tx + DMA1_Channel4->CCR &= ~DMA_CCR_EN; // stop DMA DMA1->IFCR |= DMA_IFCR_CTCIF4; // clear TC flag txrdy = 1; } @@ -207,6 +226,7 @@ void dma1_channel4_5_isr(){ #elif USARTNUM == 1 void dma1_channel2_3_isr(){ if(DMA1->ISR & DMA_ISR_TCIF2){ // Tx + DMA1_Channel2->CCR &= ~DMA_CCR_EN; // stop DMA DMA1->IFCR |= DMA_IFCR_CTCIF2; // clear TC flag txrdy = 1; } diff --git a/F0:F030,F042,F072/TSYS_controller/usart.h b/F0:F030,F042,F072/TSYS_controller/usart.h index f9764cf..d85032d 100644 --- a/F0:F030,F042,F072/TSYS_controller/usart.h +++ b/F0:F030,F042,F072/TSYS_controller/usart.h @@ -46,6 +46,6 @@ void usart_setup(); int usart_getline(char **line); TXstatus usart_send(const char *str, int len); TXstatus usart_send_blocking(const char *str, int len); -void usart_send_blck(const char *str); +//void usart_send_blck(const char *str); #endif // __USART_H__ diff --git a/F0:F030,F042,F072/TSYS_controller/usb.c b/F0:F030,F042,F072/TSYS_controller/usb.c index 03cd614..2756335 100644 --- a/F0:F030,F042,F072/TSYS_controller/usb.c +++ b/F0:F030,F042,F072/TSYS_controller/usb.c @@ -33,6 +33,7 @@ static uint8_t incoming_data[IDATASZ]; static uint8_t ovfl = 0; static uint16_t idatalen = 0; static int8_t usbON = 0; // ==1 when USB fully configured +volatile int8_t usbConn = 0; // ==1 when connected static volatile uint8_t tx_succesfull = 0; // interrupt IN handler (never used?) @@ -111,6 +112,7 @@ void usb_proc(){ } void USB_send(const char *buf){ + if(!usbConn) return; uint16_t l = 0, ctr = 0; const char *p = buf; while(*p++) ++l; @@ -143,22 +145,10 @@ int USB_receive(char *buf, int bufsize){ } } if(i == idatalen || stlen == 0) return 0; - /* - char x[] = "USB got x:\n"; - x[8] = '0' + stlen; - usart_send_blck(x); - usart_send_blck((char*)incoming_data); - usart_send_blck("\n"); - */ USB->CNTR = 0; int sz = (stlen > bufsize) ? bufsize : stlen, rest = idatalen - sz; memcpy(buf, incoming_data, sz); buf[sz] = 0; - /* - usart_send_blck("buf:\n"); - usart_send_blck((char*)buf); - usart_send_blck("\n"); - */ if(rest > 0){ memmove(incoming_data, &incoming_data[sz], rest); idatalen = rest; @@ -177,7 +167,7 @@ int USB_receive(char *buf, int bufsize){ /** * @brief USB_configured * @return 1 if USB is in configured state - */ + * int USB_configured(){ return usbON; -} +}*/ diff --git a/F0:F030,F042,F072/TSYS_controller/usb.h b/F0:F030,F042,F072/TSYS_controller/usb.h index 75d22b4..00c5c0a 100644 --- a/F0:F030,F042,F072/TSYS_controller/usb.h +++ b/F0:F030,F042,F072/TSYS_controller/usb.h @@ -32,6 +32,6 @@ void USB_setup(); void usb_proc(); void USB_send(const char *buf); int USB_receive(char *buf, int bufsize); -int USB_configured(); +//int USB_configured(); #endif // __USB_H__ diff --git a/F0:F030,F042,F072/TSYS_controller/usb_lib.c b/F0:F030,F042,F072/TSYS_controller/usb_lib.c index 4b1cbcb..3f46d7d 100644 --- a/F0:F030,F042,F072/TSYS_controller/usb_lib.c +++ b/F0:F030,F042,F072/TSYS_controller/usb_lib.c @@ -27,11 +27,12 @@ #include "usart.h" #include "usb_lib.h" - #ifdef EBUG -#undef EBUG +#include "usart.h" +#define MSG(x) do{usart_send(x, sizeof(x));}while(0) #endif + ep_t endpoints[ENDPOINTS_NUM]; static usb_dev_t USB_Dev; @@ -148,17 +149,17 @@ _USB_STRING_(USB_StringProdDescriptor, u"USB-Serial Controller"); */ // SET_LINE_CODING void WEAK linecoding_handler(usb_LineCoding __attribute__((unused)) *lc){ - //MSG("linecoding_handler\n"); + MSG("linecoding_handler\n"); } // SET_CONTROL_LINE_STATE void WEAK clstate_handler(uint16_t __attribute__((unused)) val){ - //MSG("clstate_handler\n"); + MSG("clstate_handler\n"); } // SEND_BREAK void WEAK break_handler(){ - //MSG("break_handler\n"); + MSG("break_handler\n"); } // handler of vendor requests @@ -192,12 +193,6 @@ void WEAK vendor_handler(config_pack_t *packet){ } -#ifdef EBUG - uint8_t _2wr = 0; - #define WRITEDUMP(str) do{MSG(str); _2wr = 1;}while(0) -#else - #define WRITEDUMP(str) -#endif static void wr0(const uint8_t *buf, uint16_t size){ if(setup_packet.wLength < size) size = setup_packet.wLength; EP_WriteIRQ(0, buf, size); @@ -227,7 +222,7 @@ static inline void get_descriptor(){ wr0(USB_DeviceQualifierDescriptor, USB_DeviceQualifierDescriptor[0]); break; default: - WRITEDUMP("UNK_DES"); + break; } } @@ -243,11 +238,9 @@ static inline void std_d2h_req(){ EP_WriteIRQ(0, (uint8_t *)&status, 2); // send status: Bus Powered break; case GET_CONFIGURATION: - WRITEDUMP("GET_CONFIGURATION"); EP_WriteIRQ(0, &configuration, 1); break; default: - WRITEDUMP("80:WR_REQ"); break; } } @@ -264,11 +257,12 @@ static inline void std_h2d_req(){ configuration = setup_packet.wValue; break; default: - WRITEDUMP("0:WR_REQ"); break; } } + +extern volatile int8_t usbConn; /* bmRequestType: 76543210 7 direction: 0 - host->device, 1 - device->host @@ -303,8 +297,6 @@ static uint16_t EP0_Handler(ep_t ep){ EP_WriteIRQ(0, (uint8_t *)0, 0); epstatus = SET_NAK_RX(epstatus); epstatus = SET_VALID_TX(epstatus); - }else{ - WRITEDUMP("02:WR_REQ"); } break; case VENDOR_REQUEST_TYPE: @@ -324,9 +316,10 @@ static uint16_t EP0_Handler(ep_t ep){ break; case SEND_BREAK: break_handler(); + usbConn = 0; break; default: - WRITEDUMP("undef control req"); + break; } if(!dev2host) EP_WriteIRQ(0, (uint8_t *)0, 0); // write acknowledgement epstatus = SET_VALID_RX(epstatus); @@ -341,8 +334,8 @@ static uint16_t EP0_Handler(ep_t ep){ if(ep.rx_cnt){ EP_WriteIRQ(0, (uint8_t *)0, 0); if(setup_packet.bRequest == SET_LINE_CODING){ - //WRITEDUMP("SET_LINE_CODING"); linecoding_handler((usb_LineCoding*)ep0databuf); + usbConn = 1; // now we can transmit data: computer have stable connection } } // Close transaction @@ -364,32 +357,8 @@ static uint16_t EP0_Handler(ep_t ep){ epstatus = SET_VALID_RX(epstatus); epstatus = SET_VALID_TX(epstatus); } -#ifdef EBUG - if(_2wr){ - usart_putchar(' '); - if (ep.rx_flag) usart_putchar('r'); - else usart_putchar('t'); - printu(setup_packet.wLength); - if(ep.setup_flag) usart_putchar('s'); - usart_putchar(' '); - usart_putchar('I'); - printu(setup_packet.wIndex); - usart_putchar('V'); - printu(setup_packet.wValue); - usart_putchar('R'); - printu(setup_packet.bRequest); - usart_putchar('T'); - printu(setup_packet.bmRequestType); - usart_putchar(' '); - usart_putchar('0' + ep0dbuflen); - usart_putchar(' '); - hexdump(ep0databuf, ep0dbuflen); - usart_putchar('\n'); - } -#endif return epstatus; } -#undef WRITEDUMP static uint16_t lastaddr = USB_EP0_BASEADDR; /** diff --git a/F0:F030,F042,F072/TSYS_controller/version.inc b/F0:F030,F042,F072/TSYS_controller/version.inc index f318e6c..339b156 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 "48" -#define BUILD_DATE "2023-08-29" -#define BUILDNO 48 +#define BUILD_NUMBER "66" +#define BUILD_DATE "2023-09-11" +#define BUILDNO 66