|
|
|
#include "sx127x_driver.h"
|
|
|
|
|
|
|
|
#include <string.h>
|
|
|
|
#include <freertos/task.h>
|
|
|
|
#include <esp_log.h>
|
|
|
|
|
|
|
|
const char *SX127X_TAG = "sx127x";
|
|
|
|
|
|
|
|
#define SX127X_CHECK(check, str, ret_val, ...) \
|
|
|
|
if (!(check)) \
|
|
|
|
{ \
|
|
|
|
ESP_LOGE(SX127X_TAG, "%s(%d): " str, __FUNCTION__, __LINE__, ##__VA_ARGS__); \
|
|
|
|
return (ret_val); \
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef NODEBUG
|
|
|
|
#define SX127X_ERROR_CHECK(ret, fun) \
|
|
|
|
{ \
|
|
|
|
esp_err_t _error_code = (ret); \
|
|
|
|
if (_error_code != ESP_OK) \
|
|
|
|
{ \
|
|
|
|
return _error_code; \
|
|
|
|
} \
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
#define SX127X_ERROR_CHECK(ret, fun) \
|
|
|
|
{ \
|
|
|
|
esp_err_t _error_code = (ret); \
|
|
|
|
if (_error_code != ESP_OK) \
|
|
|
|
{ \
|
|
|
|
const char *_error_name = esp_err_to_name(_error_code); \
|
|
|
|
ESP_LOGE(SX127X_TAG, "%s(%d): " fun ": %s (%d)", \
|
|
|
|
__FUNCTION__, __LINE__, _error_name, _error_code); \
|
|
|
|
return _error_code; \
|
|
|
|
} \
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
esp_err_t sx127x_init(sx127x_config_t *config, sx127x_t *handle)
|
|
|
|
{
|
|
|
|
esp_err_t ret;
|
|
|
|
|
|
|
|
memcpy(&handle->config, config, sizeof(sx127x_config_t));
|
|
|
|
|
|
|
|
ret = gpio_set_direction(config->rst_io_num, GPIO_MODE_OUTPUT);
|
|
|
|
SX127X_ERROR_CHECK(ret, "gpio_set_direction")
|
|
|
|
ret = gpio_set_direction(config->irq_io_num, GPIO_MODE_OUTPUT);
|
|
|
|
SX127X_ERROR_CHECK(ret, "gpio_set_direction")
|
|
|
|
|
|
|
|
gpio_set_level(config->cs_io_num, 1);
|
|
|
|
|
|
|
|
// perform reset
|
|
|
|
gpio_set_level(config->rst_io_num, 0);
|
|
|
|
vTaskDelay(pdMS_TO_TICKS(10));
|
|
|
|
gpio_set_level(config->rst_io_num, 1);
|
|
|
|
vTaskDelay(pdMS_TO_TICKS(10));
|
|
|
|
|
|
|
|
spi_bus_config_t bus_config = {
|
|
|
|
.mosi_io_num = config->mosi_io_num,
|
|
|
|
.miso_io_num = config->miso_io_num,
|
|
|
|
.sclk_io_num = config->sck_io_num,
|
|
|
|
.quadhd_io_num = -1,
|
|
|
|
.quadwp_io_num = -1,
|
|
|
|
.max_transfer_sz = SX127X_MAX_TRANSFER};
|
|
|
|
ret = spi_bus_initialize(config->spi_host, &bus_config, 1);
|
|
|
|
SX127X_ERROR_CHECK(ret, "spi_bus_initialize")
|
|
|
|
|
|
|
|
spi_device_interface_config_t device_config = {
|
|
|
|
.command_bits = 0,
|
|
|
|
.address_bits = 8,
|
|
|
|
.dummy_bits = 0,
|
|
|
|
.mode = 0,
|
|
|
|
.duty_cycle_pos = 0,
|
|
|
|
.cs_ena_pretrans = 2,
|
|
|
|
.cs_ena_posttrans = 2,
|
|
|
|
.clock_speed_hz = 8, // 80mhz / 8 = 10mhz
|
|
|
|
.input_delay_ns = 0,
|
|
|
|
.spics_io_num = config->cs_io_num,
|
|
|
|
.flags = 0,
|
|
|
|
.queue_size = 8,
|
|
|
|
.pre_cb = NULL,
|
|
|
|
.post_cb = NULL,
|
|
|
|
};
|
|
|
|
ret = spi_bus_add_device(config->spi_host, &device_config, &handle->device_handle);
|
|
|
|
SX127X_ERROR_CHECK(ret, "spi_bus_add_device")
|
|
|
|
|
|
|
|
return ESP_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
esp_err_t sx127x_free(sx127x_t *handle)
|
|
|
|
{
|
|
|
|
esp_err_t ret;
|
|
|
|
|
|
|
|
ret = spi_bus_remove_device(handle->device_handle);
|
|
|
|
SX127X_ERROR_CHECK(ret, "spi_bus_remove_device")
|
|
|
|
|
|
|
|
ret = spi_bus_free(handle->config.spi_host);
|
|
|
|
SX127X_ERROR_CHECK(ret, "spi_bus_free")
|
|
|
|
|
|
|
|
return ESP_OK;
|
|
|
|
}
|