add support for packet tx
This commit is contained in:
		
							parent
							
								
									85f816850b
								
							
						
					
					
						commit
						589a819e4f
					
				| @ -7,12 +7,18 @@ | |||||||
| 
 | 
 | ||||||
| const char *SX127X_TAG = "sx127x"; | const char *SX127X_TAG = "sx127x"; | ||||||
| 
 | 
 | ||||||
|  | typedef struct sx127x_packet { | ||||||
|  |   char * data; | ||||||
|  |   size_t data_len; | ||||||
|  | } sx127x_packet_t; | ||||||
|  | 
 | ||||||
| esp_err_t sx127x_init(sx127x_config_t *config, sx127x_t **handle_ptr) { | esp_err_t sx127x_init(sx127x_config_t *config, sx127x_t **handle_ptr) { | ||||||
|   esp_err_t ret; |   esp_err_t ret; | ||||||
|   sx127x_t *handle = malloc(sizeof(sx127x_t)); |   sx127x_t *handle = malloc(sizeof(sx127x_t)); | ||||||
|   SX127X_CHECK(handle != NULL, "malloc error", ESP_ERR_NO_MEM); |   SX127X_CHECK(handle != NULL, "malloc error", ESP_ERR_NO_MEM); | ||||||
| 
 | 
 | ||||||
|   handle->task_handle = NULL; |   handle->task_handle = NULL; | ||||||
|  |   handle->task_state  = SX127X_TASK_STOPPED; | ||||||
|   memcpy(&handle->config, config, sizeof(sx127x_config_t)); |   memcpy(&handle->config, config, sizeof(sx127x_config_t)); | ||||||
| 
 | 
 | ||||||
|   ret = gpio_set_direction(config->rst_io_num, GPIO_MODE_OUTPUT); |   ret = gpio_set_direction(config->rst_io_num, GPIO_MODE_OUTPUT); | ||||||
| @ -24,13 +30,16 @@ esp_err_t sx127x_init(sx127x_config_t *config, sx127x_t **handle_ptr) { | |||||||
|   gpio_set_level(config->rst_io_num, 1); |   gpio_set_level(config->rst_io_num, 1); | ||||||
|   vTaskDelay(RESET_DELAY); |   vTaskDelay(RESET_DELAY); | ||||||
| 
 | 
 | ||||||
|   spi_bus_config_t bus_config = {.mosi_io_num     = config->mosi_io_num, |   spi_bus_config_t bus_config = { | ||||||
|                                  .miso_io_num     = config->miso_io_num, |       .mosi_io_num     = config->mosi_io_num, | ||||||
|                                  .sclk_io_num     = config->sck_io_num, |       .miso_io_num     = config->miso_io_num, | ||||||
|                                  .quadhd_io_num   = -1, |       .sclk_io_num     = config->sck_io_num, | ||||||
|                                  .quadwp_io_num   = -1, |       .quadhd_io_num   = -1, | ||||||
|                                  .max_transfer_sz = SX127X_MAX_TRANSFER}; |       .quadwp_io_num   = -1, | ||||||
|   ret                         = spi_bus_initialize(config->spi_host, &bus_config, 1); |       .max_transfer_sz = SX127X_MAX_TRANSFER, | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   ret = spi_bus_initialize(config->spi_host, &bus_config, 1); | ||||||
|   SX127X_ERROR_CHECK2(ret, spi_bus_initialize) |   SX127X_ERROR_CHECK2(ret, spi_bus_initialize) | ||||||
| 
 | 
 | ||||||
|   spi_device_interface_config_t device_config = { |   spi_device_interface_config_t device_config = { | ||||||
| @ -120,14 +129,90 @@ esp_err_t sx127x_free(sx127x_t *handle) { | |||||||
| 
 | 
 | ||||||
| void sx127x_isr(void *arg) { | void sx127x_isr(void *arg) { | ||||||
|   sx127x_t *handle = (sx127x_t *)arg; |   sx127x_t *handle = (sx127x_t *)arg; | ||||||
|   ESP_LOGI(SX127X_TAG, "sx127x_isr"); |   ESP_LOGV(SX127X_TAG, "sx127x_isr"); | ||||||
|  |   BaseType_t hpTaskWoken; | ||||||
|  |   xSemaphoreGiveFromISR(handle->intr_semaphore, &hpTaskWoken); | ||||||
|  |   if (hpTaskWoken) { | ||||||
|  |     portYIELD_FROM_ISR(); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void sx127x_do_tx(sx127x_t *handle, sx127x_packet_t *packet) { | ||||||
|  |   uint8_t op_mode, irq_flags, config_2; | ||||||
|  |   while (handle->task_state == SX127X_TASK_RUNNING) { | ||||||
|  |     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; | ||||||
|  |     } | ||||||
|  |     vTaskDelay(1); // wait for finish transmitting
 | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   sx127x_standby(handle); | ||||||
|  | 
 | ||||||
|  |   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); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   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); | ||||||
|  | 
 | ||||||
|  |   sx127x_write_register(handle, REG_FIFO_ADDR_PTR, 0); | ||||||
|  |   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); | ||||||
|  | 
 | ||||||
|  |   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); | ||||||
|  | 
 | ||||||
|  |   // wait for transmission to finish
 | ||||||
|  |   while (true) { | ||||||
|  |     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); | ||||||
|  | 
 | ||||||
|  |   // go back to rx mode
 | ||||||
|  |   sx127x_write_register(handle, REG_OP_MODE, SX127X_LONG_RANGE | SX127X_MODE_RX_CONT); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void sx127x_task(void *arg) { | void sx127x_task(void *arg) { | ||||||
|   sx127x_t *handle = (sx127x_t *)arg; |   sx127x_t *       handle     = (sx127x_t *)arg; | ||||||
|   while (handle->task_running) { |   TickType_t       delay_time = 0; | ||||||
|     vTaskDelay(pdMS_TO_TICKS(10)); |   QueueSetHandle_t qSet       = xQueueCreateSet(8); | ||||||
|  |   xQueueAddToSet(handle->intr_semaphore, qSet); | ||||||
|  |   xQueueAddToSet(handle->tx_packet_queue, qSet); | ||||||
|  |   sx127x_packet_t packet; | ||||||
|  |   while (handle->task_state == SX127X_TASK_RUNNING) { | ||||||
|  |     QueueSetMemberHandle_t queue = xQueueSelectFromSet(qSet, delay_time); | ||||||
|  |     if (queue == handle->intr_semaphore) { | ||||||
|  |       BaseType_t didRecv = xSemaphoreTake(handle->intr_semaphore, 0); | ||||||
|  |       if (didRecv) { | ||||||
|  |         ESP_LOGI(SX127X_TAG, "recv from isr: %d", didRecv); | ||||||
|  |       } | ||||||
|  |     } else if (queue == handle->tx_packet_queue) { | ||||||
|  |       BaseType_t didRecv = xQueueReceive(handle->tx_packet_queue, &packet, 0); | ||||||
|  |       if (didRecv) { | ||||||
|  |         ESP_LOGI(SX127X_TAG, "tx packet: %.*s", packet.data_len, packet.data); | ||||||
|  | 
 | ||||||
|  |         sx127x_do_tx(handle, &packet); | ||||||
|  | 
 | ||||||
|  |         free(packet.data); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|   } |   } | ||||||
|  |   ESP_LOGI(SX127X_TAG, "sx127x_task exiting"); | ||||||
|  |   handle->task_state = SX127X_TASK_STOPPED; | ||||||
|  |   vTaskDelete(NULL); // must delete own task
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| esp_err_t sx127x_start(sx127x_t *handle) { | esp_err_t sx127x_start(sx127x_t *handle) { | ||||||
| @ -135,6 +220,15 @@ esp_err_t sx127x_start(sx127x_t *handle) { | |||||||
| 
 | 
 | ||||||
|   SX127X_CHECK(handle->task_handle == NULL, "task already running", ESP_ERR_INVALID_STATE); |   SX127X_CHECK(handle->task_handle == NULL, "task already running", ESP_ERR_INVALID_STATE); | ||||||
| 
 | 
 | ||||||
|  |   handle->intr_semaphore = xSemaphoreCreateBinary(); | ||||||
|  |   // handle->recv_packet_queue = xQueueCreate(8, 10);
 | ||||||
|  |   handle->tx_packet_queue = xQueueCreate(4, sizeof(sx127x_packet_t)); | ||||||
|  | 
 | ||||||
|  |   handle->task_state = SX127X_TASK_RUNNING; | ||||||
|  |   BaseType_t pdRet = | ||||||
|  |       xTaskCreate(sx127x_task, "sx127x_task", TASK_STACK_SIZE, (void *)handle, TASK_PRIORITY, &handle->task_handle); | ||||||
|  |   SX127X_CHECK(pdRet == pdPASS, "failed to create task", ESP_FAIL); | ||||||
|  | 
 | ||||||
|   ret = sx127x_write_register(handle, REG_DIO_MAPPING_1, 0x00); |   ret = sx127x_write_register(handle, REG_DIO_MAPPING_1, 0x00); | ||||||
|   SX127X_ERROR_CHECK(ret); |   SX127X_ERROR_CHECK(ret); | ||||||
| 
 | 
 | ||||||
| @ -152,11 +246,6 @@ esp_err_t sx127x_start(sx127x_t *handle) { | |||||||
|   ret = gpio_isr_handler_add(handle->config.irq_io_num, sx127x_isr, (void *)handle); |   ret = gpio_isr_handler_add(handle->config.irq_io_num, sx127x_isr, (void *)handle); | ||||||
|   SX127X_ERROR_CHECK2(ret, gpio_isr_handler_add); |   SX127X_ERROR_CHECK2(ret, gpio_isr_handler_add); | ||||||
| 
 | 
 | ||||||
|   handle->task_running = true; |  | ||||||
| 
 |  | ||||||
|   BaseType_t pdRet = |  | ||||||
|       xTaskCreate(sx127x_task, "sx127x_task", TASK_STACK_SIZE, (void *)handle, TASK_PRIORITY, &handle->task_handle); |  | ||||||
|   SX127X_CHECK(pdRet == pdPASS, "failed to create task", ESP_FAIL); |  | ||||||
|   return ESP_OK; |   return ESP_OK; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -164,12 +253,29 @@ esp_err_t sx127x_stop(sx127x_t *handle) { | |||||||
|   esp_err_t ret; |   esp_err_t ret; | ||||||
| 
 | 
 | ||||||
|   SX127X_CHECK(handle->task_handle != NULL, "task has not been started", ESP_ERR_INVALID_STATE); |   SX127X_CHECK(handle->task_handle != NULL, "task has not been started", ESP_ERR_INVALID_STATE); | ||||||
|   handle->task_running = false; |   handle->task_state = SX127X_TASK_STOPPING; | ||||||
|   xTaskNotify(handle->task_handle, 0, eNoAction); |   xTaskNotifyGive(handle->task_handle); | ||||||
| 
 | 
 | ||||||
|   ret = gpio_isr_handler_remove(handle->config.irq_io_num); |   ret = gpio_isr_handler_remove(handle->config.irq_io_num); | ||||||
|   SX127X_ERROR_CHECK2(ret, gpio_isr_handler_remove); |   SX127X_ERROR_CHECK2(ret, gpio_isr_handler_remove); | ||||||
|   gpio_uninstall_isr_service(); |   gpio_uninstall_isr_service(); | ||||||
| 
 | 
 | ||||||
|  |   while (handle->task_state != SX127X_TASK_STOPPED) { | ||||||
|  |     vTaskDelay(10); | ||||||
|  |   } | ||||||
|  |   handle->task_handle = NULL; | ||||||
|  | 
 | ||||||
|  |   return ESP_OK; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | esp_err_t sx127x_send_packet(sx127x_t *handle, char *data, size_t data_len) { | ||||||
|  |   SX127X_CHECK(data_len < SX127_MAX_PACKET_LEN, "packet len too long: %d", ESP_FAIL, data_len); | ||||||
|  |   sx127x_packet_t packet; | ||||||
|  |   packet.data_len = data_len; | ||||||
|  |   packet.data     = heap_caps_malloc(data_len, MALLOC_CAP_DMA); | ||||||
|  |   SX127X_CHECK(packet.data != NULL, "malloc error", ESP_ERR_NO_MEM); | ||||||
|  |   memcpy(packet.data, data, data_len); | ||||||
|  |   BaseType_t pdRet = xQueueSend(handle->tx_packet_queue, &packet, 0); | ||||||
|  |   SX127X_CHECK(pdRet == pdTRUE, "tx queue full", ESP_FAIL); | ||||||
|   return ESP_OK; |   return ESP_OK; | ||||||
| } | } | ||||||
|  | |||||||
| @ -4,7 +4,7 @@ | |||||||
| #include <driver/spi_master.h> | #include <driver/spi_master.h> | ||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
| 
 | 
 | ||||||
| #define SX127X_MAX_TRANSFER (256) | #define SX127_MAX_PACKET_LEN 255 | ||||||
| 
 | 
 | ||||||
| // carrier frequency type
 | // carrier frequency type
 | ||||||
| typedef uint64_t sx127x_freq_t; | typedef uint64_t sx127x_freq_t; | ||||||
| @ -76,10 +76,8 @@ esp_err_t sx127x_init(sx127x_config_t *config, sx127x_t **handle_ptr); | |||||||
| 
 | 
 | ||||||
| esp_err_t sx127x_free(sx127x_t *handle); | esp_err_t sx127x_free(sx127x_t *handle); | ||||||
| 
 | 
 | ||||||
| esp_err_t sx127x_sleep(sx127x_t *handle); |  | ||||||
| 
 |  | ||||||
| esp_err_t sx127x_standby(sx127x_t *handle); |  | ||||||
| 
 |  | ||||||
| esp_err_t sx127x_start(sx127x_t *handle); | esp_err_t sx127x_start(sx127x_t *handle); | ||||||
| 
 | 
 | ||||||
| esp_err_t sx127x_stop(sx127x_t *handle); | esp_err_t sx127x_stop(sx127x_t *handle); | ||||||
|  | 
 | ||||||
|  | esp_err_t sx127x_send_packet(sx127x_t *handle, char *data, size_t data_len); | ||||||
|  | |||||||
| @ -1,7 +1,10 @@ | |||||||
| #include <esp_log.h> | #include <esp_log.h> | ||||||
|  | #include <freertos/FreeRTOS.h> | ||||||
|  | #include <freertos/queue.h> | ||||||
|  | #include <freertos/semphr.h> | ||||||
| #include <freertos/task.h> | #include <freertos/task.h> | ||||||
| 
 | 
 | ||||||
| #define MAX_PKT_LENGTH 255 | #define SX127X_MAX_TRANSFER (256) | ||||||
| #define RESET_DELAY (pdMS_TO_TICKS(15)) | #define RESET_DELAY (pdMS_TO_TICKS(15)) | ||||||
| // 8mhz
 | // 8mhz
 | ||||||
| #define SPI_CLOCK_HZ (8 * 1000 * 1000) | #define SPI_CLOCK_HZ (8 * 1000 * 1000) | ||||||
| @ -43,13 +46,18 @@ | |||||||
| #define REG_VERSION 0x42 | #define REG_VERSION 0x42 | ||||||
| #define REG_PA_DAC 0x4d | #define REG_PA_DAC 0x4d | ||||||
| 
 | 
 | ||||||
| // modes
 | typedef enum sx127x_op_mode { | ||||||
| #define MODE_LONG_RANGE_MODE 0x80 |   SX127X_MODE_SLEEP     = 0x00, | ||||||
| #define MODE_SLEEP 0x00 |   SX127X_MODE_STDBY     = 0x01, | ||||||
| #define MODE_STDBY 0x01 |   SX127X_MODE_FS_TX     = 0x02, | ||||||
| #define MODE_TX 0x03 |   SX127X_MODE_TX        = 0x03, | ||||||
| #define MODE_RX_CONTINUOUS 0x05 |   SX127X_MODE_FS_RX     = 0x04, | ||||||
| #define MODE_RX_SINGLE 0x06 |   SX127X_MODE_RX_CONT   = 0x05, | ||||||
|  |   SX127X_MODE_RX_SINGLE = 0x06, | ||||||
|  |   SX127X_MODE_CAD       = 0x07, | ||||||
|  |   SX127X_MODE           = 0x07, | ||||||
|  |   SX127X_LONG_RANGE     = (1 << 7) | ||||||
|  | } sx127x_op_mode_t; | ||||||
| 
 | 
 | ||||||
| #define CONFIG2_CRC 0x04 | #define CONFIG2_CRC 0x04 | ||||||
| #define CONFIG3_AUTO_AGC 0x04 | #define CONFIG3_AUTO_AGC 0x04 | ||||||
| @ -65,7 +73,7 @@ | |||||||
| #ifdef NODEBUG | #ifdef NODEBUG | ||||||
| #define SX127X_CHECK(check, str, ret_val, ...)                                                                         \ | #define SX127X_CHECK(check, str, ret_val, ...)                                                                         \ | ||||||
|   if (!(check)) {                                                                                                      \ |   if (!(check)) {                                                                                                      \ | ||||||
|     ESP_LOGE(SX127X_TAG, "%s(%d): " str, __FUNCTION__, __LINE__, ##__VA_ARGS__);                                              \ |     ESP_LOGE(SX127X_TAG, str, ##__VA_ARGS__);                                       \ | ||||||
|     return (ret_val);                                                                                                  \ |     return (ret_val);                                                                                                  \ | ||||||
|   } |   } | ||||||
| #define SX127X_ERROR_CHECK(ret)                                                                                        \ | #define SX127X_ERROR_CHECK(ret)                                                                                        \ | ||||||
| @ -79,7 +87,7 @@ | |||||||
| #else | #else | ||||||
| #define SX127X_CHECK(check, str, ret_val, ...)                                                                         \ | #define SX127X_CHECK(check, str, ret_val, ...)                                                                         \ | ||||||
|   if (!(check)) {                                                                                                      \ |   if (!(check)) {                                                                                                      \ | ||||||
|     ESP_LOGE(SX127X_TAG, "%s(%d): " #check ": " str, __FUNCTION__, __LINE__, ##__VA_ARGS__);                                  \ |     ESP_LOGE(SX127X_TAG, "%s:%d: " #check ": " str, __FUNCTION__, __LINE__, ##__VA_ARGS__);                           \ | ||||||
|     return (ret_val);                                                                                                  \ |     return (ret_val);                                                                                                  \ | ||||||
|   } |   } | ||||||
| #define SX127X_ERROR_CHECK(ret)                                                                                        \ | #define SX127X_ERROR_CHECK(ret)                                                                                        \ | ||||||
| @ -87,7 +95,7 @@ | |||||||
|     esp_err_t _error_code = (ret);                                                                                     \ |     esp_err_t _error_code = (ret);                                                                                     \ | ||||||
|     if (_error_code != ESP_OK) {                                                                                       \ |     if (_error_code != ESP_OK) {                                                                                       \ | ||||||
|       const char *_error_name = esp_err_to_name(_error_code);                                                          \ |       const char *_error_name = esp_err_to_name(_error_code);                                                          \ | ||||||
|       ESP_LOGE(SX127X_TAG, "%s(%d): %s (%d)", __FUNCTION__, __LINE__, _error_name, _error_code);                              \ |       ESP_LOGE(SX127X_TAG, "%s:%d: %s (%d)", __FUNCTION__, __LINE__, _error_name, _error_code);                       \ | ||||||
|       return _error_code;                                                                                              \ |       return _error_code;                                                                                              \ | ||||||
|     }                                                                                                                  \ |     }                                                                                                                  \ | ||||||
|   } |   } | ||||||
| @ -96,17 +104,29 @@ | |||||||
|     esp_err_t _error_code = (ret);                                                                                     \ |     esp_err_t _error_code = (ret);                                                                                     \ | ||||||
|     if (_error_code != ESP_OK) {                                                                                       \ |     if (_error_code != ESP_OK) {                                                                                       \ | ||||||
|       const char *_error_name = esp_err_to_name(_error_code);                                                          \ |       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);                    \ |       ESP_LOGE(SX127X_TAG, "%s:%d: " #fun ": %s (%d)", __FUNCTION__, __LINE__, _error_name, _error_code);             \ | ||||||
|       return _error_code;                                                                                              \ |       return _error_code;                                                                                              \ | ||||||
|     }                                                                                                                  \ |     }                                                                                                                  \ | ||||||
|   } |   } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | typedef enum sx127x_task_state { | ||||||
|  |   SX127X_TASK_STOPPED  = 0, | ||||||
|  |   SX127X_TASK_RUNNING  = 1, | ||||||
|  |   SX127X_TASK_STOPPING = 2, | ||||||
|  | } sx127x_task_state_t; | ||||||
|  | 
 | ||||||
| struct sx127x { | struct sx127x { | ||||||
|   sx127x_config_t     config; |   sx127x_config_t     config; | ||||||
|   spi_device_handle_t device_handle; |   spi_device_handle_t device_handle; | ||||||
|   TaskHandle_t        task_handle; |   TaskHandle_t        task_handle; | ||||||
|   bool                task_running; |   sx127x_task_state_t task_state; | ||||||
|  |   // binary semaphore which is given when an interrupt is received from the radio
 | ||||||
|  |   SemaphoreHandle_t intr_semaphore; | ||||||
|  |   // queue of packets received from the radio
 | ||||||
|  |   QueueHandle_t rx_packet_queue; | ||||||
|  |   // queue of packets to send to the radio
 | ||||||
|  |   QueueHandle_t tx_packet_queue; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| const char *SX127X_TAG; | const char *SX127X_TAG; | ||||||
|  | |||||||
| @ -30,11 +30,11 @@ esp_err_t sx127x_single_transfer(sx127x_t *handle, uint8_t addr, uint8_t to_slav | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| esp_err_t sx127x_sleep(sx127x_t *handle) { | esp_err_t sx127x_sleep(sx127x_t *handle) { | ||||||
|   return sx127x_write_register(handle, REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_SLEEP); |   return sx127x_write_register(handle, REG_OP_MODE, SX127X_LONG_RANGE | SX127X_MODE_SLEEP); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| esp_err_t sx127x_standby(sx127x_t *handle) { | esp_err_t sx127x_standby(sx127x_t *handle) { | ||||||
|   return sx127x_write_register(handle, REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_STDBY); |   return sx127x_write_register(handle, REG_OP_MODE, SX127X_LONG_RANGE | SX127X_MODE_STDBY); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| esp_err_t sx127x_set_frequency(sx127x_t *handle, uint64_t frequency) { | esp_err_t sx127x_set_frequency(sx127x_t *handle, uint64_t frequency) { | ||||||
| @ -182,3 +182,18 @@ esp_err_t sx127x_set_crc(sx127x_t *handle, sx127x_crc_t crc) { | |||||||
|   handle->config.crc = crc; |   handle->config.crc = crc; | ||||||
|   return ESP_OK; |   return ESP_OK; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | esp_err_t sx127x_write_fifo(sx127x_t *handle, char *data, size_t data_len) { | ||||||
|  |   spi_transaction_t trans; | ||||||
|  |   memset(&trans, 0, sizeof(trans)); | ||||||
|  |   trans.flags     = SPI_TRANS_USE_RXDATA; | ||||||
|  |   trans.addr      = REG_FIFO; | ||||||
|  |   trans.length    = 8 * data_len; | ||||||
|  |   trans.rxlength  = 0; | ||||||
|  |   trans.tx_buffer = data; | ||||||
|  | 
 | ||||||
|  |   esp_err_t ret = spi_device_transmit(handle->device_handle, &trans); | ||||||
|  |   SX127X_ERROR_CHECK2(ret, spi_device_transmit); | ||||||
|  |   ESP_LOGV(SX127X_TAG, "sx127x_write_fifo(%.*s)", data_len, data); | ||||||
|  |   return ESP_OK; | ||||||
|  | } | ||||||
|  | |||||||
| @ -4,8 +4,9 @@ esp_err_t sx127x_read_register(sx127x_t *handle, uint8_t reg, uint8_t *value); | |||||||
| esp_err_t sx127x_write_register(sx127x_t *handle, uint8_t reg, uint8_t value); | esp_err_t sx127x_write_register(sx127x_t *handle, uint8_t reg, uint8_t value); | ||||||
| esp_err_t sx127x_single_transfer(sx127x_t *handle, uint8_t addr, uint8_t to_slave, uint8_t *from_slave); | esp_err_t sx127x_single_transfer(sx127x_t *handle, uint8_t addr, uint8_t to_slave, uint8_t *from_slave); | ||||||
| 
 | 
 | ||||||
| uint8_t  sx127x_bw_to_reg(uint64_t bandwidth); | esp_err_t sx127x_sleep(sx127x_t *handle); | ||||||
| uint64_t sx127x_reg_to_bw(uint8_t bandwidth_reg); | 
 | ||||||
|  | esp_err_t sx127x_standby(sx127x_t *handle); | ||||||
| 
 | 
 | ||||||
| esp_err_t sx127x_set_frequency(sx127x_t *handle, uint64_t frequency); | esp_err_t sx127x_set_frequency(sx127x_t *handle, uint64_t frequency); | ||||||
| 
 | 
 | ||||||
| @ -14,7 +15,12 @@ esp_err_t sx127x_set_tx_power(sx127x_t *handle, uint8_t tx_power, sx127x_pa_boos | |||||||
| esp_err_t sx127x_set_spreading_factor(sx127x_t *handle, uint8_t spreading_factor); | esp_err_t sx127x_set_spreading_factor(sx127x_t *handle, uint8_t spreading_factor); | ||||||
| 
 | 
 | ||||||
| esp_err_t sx127x_set_signal_bandwidth(sx127x_t *handle, uint64_t signal_bandwidth); | esp_err_t sx127x_set_signal_bandwidth(sx127x_t *handle, uint64_t signal_bandwidth); | ||||||
|  | uint8_t   sx127x_bw_to_reg(uint64_t bandwidth); | ||||||
|  | uint64_t  sx127x_reg_to_bw(uint8_t bandwidth_reg); | ||||||
| 
 | 
 | ||||||
| esp_err_t sx127x_set_sync_word(sx127x_t *handle, uint8_t sync_word); | esp_err_t sx127x_set_sync_word(sx127x_t *handle, uint8_t sync_word); | ||||||
| 
 | 
 | ||||||
| esp_err_t sx127x_set_crc(sx127x_t *handle, sx127x_crc_t crc); | esp_err_t sx127x_set_crc(sx127x_t *handle, sx127x_crc_t crc); | ||||||
|  | 
 | ||||||
|  | esp_err_t sx127x_write_fifo(sx127x_t *handle, char *data, size_t data_len); | ||||||
|  | esp_err_t sx127x_read_fifo(sx127x_t *handle, char *data_out, size_t *data_len_out); | ||||||
|  | |||||||
| @ -38,8 +38,10 @@ struct Packet { | |||||||
| 
 | 
 | ||||||
| uint16_t packet_num; | uint16_t packet_num; | ||||||
| 
 | 
 | ||||||
| void loraTask(void *params); | sx127x_t *lora; | ||||||
|  | 
 | ||||||
| void loraOnReceive(int packetSize); | void loraOnReceive(int packetSize); | ||||||
|  | void loraTask(void *params); | ||||||
| 
 | 
 | ||||||
| TaskHandle_t lora_task_hndl; | TaskHandle_t lora_task_hndl; | ||||||
| // packets recieved (type Packet)
 | // packets recieved (type Packet)
 | ||||||
| @ -96,7 +98,6 @@ void setup(void) { | |||||||
|   lora_config.sync_word        = 0x34; |   lora_config.sync_word        = 0x34; | ||||||
|   lora_config.crc              = SX127X_CRC_ENABLED; |   lora_config.crc              = SX127X_CRC_ENABLED; | ||||||
| 
 | 
 | ||||||
|   sx127x_t *lora; |  | ||||||
|   esp_err_t ret = sx127x_init(&lora_config, &lora); |   esp_err_t ret = sx127x_init(&lora_config, &lora); | ||||||
|   if (ret != ESP_OK) { |   if (ret != ESP_OK) { | ||||||
|     const char *err_name = esp_err_to_name(ret); |     const char *err_name = esp_err_to_name(ret); | ||||||
| @ -149,13 +150,18 @@ void loraTask(void *params) { | |||||||
|     } |     } | ||||||
|     current_time = xTaskGetTickCount(); |     current_time = xTaskGetTickCount(); | ||||||
|     if (current_time >= next_send) { |     if (current_time >= next_send) { | ||||||
|       sprintf(outBuf, "hello world %d", packet_num); |       int len = sprintf(outBuf, "hello world %d", packet_num); | ||||||
|  |       if (len < 0) { | ||||||
|  |         ESP_LOGE(TAG, "sprintf error: %d", len); | ||||||
|  |         continue; | ||||||
|  |       } | ||||||
|       packet_num++; |       packet_num++; | ||||||
|       // LoRa.beginPacket();
 |       esp_err_t ret = sx127x_send_packet(lora, outBuf, len); | ||||||
|       // size_t written = LoRa.write((uint8_t *)outBuf, outBufLen - 1);
 |       if (ret != ESP_OK) { | ||||||
|       // LoRa.endPacket();
 |         ESP_LOGE(TAG, "error sending packet: %d", ret); | ||||||
|       // ESP_LOGI(TAG, "lora wrote %d bytes\n", written);
 |       } else { | ||||||
|       // LoRa.receive(0); // go back to receive mode
 |         ESP_LOGI(TAG, "lora wrote %d bytes\n", len); | ||||||
|  |       } | ||||||
| 
 | 
 | ||||||
|       current_time = xTaskGetTickCount(); |       current_time = xTaskGetTickCount(); | ||||||
|       next_send    = current_time + send_period; |       next_send    = current_time + send_period; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user