From 5479313e53fce47e2bc6fbfad3d89ea7d4fb9498 Mon Sep 17 00:00:00 2001 From: Susis Strolch Date: Mon, 27 May 2019 10:08:01 +0200 Subject: [PATCH 1/2] smart-tx - tx_mode 2 solved after sending the byte we wait until we receive the busmaster response. sending the BRK is done in loopback mode. Only caveat: we will get a phantom \0 in Rx FIFO --- src/emsuart.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/emsuart.cpp b/src/emsuart.cpp index 133640a5c..b9ca314ac 100644 --- a/src/emsuart.cpp +++ b/src/emsuart.cpp @@ -237,13 +237,13 @@ void ICACHE_FLASH_ATTR emsuart_tx_buffer(uint8_t * buf, uint8_t len) { emsuart_flush_fifos(); // throw out the telegram... - for (uint8_t i = 0; i < len; i++) { - USF(EMSUART_UART) = buf[i]; // send each Tx byte - } + for (uint8_t i = 0; i < len;) { + USF(EMSUART_UART) = buf[i++]; // send each Tx byte + // wait for echo from busmaster + while ((((USS(EMSUART_UART) >> USRXC) & 0xFF) < i || (USIS(EMSUART_UART) & (1 << UIBD)))) { + delayMicroseconds(EMSUART_BIT_TIME); // burn CPU cycles... - // wait until we received sizeof(telegram) or RxBRK (== collision detect) - while ((((USS(EMSUART_UART) >> USRXC) & 0xFF) < len) || (USIS(EMSUART_UART) & (1 << UIBD))) { - delayMicroseconds(11 * EMSUART_BIT_TIME); // burn CPU cycles... + } } // we got the whole telegram in Rx buffer @@ -257,7 +257,7 @@ void ICACHE_FLASH_ATTR emsuart_tx_buffer(uint8_t * buf, uint8_t len) { // wait until BRK detected... while (!(USIS(EMSUART_UART) & (1 << UIBD))) { - delayMicroseconds(EMSUART_BIT_TIME / 8); // ~13µs + delayMicroseconds(EMSUART_BIT_TIME); } USC0(EMSUART_UART) &= ~(1 << UCBRK); // clear @@ -265,7 +265,8 @@ void ICACHE_FLASH_ATTR emsuart_tx_buffer(uint8_t * buf, uint8_t len) { emsuart_loopback(false); // disable loopback mode } - emsuart_flush_fifos(); // flush Rx buffer to be sure + // w/o flushing the Rx FIFO we will get a trailing \0 from our loopback BRK + // emsuart_flush_fifos(); // flush Rx buffer to be sure ETS_UART_INTR_ENABLE(); // receive anything from FIFO... } } From fdebf6bbdf204b6983fa2459b7fb3210c9a6fe69 Mon Sep 17 00:00:00 2001 From: Susis Strolch Date: Mon, 27 May 2019 12:47:06 +0200 Subject: [PATCH 2/2] tx_mode=2: compensate phantom BRK --- src/emsuart.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/emsuart.cpp b/src/emsuart.cpp index b9ca314ac..b1c8ba841 100644 --- a/src/emsuart.cpp +++ b/src/emsuart.cpp @@ -16,6 +16,7 @@ _EMSRxBuf * pEMSRxBuf; _EMSRxBuf * paEMSRxBuf[EMS_MAXBUFFERS]; uint8_t emsRxBufIdx = 0; +uint8_t phantomBrk = 0; // tells Rx about upcoming phantom break from Tx os_event_t recvTaskQueue[EMSUART_recvTaskQueueLen]; // our Rx queue @@ -49,6 +50,12 @@ static void emsuart_rx_intr_handler(void * para) { U0IC = (1 << UIBD); // INT clear the BREAK detect interrupt + // we've send a BRK with loopback enabled, so we must compensate the phantom break + if (phantomBrk) { + length--; // compensate buffer length + phantomBrk = 0; // clear flag + } + // copy data into transfer buffer pEMSRxBuf->writePtr = length; os_memcpy((void *)pEMSRxBuf->buffer, (void *)&uart_buffer, length); @@ -251,6 +258,8 @@ void ICACHE_FLASH_ATTR emsuart_tx_buffer(uint8_t * buf, uint8_t len) { // otherwise, we send the final Tx-BRK in loopback and enable Rx-INT. // worst case, we'll see an additional Rx-BRK... if (!(USIS(EMSUART_UART) & (1 << UIBD))) { + phantomBrk = 1; // tell Rx to expect a phantom BRK + // no bus collision - send terminating BRK signal emsuart_loopback(true); USC0(EMSUART_UART) |= (1 << UCBRK); // set