113 lines
5.4 KiB
C
113 lines
5.4 KiB
C
|
#include <esp_log.h>
|
||
|
#include <freertos/task.h>
|
||
|
|
||
|
#define MAX_PKT_LENGTH 255
|
||
|
#define RESET_DELAY (pdMS_TO_TICKS(15))
|
||
|
// 8mhz
|
||
|
#define SPI_CLOCK_HZ (8 * 1000 * 1000)
|
||
|
#define TASK_STACK_SIZE (2 * 1024)
|
||
|
#define TASK_PRIORITY 3
|
||
|
|
||
|
#define REG_FIFO 0x00
|
||
|
#define REG_OP_MODE 0x01
|
||
|
#define REG_FRF_MSB 0x06
|
||
|
#define REG_FRF_MID 0x07
|
||
|
#define REG_FRF_LSB 0x08
|
||
|
#define REG_PA_CONFIG 0x09
|
||
|
#define REG_OCP 0x0b
|
||
|
#define REG_LNA 0x0c
|
||
|
#define REG_FIFO_ADDR_PTR 0x0d
|
||
|
#define REG_FIFO_TX_BASE_ADDR 0x0e
|
||
|
#define REG_FIFO_RX_BASE_ADDR 0x0f
|
||
|
#define REG_FIFO_RX_CURRENT_ADDR 0x10
|
||
|
#define REG_IRQ_FLAGS 0x12
|
||
|
#define REG_RX_NB_BYTES 0x13
|
||
|
#define REG_PKT_SNR_VALUE 0x19
|
||
|
#define REG_PKT_RSSI_VALUE 0x1a
|
||
|
#define REG_MODEM_CONFIG_1 0x1d
|
||
|
#define REG_MODEM_CONFIG_2 0x1e
|
||
|
#define REG_PREAMBLE_MSB 0x20
|
||
|
#define REG_PREAMBLE_LSB 0x21
|
||
|
#define REG_PAYLOAD_LENGTH 0x22
|
||
|
#define REG_MODEM_CONFIG_3 0x26
|
||
|
#define REG_FREQ_ERROR_MSB 0x28
|
||
|
#define REG_FREQ_ERROR_MID 0x29
|
||
|
#define REG_FREQ_ERROR_LSB 0x2a
|
||
|
#define REG_RSSI_WIDEBAND 0x2c
|
||
|
#define REG_DETECTION_OPTIMIZE 0x31
|
||
|
#define REG_INVERTIQ 0x33
|
||
|
#define REG_DETECTION_THRESHOLD 0x37
|
||
|
#define REG_SYNC_WORD 0x39
|
||
|
#define REG_INVERTIQ2 0x3b
|
||
|
#define REG_DIO_MAPPING_1 0x40
|
||
|
#define REG_VERSION 0x42
|
||
|
#define REG_PA_DAC 0x4d
|
||
|
|
||
|
// modes
|
||
|
#define MODE_LONG_RANGE_MODE 0x80
|
||
|
#define MODE_SLEEP 0x00
|
||
|
#define MODE_STDBY 0x01
|
||
|
#define MODE_TX 0x03
|
||
|
#define MODE_RX_CONTINUOUS 0x05
|
||
|
#define MODE_RX_SINGLE 0x06
|
||
|
|
||
|
#define CONFIG2_CRC 0x04
|
||
|
#define CONFIG3_AUTO_AGC 0x04
|
||
|
|
||
|
// PA config
|
||
|
#define PA_BOOST 0x80
|
||
|
|
||
|
// IRQ masks
|
||
|
#define IRQ_TX_DONE_MASK 0x08
|
||
|
#define IRQ_PAYLOAD_CRC_ERROR_MASK 0x20
|
||
|
#define IRQ_RX_DONE_MASK 0x40
|
||
|
|
||
|
#ifdef NODEBUG
|
||
|
#define SX127X_CHECK(check, str, ret_val, ...) \
|
||
|
if (!(check)) { \
|
||
|
ESP_LOGE(SX127X_TAG, "%s(%d): " str, __FUNCTION__, __LINE__, ##__VA_ARGS__); \
|
||
|
return (ret_val); \
|
||
|
}
|
||
|
#define SX127X_ERROR_CHECK(ret) \
|
||
|
{ \
|
||
|
esp_err_t _error_code = (ret); \
|
||
|
if (_error_code != ESP_OK) { \
|
||
|
return _error_code; \
|
||
|
} \
|
||
|
}
|
||
|
#define SX127X_ERROR_CHECK2(ret, fun) SX127X_CHECK(ret)
|
||
|
#else
|
||
|
#define SX127X_CHECK(check, str, ret_val, ...) \
|
||
|
if (!(check)) { \
|
||
|
ESP_LOGE(SX127X_TAG, "%s(%d): " #check ": " str, __FUNCTION__, __LINE__, ##__VA_ARGS__); \
|
||
|
return (ret_val); \
|
||
|
}
|
||
|
#define SX127X_ERROR_CHECK(ret) \
|
||
|
{ \
|
||
|
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): %s (%d)", __FUNCTION__, __LINE__, _error_name, _error_code); \
|
||
|
return _error_code; \
|
||
|
} \
|
||
|
}
|
||
|
#define SX127X_ERROR_CHECK2(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
|
||
|
|
||
|
struct sx127x {
|
||
|
sx127x_config_t config;
|
||
|
spi_device_handle_t device_handle;
|
||
|
TaskHandle_t task_handle;
|
||
|
bool task_running;
|
||
|
};
|
||
|
|
||
|
const char *SX127X_TAG;
|