add error checking for tx
This commit is contained in:
parent
c4ef044fcd
commit
6f15b96a79
@ -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) {
|
||||
uint8_t op_mode, irq_flags, config_2;
|
||||
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) {
|
||||
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) {
|
||||
|
||||
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…
x
Reference in New Issue
Block a user