Browse Source

add error checking for tx

ugv_io
Alex Mikhalev 6 years ago
parent
commit
6f15b96a79
  1. 42
      components/sx127x_driver/sx127x_driver.c

42
components/sx127x_driver/sx127x_driver.c

@ -137,10 +137,17 @@ void sx127x_isr(void *arg) { @@ -137,10 +137,17 @@ void sx127x_isr(void *arg) {
}
}
#define _TX_CHECK(_ret) \
ret = (_ret); \
if (ret != ESP_OK) { \
goto error; \
}
void sx127x_do_tx(sx127x_t *handle, sx127x_packet_t *packet) {
esp_err_t ret;
uint8_t op_mode, irq_flags, config_2;
while (handle->task_state == SX127X_TASK_RUNNING) {
sx127x_read_register(handle, REG_OP_MODE, &op_mode);
_TX_CHECK(sx127x_read_register(handle, REG_OP_MODE, &op_mode));
uint8_t mode = op_mode & SX127X_MODE;
if (mode != SX127X_MODE_TX && mode != SX127X_MODE_FS_TX) {
break;
@ -148,39 +155,44 @@ void sx127x_do_tx(sx127x_t *handle, sx127x_packet_t *packet) { @@ -148,39 +155,44 @@ void sx127x_do_tx(sx127x_t *handle, sx127x_packet_t *packet) {
vTaskDelay(1); // wait for finish transmitting
}
sx127x_standby(handle);
_TX_CHECK(sx127x_standby(handle));
sx127x_read_register(handle, REG_IRQ_FLAGS, &irq_flags);
_TX_CHECK(sx127x_read_register(handle, REG_IRQ_FLAGS, &irq_flags));
if (irq_flags & IRQ_TX_DONE_MASK) {
// clear tx done bit
sx127x_write_register(handle, REG_IRQ_FLAGS, IRQ_TX_DONE_MASK);
_TX_CHECK(sx127x_write_register(handle, REG_IRQ_FLAGS, IRQ_TX_DONE_MASK));
}
sx127x_read_register(handle, REG_MODEM_CONFIG_2, &config_2);
_TX_CHECK(sx127x_read_register(handle, REG_MODEM_CONFIG_2, &config_2));
config_2 &= ~0x01; // set explicit header mode TODO: implicit header?
sx127x_write_register(handle, REG_MODEM_CONFIG_2, config_2);
_TX_CHECK(sx127x_write_register(handle, REG_MODEM_CONFIG_2, config_2));
sx127x_write_register(handle, REG_FIFO_ADDR_PTR, 0);
sx127x_write_register(handle, REG_PAYLOAD_LENGTH, 0);
_TX_CHECK(sx127x_write_register(handle, REG_FIFO_ADDR_PTR, 0));
_TX_CHECK(sx127x_write_register(handle, REG_PAYLOAD_LENGTH, 0));
sx127x_write_fifo(handle, packet->data, packet->data_len);
sx127x_write_register(handle, REG_PAYLOAD_LENGTH, packet->data_len);
_TX_CHECK(sx127x_write_fifo(handle, packet->data, packet->data_len));
_TX_CHECK(sx127x_write_register(handle, REG_PAYLOAD_LENGTH, packet->data_len));
sx127x_write_register(handle, REG_OP_MODE, SX127X_LONG_RANGE | SX127X_MODE_FS_TX);
_TX_CHECK(sx127x_write_register(handle, REG_OP_MODE, SX127X_LONG_RANGE | SX127X_MODE_FS_TX));
vTaskDelay(pdMS_TO_TICKS(1));
sx127x_write_register(handle, REG_OP_MODE, SX127X_LONG_RANGE | SX127X_MODE_TX);
_TX_CHECK(sx127x_write_register(handle, REG_OP_MODE, SX127X_LONG_RANGE | SX127X_MODE_TX));
// wait for transmission to finish
while (true) {
sx127x_read_register(handle, REG_IRQ_FLAGS, &irq_flags);
_TX_CHECK(sx127x_read_register(handle, REG_IRQ_FLAGS, &irq_flags));
if (irq_flags & IRQ_TX_DONE_MASK) { // if the transmission is done
break;
}
vTaskDelay(1);
}
// clear tx done bit
sx127x_write_register(handle, REG_IRQ_FLAGS, IRQ_TX_DONE_MASK);
_TX_CHECK(sx127x_write_register(handle, REG_IRQ_FLAGS, IRQ_TX_DONE_MASK));
error:
if (ret != ESP_OK) {
const char *error_name = esp_err_to_name(ret);
ESP_LOGE(SX127X_TAG, "tx error: %s (%d)", error_name, ret);
}
// go back to rx mode
sx127x_write_register(handle, REG_OP_MODE, SX127X_LONG_RANGE | SX127X_MODE_RX_CONT);
}
@ -222,7 +234,7 @@ esp_err_t sx127x_start(sx127x_t *handle) { @@ -222,7 +234,7 @@ esp_err_t sx127x_start(sx127x_t *handle) {
handle->intr_semaphore = xSemaphoreCreateBinary();
// handle->recv_packet_queue = xQueueCreate(8, 10);
handle->tx_packet_queue = xQueueCreate(4, sizeof(sx127x_packet_t));
handle->tx_packet_queue = xQueueCreate(8, sizeof(sx127x_packet_t));
handle->task_state = SX127X_TASK_RUNNING;
BaseType_t pdRet =

Loading…
Cancel
Save