From bb36185066eeee3e57c404a6338053d6ecc834af Mon Sep 17 00:00:00 2001 From: Skip Hansen Date: Tue, 17 Dec 2024 07:17:47 -0800 Subject: [PATCH] C6 Ver 001f - fix #410 & other C6 improvements 1. Only call esp_ieee802154_receive_handle_done() when ack != NULL. 2. Add 2 millisecond timeout for all SubGhz MISO wait loops to prevent watchdog timeouts when/if bad things happen (none observed during testing) 3. Make CC1101 detection more robust and less intrusive by testing MISO and CSn before trying to read chip version number. 4. Remove useless "error" messages which occur during normal operation. 5. Added missing \r in some log messages for EOL consistency. --- .../main/SubGigRadio.c | 114 ++++++++++++++++-- .../main/cc1101_radio.c | 35 ++++-- .../main/cc1101_radio.h | 9 ++ .../OpenEPaperLink_esp32_C6_AP/main/main.c | 12 +- .../OpenEPaperLink_esp32_C6_AP/main/radio.c | 6 +- 5 files changed, 150 insertions(+), 26 deletions(-) diff --git a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/SubGigRadio.c b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/SubGigRadio.c index 6ad6c775..a0361daf 100644 --- a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/SubGigRadio.c +++ b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/SubGigRadio.c @@ -13,13 +13,15 @@ #include "radio.h" #include "proto.h" +#include "utils.h" +#include "second_uart.h" #include "cc1101_radio.h" #include "SubGigRadio.h" void DumpHex(void *AdrIn,int Len); +bool CC1101_QuickCheck(void); -#define LOGE(format, ... ) \ - printf("%s#%d: " format,__FUNCTION__,__LINE__,## __VA_ARGS__) +#define wait_Miso(level) CC1101_WaitMISO(__FUNCTION__,__LINE__,level) #if 0 #define LOG(format, ... ) printf("%s: " format,__FUNCTION__,## __VA_ARGS__) @@ -31,7 +33,6 @@ void DumpHex(void *AdrIn,int Len); #define LOG_HEX(x,y) #endif - // SPI Stuff #if CONFIG_SPI2_HOST #define HOST_ID SPI2_HOST @@ -39,6 +40,9 @@ void DumpHex(void *AdrIn,int Len); #define HOST_ID SPI3_HOST #endif +// Wait for up to 2 milliseconds for MISO to go low +#define MISO_WAIT_TIMEOUT 2 + // Address Config = No address check // Base Frequency = xxx.xxx // CRC Enable = false @@ -247,10 +251,10 @@ SubGigErr SubGig_radio_init(uint8_t ch) SubGigErr Ret = SUBGIG_ERR_NONE; do { - gpio_reset_pin(CONFIG_CSN_GPIO); - gpio_set_direction(CONFIG_CSN_GPIO, GPIO_MODE_OUTPUT); - gpio_set_level(CONFIG_CSN_GPIO, 1); - + if(!CC1101_QuickCheck()) { + Ret = SUBGIG_CC1101_NOT_FOUND; + break; + } spi_bus_config_t buscfg = { .sclk_io_num = CONFIG_SCK_GPIO, .mosi_io_num = CONFIG_MOSI_GPIO, @@ -297,6 +301,7 @@ SubGigErr SubGig_radio_init(uint8_t ch) } // Check Chip ID if(!CC1101_Present()) { + LOGE("CC1101 not detected\n"); Ret = SUBGIG_CC1101_NOT_FOUND; break; } @@ -314,7 +319,7 @@ SubGigErr SubGig_radio_init(uint8_t ch) } while(false); if(ErrLine != 0) { - LOG("%s#%d: failed %d\n",__FUNCTION__,ErrLine,Err); + LOGA("%s#%d: failed %d\n",__FUNCTION__,ErrLine,Err); if(Err == 0) { Ret = ESP_FAIL; } @@ -477,7 +482,7 @@ int CheckSubGigState() } if(Err != SUBGIG_ERR_NONE) { - LOG("CheckSubGigState: returing %d\n",Err); + LOGE("Returning %d\n",Err); } return Err; @@ -558,5 +563,96 @@ void DumpHex(void *AdrIn,int Len) LOG_RAW("\n"); } } + + +// Quick and hopefully safe check if a CC1101 is present. +// Only the CSN and MISO GPIOs are configured for this test. +// If they are and there's a CC1101 then MISO should go low when +// CSN is low +bool CC1101_QuickCheck() +{ +// Init CSn and MISO + esp_err_t Err = ESP_OK; + bool Ret = false; + int Line = 0; + int MisoLevel; + + do { + Err = gpio_reset_pin(CONFIG_MISO_GPIO); + if(Err != ESP_OK) { + Line = __LINE__; + break; + } + + Err = gpio_set_direction(CONFIG_MISO_GPIO,GPIO_MODE_INPUT); + if(Err != ESP_OK) { + Line = __LINE__; + break; + } + + Err = gpio_set_pull_mode(CONFIG_MISO_GPIO,GPIO_PULLUP_ONLY); + if(Err != ESP_OK) { + Line = __LINE__; + break; + } + + Err = gpio_reset_pin(CONFIG_CSN_GPIO); + if(Err != ESP_OK) { + Line = __LINE__; + break; + } + Err = gpio_set_direction(CONFIG_CSN_GPIO,GPIO_MODE_OUTPUT); + if(Err != ESP_OK) { + Line = __LINE__; + break; + } + Err = gpio_set_level(CONFIG_CSN_GPIO,1); + if(Err != ESP_OK) { + Line = __LINE__; + break; + } + + // The CC1101 is not selected and MISO has a pullup so it should be high + if(wait_Miso(1) != 1) { + LOGA("Error: SubGhz MISO stuck low\n"); + break; + } + // Select the CC1101 + Err = gpio_set_level(CONFIG_CSN_GPIO,0); + if(Err != ESP_OK) { + Line = __LINE__; + break; + } + MisoLevel = wait_Miso(0); + + // Deselect the CC1101 + Err = gpio_set_level(CONFIG_CSN_GPIO,1); + if(Err != ESP_OK) { + Line = __LINE__; + break; + } + + if(MisoLevel == 0) { + Ret = true; + } + } while(false); + + + if(Line != 0) { + LOGA("%s#%d: gpio call failed (0x%x)\n",__FUNCTION__,__LINE__,Err); + } + + if(Ret) { + // Disable pullup, it's no longer needed + gpio_set_pull_mode(CONFIG_MISO_GPIO,GPIO_FLOATING); + } + else { + // CC1101 not present, deinit MISO and CSn GPIOs + LOGE("CC1101 not detected\n"); + gpio_reset_pin(CONFIG_MISO_GPIO); + gpio_reset_pin(CONFIG_CSN_GPIO); + } + return Ret; +} #endif // CONFIG_OEPL_SUBGIG_SUPPORT diff --git a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/cc1101_radio.c b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/cc1101_radio.c index 13ecaffe..eae99409 100755 --- a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/cc1101_radio.c +++ b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/cc1101_radio.c @@ -34,18 +34,15 @@ #include #include #include "proto.h" +#include "utils.h" +#include "second_uart.h" #include "cc1101_radio.h" #include "radio.h" #define ENABLE_LOGGING 0 -// LOGA - generic logging, always enabled -#define LOGA(format, ... ) printf(format,## __VA_ARGS__) -// LOGE - error logging, always enabled -#define LOGE(format, ... ) printf("%s: " format,__FUNCTION__,## __VA_ARGS__) - #if ENABLE_LOGGING -#define LOG(format, ... ) printf("%s: " format,__FUNCTION__,## __VA_ARGS__) +#define LOG(format, ... ) printf("%s: " format "\r",__FUNCTION__,## __VA_ARGS__) #define LOG_RAW(format, ... ) printf(format,## __VA_ARGS__) #else #define LOG(format, ... ) @@ -197,7 +194,7 @@ uint8_t CC1101_readReg(uint8_t regAddr, uint8_t regType); void CC1101_writeReg(uint8_t regAddr, uint8_t value); void CC1101_setTxState(void); -void setIdleState(void); +static void setIdleState(void); spi_device_handle_t gSpiHndl; @@ -288,7 +285,7 @@ static uint8_t gRfState; #define cc1101_Select() gpio_set_level(CONFIG_CSN_GPIO, LOW) #define cc1101_Deselect() gpio_set_level(CONFIG_CSN_GPIO, HIGH) -#define wait_Miso() while(gpio_get_level(CONFIG_MISO_GPIO)>0) +#define wait_Miso() CC1101_WaitMISO(__FUNCTION__,__LINE__,0) #define getGDO0state() gpio_get_level(CONFIG_GDO0_GPIO) #define wait_GDO0_high() while(!getGDO0state()) #define wait_GDO0_low() while(getGDO0state()) @@ -633,14 +630,13 @@ int CC1101_Rx(uint8_t *RxBuf,size_t RxBufLen,uint8_t *pRssi,uint8_t *pLqi) // Any data waiting to be read and no overflow? do { if(rxBytes & CC1101_RXFIFO_OVERFLOW_MASK) { - LOGE("RxFifo overflow\n"); + // This occurs occasionally due to random noise, so do don't log Ret = -2; break; } if(rxBytes < 2) { // should have at least 2 bytes, packet len and one byte of data - LOGE("Internal error, rxBytes = %d\n",rxBytes); Ret = -2; break; } @@ -786,5 +782,24 @@ void CC1101_logState() } } + +// Wait for up to 2 milliseconds for MISO to go low +#define MISO_WAIT_TIMEOUT 2 +int CC1101_WaitMISO(const char *Func,int Line,int level) +{ + uint32_t Start = getMillis(); + int MisoLevel; + + while((MisoLevel = gpio_get_level(CONFIG_MISO_GPIO)) != level) { + if((getMillis() - Start) >= MISO_WAIT_TIMEOUT) { + LOGA("%s#%d: timeout waiting for MISO to go %s\n", + Func,Line,level ? "high" : "low"); + break; + } + } + + return MisoLevel; +} + #endif // CONFIG_OEPL_SUBGIG_SUPPORT diff --git a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/cc1101_radio.h b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/cc1101_radio.h index a8335be6..84fe8ebb 100755 --- a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/cc1101_radio.h +++ b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/cc1101_radio.h @@ -29,6 +29,14 @@ #ifndef __CC1101_RADIO_H_ #define __CC1101_RADIO_H_ +// Log to all +#define LOGA(format, ... ) \ + uart_printf(format "\r",## __VA_ARGS__) + +// Error log to all +#define LOGE(format, ... ) \ + uart_printf("%s#%d: " format "\r",__FUNCTION__,__LINE__,## __VA_ARGS__) + /** * CC1101 configuration registers */ @@ -113,6 +121,7 @@ void CC1101_DumpRegs(void); void CC1101_reset(void); void CC1101_logState(void); void CC1101_setRxState(void); +int CC1101_WaitMISO(const char *Func,int Line,int level); #endif // __CC1101_RADIO_H_ diff --git a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/main.c b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/main.c index 5bdf865e..22287dce 100644 --- a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/main.c +++ b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/main.c @@ -44,7 +44,7 @@ const uint8_t channelList[6] = {11, 15, 20, 25, 26, 27}; struct pendingData pendingDataArr[MAX_PENDING_MACS]; // VERSION GOES HERE! -uint16_t version = 0x001e; +uint16_t version = 0x001f; #define RAW_PKT_PADDING 2 @@ -474,7 +474,7 @@ void processBlockRequest(const uint8_t *buffer, uint8_t forceBlockDownload) { lastBlockRequest = getMillis(); } else { // we're talking to another mac, let this mac know we can't accomodate another request right now - pr("BUSY!\n"); + pr("BUSY!\n\r"); sendCancelXfer(rxHeader->src); return; } @@ -496,9 +496,9 @@ void processBlockRequest(const uint8_t *buffer, uint8_t forceBlockDownload) { if (forceBlockDownload) { if ((getMillis() - nextBlockAttempt) > 380) { requestDataDownload = true; - pr("FORCED\n"); + pr("FORCED\n\r"); } else { - pr("IGNORED\n"); + pr("IGNORED\n\r"); } } } @@ -647,7 +647,7 @@ void sendPart(uint8_t partNo) { } void sendBlockData() { if (getBlockDataLength() == 0) { - pr("Invalid block request received, 0 parts..\n"); + pr("Invalid block request received, 0 parts..\n\r"); requestedData.requestedParts[0] |= 0x01; } @@ -660,7 +660,7 @@ void sendBlockData() { pr("."); } } - pr("\n"); + pr("\n\r"); uint8_t partNo = 0; while (partNo < BLOCK_MAX_PARTS) { diff --git a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/radio.c b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/radio.c index d8bb3d0f..da5748dd 100644 --- a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/radio.c +++ b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/radio.c @@ -54,7 +54,11 @@ void esp_ieee802154_transmit_failed(const uint8_t *frame, esp_ieee802154_tx_erro void esp_ieee802154_transmit_done(const uint8_t *frame, const uint8_t *ack, esp_ieee802154_frame_info_t *ack_frame_info) { isInTransmit = 0; ESP_EARLY_LOGI(TAG, "TX %d", frame[0]); - esp_ieee802154_receive_handle_done(ack); + if(ack != NULL) { + if(esp_ieee802154_receive_handle_done(ack)) { + ESP_EARLY_LOGI(TAG, "esp_ieee802154_receive_handle_done() failed"); + } + } } static bool zigbee_is_enabled = false; void radio_init(uint8_t ch) {