#include "sx127x_driver.h" #include #include #include 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; }