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.
This commit is contained in:
Skip Hansen
2024-12-17 07:17:47 -08:00
committed by GitHub
parent be8eac2fc5
commit bb36185066
5 changed files with 150 additions and 26 deletions

View File

@@ -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

View File

@@ -34,18 +34,15 @@
#include <stdbool.h>
#include <driver/spi_master.h>
#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

View File

@@ -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_

View File

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

View File

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