large changeset

change EventQueue to EventGroup
decoupled reading FIFO from receive handler
added explicit function to read incoming data
change create/init functionality, might have been causing heap issues
improved dump_regs
removed poll_rx
This commit is contained in:
Morgan 'ARR\!' Allen 2020-02-20 22:04:10 -08:00
parent 7e8fa65339
commit 80d3b56313
3 changed files with 75 additions and 84 deletions

View file

@ -3,6 +3,7 @@
#include "driver/spi_common.h" #include "driver/spi_common.h"
#include "driver/spi_master.h" #include "driver/spi_master.h"
#include "freertos/event_groups.h"
#define REG_FIFO 0x00 #define REG_FIFO 0x00
#define REG_OP_MODE 0x01 #define REG_OP_MODE 0x01
@ -63,18 +64,24 @@
#define DEFAULT_PREAMBLE 8 #define DEFAULT_PREAMBLE 8
#define DEFAULT_CR 5 #define DEFAULT_CR 5
#define EV_DIO0 (1 << 0)
enum freq { enum freq {
F433, F866, F915 F433, F866, F915
} lora32_freq; } lora32_freq;
const long long frequencies[3];
const long bandwidths[9];
enum bandwidth { enum bandwidth {
B78, B104, B156, B208, B3125, B417, B625, B125, B250 B78, B104, B156, B208, B3125, B417, B625, B125, B250
}; };
typedef void (*receiveCallback)(uint8_t *data, uint8_t size); const long long frequencies[3];
const long bandwidths[9];
typedef void (*receiveCallback)(uint8_t size);
typedef struct {
EventGroupHandle_t events;
} lora32_handle_t;
typedef struct lora32_cfg_t { typedef struct lora32_cfg_t {
uint8_t nss; uint8_t nss;
@ -91,10 +98,11 @@ typedef struct lora32_cfg_t {
bool useCRC; bool useCRC;
bool implicitHeader; bool implicitHeader;
bool poll_rx;
receiveCallback receive; receiveCallback receive;
spi_device_handle_t spi; spi_device_handle_t spi;
lora32_handle_t handle;
} lora32_cfg_t; } lora32_cfg_t;
lora32_cfg_t lora32_create(); lora32_cfg_t lora32_create();
@ -106,5 +114,6 @@ void lora32_set_spreadfactor(lora32_cfg_t *lora, uint8_t factor);
void lora32_dump_regs(lora32_cfg_t *lora); void lora32_dump_regs(lora32_cfg_t *lora);
void lora32_enable_continous_rx(lora32_cfg_t *lora); void lora32_enable_continous_rx(lora32_cfg_t *lora);
void lora32_set_coding_rate(lora32_cfg_t *lora, uint8_t d); void lora32_set_coding_rate(lora32_cfg_t *lora, uint8_t d);
void lora32_read_data(lora32_cfg_t *lora, uint8_t *data);
#endif // _LORA32_H__ #endif // _LORA32_H__

View file

@ -22,8 +22,6 @@
#define PA_OUTPUT_RFO_PIN 0 #define PA_OUTPUT_RFO_PIN 0
#define PA_OUTPUT_PA_BOOST_PIN 1 #define PA_OUTPUT_PA_BOOST_PIN 1
static xQueueHandle dio0_evt_queue = NULL;
const long long frequencies[] = { 433e+6, 866e+6, 915e+6 }; const long long frequencies[] = { 433e+6, 866e+6, 915e+6 };
const long bandwidths[] = { 7.8e+3, 10.4e+3, 15.6e+3, 20.8e+3, 31.25e+3, 41.7e+3, 62.5e+3, 125e+3, 250e+3 }; const long bandwidths[] = { 7.8e+3, 10.4e+3, 15.6e+3, 20.8e+3, 31.25e+3, 41.7e+3, 62.5e+3, 125e+3, 250e+3 };
@ -33,14 +31,13 @@ lora32_cfg_t lora32_create() {
static spi_device_handle_t spi; static spi_device_handle_t spi;
return (lora32_cfg_t){ return (lora32_cfg_t){
.bandwidth = bandwidths[F866], .bandwidth = bandwidths[B125],
.codingRate = DEFAULT_CR, .codingRate = DEFAULT_CR,
.dio0 = CONFIG_LORA32_DIO0_PIN, .dio0 = CONFIG_LORA32_DIO0_PIN,
.implicitHeader = false, .implicitHeader = false,
.nss = CONFIG_LORA32_NSS_PIN, .nss = CONFIG_LORA32_NSS_PIN,
.reset = CONFIG_LORA32_RESET_PIN, .reset = CONFIG_LORA32_RESET_PIN,
.frequency = 866000000, .frequency = 866000000,
.poll_rx = false,
.preamble = DEFAULT_PREAMBLE, .preamble = DEFAULT_PREAMBLE,
.spreadingFactor = DEFAULT_SF, .spreadingFactor = DEFAULT_SF,
.spi = spi, .spi = spi,
@ -237,33 +234,23 @@ uint8_t lora32_data_available(lora32_cfg_t *lora) {
return lora32_read_reg(lora, REG_RX_NB_BYTES) - lora->fifoIdx; return lora32_read_reg(lora, REG_RX_NB_BYTES) - lora->fifoIdx;
} }
void lora32_poll_rx(void *vp) {
lora32_cfg_t *lora = (lora32_cfg_t*)vp;
uint8_t msg[MAX_PKT_LENGTH];
while(true) {
lora32_parse_packet(lora, 0);
if(lora32_data_available(lora)) {
memset(msg, 0, MAX_PKT_LENGTH);
while(lora32_data_available(lora)) {
msg[lora->fifoIdx] = lora32_read_reg(lora, REG_FIFO);
lora->fifoIdx++;
}
lora->receive((uint8_t*)&msg, lora->fifoIdx);
}
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
void lora32_dump_regs(lora32_cfg_t *lora) { void lora32_dump_regs(lora32_cfg_t *lora) {
char endline[17] = {0};
for(uint8_t i = 0; i < 127; i++) { for(uint8_t i = 0; i < 127; i++) {
printf("0x%2X: 0x%2X\n", i, lora32_read_reg(lora, i)); if(i % 16 == 0)
printf("0x%02X: ", i);
char c = lora32_read_reg(lora, i);
endline[i % 16] = (c >= 32 ? c : '.');
printf("%02X%s", c, i % 2 == 1 ? " " : "");
if(i % 16 == 15)
printf(" %s\n", endline);
} }
printf("\n");
} }
void lora32_toggle_reset(lora32_cfg_t *config) { void lora32_toggle_reset(lora32_cfg_t *config) {
@ -310,68 +297,69 @@ void lora32_set_coding_rate(lora32_cfg_t *lora, uint8_t d) {
lora32_write_reg(lora, REG_MODEM_CONFIG_1, (lora32_read_reg(lora, REG_MODEM_CONFIG_1) & 0xF1) | (cr << 1)); lora32_write_reg(lora, REG_MODEM_CONFIG_1, (lora32_read_reg(lora, REG_MODEM_CONFIG_1) & 0xF1) | (cr << 1));
} }
void lora32_handle_dio0(void *arg) { static void IRAM_ATTR lora32_receive_task(void *arg) {
lora32_cfg_t *lora = (lora32_cfg_t*)arg; lora32_cfg_t *lora = (lora32_cfg_t*)arg;
static uint8_t msg[MAX_PKT_LENGTH]; ESP_LOGD(TAG, "starting DIO0 handler task");
while(1) { while(1) {
if(xQueueReceive(dio0_evt_queue, lora, portMAX_DELAY)) { EventBits_t evbits = xEventGroupWaitBits(lora->handle.events, EV_DIO0, pdTRUE, pdFALSE, 5000 / portTICK_PERIOD_MS);
ESP_LOGI(TAG, "handling DIO0");
memset(msg, 0, MAX_PKT_LENGTH); // timed out, loop and continue to wait
if(evbits == 0) continue;
// read IRQ flags ESP_LOGD(TAG, "handling DIO0");
uint8_t irqs = lora32_read_reg(lora, REG_IRQ_FLAGS);
// clear IRQ flags
lora32_write_reg(lora, REG_IRQ_FLAGS, irqs);
// TODO: read packet length // read IRQ flags
uint8_t len = lora32_read_reg(lora, lora->implicitHeader ? REG_PAYLOAD_LENGTH : REG_RX_NB_BYTES); ESP_LOGD(TAG, "reading irqs");
ESP_LOGD(TAG, "lora32_handle_dio0 packet length: %d", len); uint8_t irqs = lora32_read_reg(lora, REG_IRQ_FLAGS);
// clear IRQ flags
ESP_LOGD(TAG, "clearing irqs");
lora32_write_reg(lora, REG_IRQ_FLAGS, irqs);
// TODO: set FIFO address to RX address uint8_t len = lora32_read_reg(lora, (lora->implicitHeader ? REG_PAYLOAD_LENGTH : REG_RX_NB_BYTES));
uint8_t fifo_addr = lora32_read_reg(lora, REG_FIFO_RX_CURRENT_ADDR); ESP_LOGD(TAG, "lora32_receive_task packet length: %d", len);
ESP_LOGD(TAG, "lora32_handle_dio0 current FIFO address: %d", fifo_addr);
lora32_write_reg(lora, REG_FIFO_ADDR_PTR, fifo_addr); // TODO: set FIFO address to RX address
uint8_t fifo_addr = lora32_read_reg(lora, REG_FIFO_RX_CURRENT_ADDR);
ESP_LOGD(TAG, "lora32_receive_task current FIFO address: %d", fifo_addr);
uint8_t i = 0; lora32_write_reg(lora, REG_FIFO_ADDR_PTR, fifo_addr);
for(; i < len; i++) {
msg[lora->fifoIdx] = lora32_read_reg(lora, REG_FIFO);
lora->fifoIdx++; lora->receive(len);
}
ESP_LOGD(TAG, "lora32_handle_dio0: %s", msg);
lora->fifoIdx = 0;
//lora32_write_reg(lora, REG_FIFO_ADDR_PTR, 0);
lora->receive((uint8_t*)&msg, len);
}
} }
} }
static void IRAM_ATTR lora32_on_dio0(void *arg) { void lora32_read_data(lora32_cfg_t *lora, uint8_t *data) {
uint8_t i = 0; uint8_t i = 0;
uint8_t len = lora32_read_reg(lora, (lora->implicitHeader ? REG_PAYLOAD_LENGTH : REG_RX_NB_BYTES));
xQueueSendFromISR(dio0_evt_queue, &i, NULL); ESP_LOGI(TAG, "Reading %d bytes", len);
for(i = 0; i < len; i++) {
data[i] = lora32_read_reg(lora, REG_FIFO);
printf("%02X (%c) ", data[i], (data[i] > 32 ? data[i] : ' '));
}
printf("\n");
}
static void IRAM_ATTR lora32_on_dio0(void *arg) {
BaseType_t woken = pdFALSE;
xEventGroupSetBitsFromISR(((lora32_cfg_t*)arg)->handle.events, EV_DIO0, &woken);
} }
uint8_t lora32_init(lora32_cfg_t *lora) { uint8_t lora32_init(lora32_cfg_t *lora) {
ESP_LOGD(TAG, "lora32_init"); gpio_config_t io_conf;
io_conf.intr_type = GPIO_PIN_INTR_DISABLE;
io_conf.mode = GPIO_MODE_OUTPUT;
// set pin outputs
gpio_config_t io_conf;
io_conf.intr_type = GPIO_PIN_INTR_DISABLE;
io_conf.mode = GPIO_MODE_OUTPUT;
io_conf.pin_bit_mask = (1ULL<<lora->reset)|(1ULL<<lora->nss); io_conf.pin_bit_mask = (1ULL<<lora->reset)|(1ULL<<lora->nss);
io_conf.pull_down_en = 0; io_conf.pull_down_en = 0;
io_conf.pull_up_en = 0; io_conf.pull_up_en = 0;
gpio_config(&io_conf); gpio_config(&io_conf);
lora32_toggle_reset(lora); lora32_toggle_reset(lora);
// set NSS high // set NSS high
ESP_LOGI(TAG, "Bringing NSS high: %d", lora->nss); ESP_LOGI(TAG, "Bringing NSS high: %d", lora->nss);
gpio_set_level(lora->nss, 1); gpio_set_level(lora->nss, 1);
@ -401,6 +389,9 @@ uint8_t lora32_init(lora32_cfg_t *lora) {
ESP_ERROR_CHECK(spi_bus_initialize(HSPI_HOST, &buscfg, 0)); ESP_ERROR_CHECK(spi_bus_initialize(HSPI_HOST, &buscfg, 0));
ESP_ERROR_CHECK(spi_bus_add_device(HSPI_HOST, &devcfg, &lora->spi)); ESP_ERROR_CHECK(spi_bus_add_device(HSPI_HOST, &devcfg, &lora->spi));
// initialize event groups
lora->handle.events = xEventGroupCreate();
uint8_t version = lora32_read_reg(lora, REG_VERSION); uint8_t version = lora32_read_reg(lora, REG_VERSION);
ESP_LOGD(TAG, "lora32_get_id() == 0x%2X", version); ESP_LOGD(TAG, "lora32_get_id() == 0x%2X", version);
assert(version == 0x12); assert(version == 0x12);
@ -435,8 +426,6 @@ uint8_t lora32_init(lora32_cfg_t *lora) {
if(lora->receive != NULL) { if(lora->receive != NULL) {
ESP_LOGI(TAG, "Setting callback handler"); ESP_LOGI(TAG, "Setting callback handler");
dio0_evt_queue = xQueueCreate(10, sizeof(uint8_t));
io_conf.intr_type = GPIO_PIN_INTR_POSEDGE; io_conf.intr_type = GPIO_PIN_INTR_POSEDGE;
io_conf.pin_bit_mask = (1ULL << CONFIG_LORA32_DIO0_PIN); io_conf.pin_bit_mask = (1ULL << CONFIG_LORA32_DIO0_PIN);
io_conf.mode = GPIO_MODE_INPUT; io_conf.mode = GPIO_MODE_INPUT;
@ -450,20 +439,13 @@ uint8_t lora32_init(lora32_cfg_t *lora) {
gpio_isr_handler_add(CONFIG_LORA32_DIO0_PIN, lora32_on_dio0, (void*)lora); gpio_isr_handler_add(CONFIG_LORA32_DIO0_PIN, lora32_on_dio0, (void*)lora);
// this should probably be high priority // this should probably be high priority
xTaskCreate(&lora32_handle_dio0, "lora32_handle_dio0", 2048, lora, 6, NULL); xTaskCreate(&lora32_receive_task, "lora32_receive_task", 14048, (void*)lora, 6, NULL);
// TODO comment and probably change 0x00 to a macro
lora32_write_reg(lora, REG_DIO_MAPPING_1, 0x00); lora32_write_reg(lora, REG_DIO_MAPPING_1, 0x00);
lora32_enable_continous_rx(lora); lora32_enable_continous_rx(lora);
} }
if(lora->poll_rx) {
ESP_LOGI(TAG, "enabling rx polling");
xTaskCreate(&lora32_poll_rx, "lora32_poll_rx", 2048, lora, 6, NULL);
}
//lora32_dump_regs(spi);
return 1; return 1;
}; };

View file

@ -62,7 +62,7 @@ static void uart_event_task(void *pvParameters) {
size += event.size; size += event.size;
if(dtmp[size - 1] == '\n') { if(dtmp[size - 1] == '\n' || dtmp[size - 1] == '\r') {
uart_write_bytes(UART_NUM_0, (const char*) dtmp, size); uart_write_bytes(UART_NUM_0, (const char*) dtmp, size);
struct Cmd *handler; struct Cmd *handler;
@ -99,7 +99,7 @@ static void uart_event_task(void *pvParameters) {
static void handle_lora_receive(uint8_t *data, uint8_t size) { static void handle_lora_receive(uint8_t *data, uint8_t size) {
uint8_t j; uint8_t j;
ESP_LOGI(TAG, "received: " LOG_RESET_COLOR "%s", data); ESP_LOGI(TAG, "received: " LOG_RESET_COLOR "%s", data+13);
for(uint8_t i = 0; i < size; i += 16) { for(uint8_t i = 0; i < size; i += 16) {
for(j = 0; j < 16; j++) { for(j = 0; j < 16; j++) {
@ -168,7 +168,7 @@ void app_main() {
xTaskCreate(&loop, "loop", 2048, NULL, 6, NULL); xTaskCreate(&loop, "loop", 2048, NULL, 6, NULL);
lora = lora32_create(); lora = lora32_create();
lora.frequency = frequencies[F915]; //lora.frequency = frequencies[F915];
lora.receive = &handle_lora_receive; lora.receive = &handle_lora_receive;
//lora.poll_rx = true; //lora.poll_rx = true;