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) {