fixes
This commit is contained in:
4
.vscode/settings.json
vendored
4
.vscode/settings.json
vendored
@@ -40,6 +40,8 @@
|
|||||||
"math.h": "c",
|
"math.h": "c",
|
||||||
"esp_check.h": "c",
|
"esp_check.h": "c",
|
||||||
"radio.h": "c",
|
"radio.h": "c",
|
||||||
"sx1262.h": "c"
|
"sx1262.h": "c",
|
||||||
|
"gps.h": "c",
|
||||||
|
"servocontroller.h": "c"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -21,6 +21,8 @@ idf_component_register(SRCS
|
|||||||
"hw/sx1262.h"
|
"hw/sx1262.h"
|
||||||
"components/sensors.c"
|
"components/sensors.c"
|
||||||
"components/sensors.h"
|
"components/sensors.h"
|
||||||
|
"components/servocontroller.c"
|
||||||
|
"components/servocontroller.h"
|
||||||
"components/radio.c"
|
"components/radio.c"
|
||||||
"components/radio.h"
|
"components/radio.h"
|
||||||
"main.c"
|
"main.c"
|
||||||
|
@@ -0,0 +1,88 @@
|
|||||||
|
#ifndef PACKETS_STRUCTS
|
||||||
|
#define PACKETS_STRUCTS
|
||||||
|
#include "stdint.h"
|
||||||
|
|
||||||
|
typedef struct __attribute__((packed))
|
||||||
|
{
|
||||||
|
uint32_t packetIndex;
|
||||||
|
uint8_t packetType;
|
||||||
|
uint32_t missionTimer;
|
||||||
|
} DownBoundPacket;
|
||||||
|
|
||||||
|
typedef struct __attribute__((packed))
|
||||||
|
{
|
||||||
|
// MPU data
|
||||||
|
int16_t accelerationX;
|
||||||
|
int16_t accelerationY;
|
||||||
|
int16_t accelerationZ;
|
||||||
|
int16_t gyroX;
|
||||||
|
int16_t gyroY;
|
||||||
|
int16_t gyroZ;
|
||||||
|
int16_t magnetX;
|
||||||
|
int16_t magnetY;
|
||||||
|
int16_t magnetZ;
|
||||||
|
int16_t accelerometer_temperature;
|
||||||
|
|
||||||
|
// CCS data
|
||||||
|
uint16_t eCO2;
|
||||||
|
uint16_t tvoc;
|
||||||
|
uint8_t currentCCS;
|
||||||
|
uint16_t rawCCSData;
|
||||||
|
|
||||||
|
// INA data
|
||||||
|
uint16_t volts;
|
||||||
|
uint16_t current;
|
||||||
|
uint16_t power;
|
||||||
|
|
||||||
|
// BME DATA
|
||||||
|
uint32_t temperature;
|
||||||
|
uint16_t humidity;
|
||||||
|
uint32_t pressure;
|
||||||
|
uint16_t gas;
|
||||||
|
bool gas_valid;
|
||||||
|
bool heater_stable;
|
||||||
|
uint8_t gas_range;
|
||||||
|
uint8_t gas_index;
|
||||||
|
|
||||||
|
// GPS DATA
|
||||||
|
uint32_t time_seconds; // Seconds since start of day
|
||||||
|
int32_t latitude_centi_degrees; // Latitude * 10,000
|
||||||
|
int32_t longitude_centi_degrees; // Longitude * 10,000
|
||||||
|
int16_t altitude_centi_meters; // Altitude * 100
|
||||||
|
uint8_t fix_quality;
|
||||||
|
uint8_t num_satellites;
|
||||||
|
uint16_t date_yyddmm; // YYDDMM (from GPRMC)
|
||||||
|
uint16_t speed_centi_knots; // Speed * 100 (from GPRMC)
|
||||||
|
|
||||||
|
int32_t predicted_latitude_centi_degrees; // Latitude * 10,000
|
||||||
|
int32_t predicted_longitude_centi_degrees; // Longitude * 10,000
|
||||||
|
int16_t predicted_altitude_centi_meters; // Altitude * 100
|
||||||
|
|
||||||
|
// ADC DATA
|
||||||
|
int32_t NH3;
|
||||||
|
int32_t CO;
|
||||||
|
int32_t NO2;
|
||||||
|
int32_t UVC;
|
||||||
|
|
||||||
|
int16_t currentServoA;
|
||||||
|
int16_t targetServoA;
|
||||||
|
int16_t currentServoB;
|
||||||
|
int16_t targetServoB;
|
||||||
|
|
||||||
|
} TelemetryPacket;
|
||||||
|
|
||||||
|
typedef struct __attribute__((packed))
|
||||||
|
{
|
||||||
|
uint32_t packetIndex;
|
||||||
|
uint8_t packetType;
|
||||||
|
} UplinkPacket;
|
||||||
|
|
||||||
|
typedef struct __attribute__((packed))
|
||||||
|
{
|
||||||
|
uint8_t powerMode;
|
||||||
|
uint8_t controlMode;
|
||||||
|
uint16_t servoA;
|
||||||
|
uint16_t servoB;
|
||||||
|
} SystemControlPacket;
|
||||||
|
|
||||||
|
#endif
|
@@ -2,206 +2,107 @@
|
|||||||
#include "freertos/task.h"
|
#include "freertos/task.h"
|
||||||
#include "../hw/sx1262.h"
|
#include "../hw/sx1262.h"
|
||||||
#include "radio.h"
|
#include "radio.h"
|
||||||
|
#include "esp_log.h"
|
||||||
|
#include "string.h"
|
||||||
|
#include "esp_timer.h"
|
||||||
|
|
||||||
const char *msg = "Testing 123 test why is this not on air";
|
const char *msg = "Testing 123 test why is this not on air";
|
||||||
|
|
||||||
|
#define TAG "LoRa"
|
||||||
|
|
||||||
|
uint32_t packetIndex = 0;
|
||||||
|
|
||||||
|
TelemetryPacket telemetryPacket;
|
||||||
|
uint8_t packetReadiness = 0;
|
||||||
|
|
||||||
void lora_comms_task(void *pvParameters)
|
void lora_comms_task(void *pvParameters)
|
||||||
{
|
{
|
||||||
sx1262_init();
|
|
||||||
sx1262_resetStats();
|
|
||||||
ESP_LOGI(TAG_RADIO, "Setting standby RC");
|
|
||||||
sx1262_setStandby(SX1262_STANDBY_RC);
|
|
||||||
|
|
||||||
ESP_LOGI(TAG_RADIO, "Getting version");
|
const int64_t interval_us = 100000; // 100 ms
|
||||||
unsigned char versDat[16];
|
int64_t start_time, end_time, elapsed;
|
||||||
sx1262_readRegister(0x0320, versDat, 16);
|
LoRaInit();
|
||||||
ESP_LOGI(TAG_RADIO, "Version: %s", versDat);
|
int8_t txPowerInDbm = 20;
|
||||||
|
|
||||||
sx1262_get_status();
|
uint32_t frequencyInHz = 0;
|
||||||
|
frequencyInHz = 869525000;
|
||||||
|
ESP_LOGW(TAG, "Enable TCXO");
|
||||||
|
float tcxoVoltage = 2.2; // use TCXO
|
||||||
|
bool useRegulatorLDO = true; // use DCDC + LDO
|
||||||
|
|
||||||
// Read status
|
// LoRaDebugPrint(true);
|
||||||
sx1262_get_status();
|
if (LoRaBegin(frequencyInHz, txPowerInDbm, tcxoVoltage, useRegulatorLDO) != 0)
|
||||||
|
{
|
||||||
ESP_LOGI(TAG_RADIO, "Setting TCXO");
|
ESP_LOGE(TAG, "Does not recognize the module");
|
||||||
sx1262_setDIO3AsTCXOCtrl(SX1262_TCXO_VOLTAGE22dV, 320);
|
|
||||||
|
|
||||||
sx1262_get_status();
|
|
||||||
|
|
||||||
ESP_LOGI(TAG_RADIO, "Setting Buffer base address");
|
|
||||||
sx1262_setBufferBaseAddress(0, 0);
|
|
||||||
sx1262_get_status();
|
|
||||||
|
|
||||||
ESP_LOGI(TAG_RADIO, "Setting packet Type");
|
|
||||||
sx1262_setPacketType(SX1262_PACKET_TYPE_LORA);
|
|
||||||
sx1262_get_status();
|
|
||||||
|
|
||||||
ESP_LOGI(TAG_RADIO, "Setting RXTX fallback mode");
|
|
||||||
sx1262_setRxTXFallbackMode(SX1262_FALLBACK_RC);
|
|
||||||
sx1262_get_status();
|
|
||||||
|
|
||||||
ESP_LOGI(TAG_RADIO, "Setting CAD params");
|
|
||||||
sx1262_setCadParams(0x03, 0x16, 0x0A, 0, 0);
|
|
||||||
sx1262_get_status();
|
|
||||||
|
|
||||||
ESP_LOGI(TAG_RADIO, "Clearing IRQ status");
|
|
||||||
sx1262_clearIrqStatus(0x43FF);
|
|
||||||
sx1262_get_status();
|
|
||||||
|
|
||||||
ESP_LOGI(TAG_RADIO, "Setting Image rejection");
|
|
||||||
sx1262_calibrateImage(0xD7, 0xDB);
|
|
||||||
|
|
||||||
sx1262_get_status();
|
|
||||||
|
|
||||||
ESP_LOGI(TAG_RADIO, "Calibrating Image rejection");
|
|
||||||
sx1262_calibrate(SX1262_CALIBRATION_ALL);
|
|
||||||
sx1262_get_status();
|
|
||||||
|
|
||||||
ESP_LOGI(TAG_RADIO, "Setting regulator");
|
|
||||||
sx1262_setRegulatorMode(SX1262_REGULATOR_DC_DC_LDO);
|
|
||||||
sx1262_get_status();
|
|
||||||
|
|
||||||
uint8_t modType;
|
|
||||||
modType = sx1262_getPacketType();
|
|
||||||
sx1262_get_status();
|
|
||||||
ESP_LOGI(TAG_RADIO, "ModType %d", modType);
|
|
||||||
|
|
||||||
sx1262_LoRaModulationParams_t loraModParams;
|
|
||||||
|
|
||||||
loraModParams.bandwidth = SX1262_LORA_BW_125;
|
|
||||||
loraModParams.codingRate = SX1262_LORA_CR_4_5;
|
|
||||||
loraModParams.lowDataRateOpt = 1;
|
|
||||||
loraModParams.spreadingFactor = SX1262_LORA_SF7;
|
|
||||||
|
|
||||||
ESP_LOGI(TAG_RADIO, "Setting modulation params");
|
|
||||||
sx1262_setLoRaModulationParams(&loraModParams);
|
|
||||||
|
|
||||||
sx1262_get_status();
|
|
||||||
|
|
||||||
ESP_LOGI(TAG_RADIO, "Setting Sync word");
|
|
||||||
uint8_t syncWord[2] = {0x14, 0x24};
|
|
||||||
|
|
||||||
sx1262_writeRegister(SX1262_LORA_SYNC_WORD_MSB, syncWord, 2);
|
|
||||||
sx1262_get_status();
|
|
||||||
|
|
||||||
uint8_t ocpBuf[1] = {SX126X_OCP_LEVEL_SX1262};
|
|
||||||
|
|
||||||
ESP_LOGI(TAG_RADIO, "Setting overcurrent protection");
|
|
||||||
sx1262_writeRegister(SX126X_OCP_CONFIGURATION, ocpBuf, 1);
|
|
||||||
|
|
||||||
sx1262_get_status();
|
|
||||||
|
|
||||||
ESP_LOGI(TAG_RADIO, "Setting RF Switch out");
|
|
||||||
sx1262_setDIO2AsRfSwitchCtrl(1);
|
|
||||||
|
|
||||||
sx1262_get_status();
|
|
||||||
|
|
||||||
sx1262_LoRaPacketParams_t loraPacketParams;
|
|
||||||
loraPacketParams.preambleLength = 10;
|
|
||||||
loraPacketParams.crcType = SX1262_CRC_ON;
|
|
||||||
loraPacketParams.headerType = SX1262_HEADER_TYPE_VARIABLE;
|
|
||||||
loraPacketParams.invertIQ = SX1262_STANDARD_IQ;
|
|
||||||
loraPacketParams.payloadLength = sizeof(msg);
|
|
||||||
|
|
||||||
ESP_LOGI(TAG_RADIO, "Setting packet params");
|
|
||||||
sx1262_setLoRaPacketParams(&loraPacketParams);
|
|
||||||
|
|
||||||
sx1262_get_status();
|
|
||||||
|
|
||||||
ESP_LOGI(TAG_RADIO, "Setting frequency");
|
|
||||||
sx1262_setFrequency(869525000);
|
|
||||||
|
|
||||||
uint8_t clampConfig[1] = {0xDE};
|
|
||||||
|
|
||||||
ESP_LOGI(TAG_RADIO, "Setting TX clamp");
|
|
||||||
sx1262_writeRegister(SX126X_TX_CLAMP_CONFIG, clampConfig, 1);
|
|
||||||
sx1262_get_status();
|
|
||||||
|
|
||||||
ESP_LOGI(TAG_RADIO, "Setting TX power");
|
|
||||||
sx1262_configure_tx_power(0x04, 0x07, 0x01, LORA_TX_POWER, SX1262_Ramp_200U);
|
|
||||||
|
|
||||||
sx1262_get_status();
|
|
||||||
|
|
||||||
sx1262_get_status();
|
|
||||||
|
|
||||||
ESP_LOGI(TAG_RADIO, "Setting standby XOSC");
|
|
||||||
sx1262_setStandby(SX1262_STANDBY_XOSC);
|
|
||||||
|
|
||||||
sx1262_get_status();
|
|
||||||
|
|
||||||
sx1262_setDioIrqParams(SX1262_IRQ_ALL, SX1262_IRQ_TXDone, 0, 0);
|
|
||||||
|
|
||||||
sx1262_get_status();
|
|
||||||
|
|
||||||
ESP_LOGI(TAG_RADIO, "Setting buffer base address");
|
|
||||||
sx1262_setBufferBaseAddress(0, 0);
|
|
||||||
|
|
||||||
sx1262_get_status();
|
|
||||||
|
|
||||||
ESP_LOGI(TAG_RADIO, "Writing message");
|
|
||||||
sx1262_writeBuffer(0, (uint8_t *)msg, sizeof(msg));
|
|
||||||
|
|
||||||
ESP_LOGI(TAG_RADIO, "Clearing IRQs");
|
|
||||||
sx1262_clearIrqStatus(SX1262_IRQ_ALL);
|
|
||||||
|
|
||||||
// sx1262_setTxContinuousWave();
|
|
||||||
sx1262_get_status();
|
|
||||||
|
|
||||||
ESP_LOGI(TAG_RADIO, "Getting modulation type...");
|
|
||||||
modType = sx1262_getPacketType();
|
|
||||||
ESP_LOGI(TAG_RADIO, "ModType %d", modType);
|
|
||||||
sx1262_get_status();
|
|
||||||
|
|
||||||
// ESP_LOGI(TAG_RADIO, "Enabling CW...");
|
|
||||||
// sx1262_setTxContinuousWave();
|
|
||||||
// sx1262_get_status();
|
|
||||||
|
|
||||||
uint8_t txModulation[1] = {0x04};
|
|
||||||
|
|
||||||
ESP_LOGI(TAG_RADIO, "Setting modulation thing");
|
|
||||||
sx1262_writeRegister(SX126X_TX_MODULATION, txModulation, 1);
|
|
||||||
sx1262_get_status();
|
|
||||||
|
|
||||||
ESP_LOGI(TAG_RADIO, "Clearing IRQs");
|
|
||||||
sx1262_clearIrqStatus(SX1262_IRQ_ALL);
|
|
||||||
sx1262_get_status();
|
|
||||||
|
|
||||||
ESP_LOGI(TAG_RADIO, "Enabling TX...");
|
|
||||||
sx1262_setMode(SX1262_TRANSMIT_MODE, 0);
|
|
||||||
sx1262_get_status();
|
|
||||||
|
|
||||||
ESP_LOGI(TAG_RADIO, "Waiting for TX finish");
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
if (gpio_get_level(LORA_DIO1))
|
vTaskDelay(1);
|
||||||
{
|
|
||||||
ESP_LOGI(TAG_RADIO, "Got IRQin");
|
|
||||||
uint16_t irqS = sx1262_getIrqStatus();
|
|
||||||
if (irqS & SX1262_IRQ_TXDone)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
vTaskDelay(pdMS_TO_TICKS(10));
|
|
||||||
}
|
|
||||||
|
|
||||||
// vTaskDelay(pdMS_TO_TICKS(2000));
|
uint8_t spreadingFactor = 7;
|
||||||
// ESP_LOGI(TAG_RADIO, "Returning back to sleep");
|
uint8_t bandwidth = SX126X_LORA_BW_250_0;
|
||||||
// sx1262_setStandby(SX1262_STANDBY_XOSC);
|
uint8_t codingRate = SX126X_LORA_CR_4_8;
|
||||||
|
uint16_t preambleLength = 8;
|
||||||
|
uint8_t payloadLen = 0;
|
||||||
|
bool crcOn = true;
|
||||||
|
bool invertIrq = false;
|
||||||
|
LoRaConfig(spreadingFactor, bandwidth, codingRate, preambleLength, payloadLen, crcOn, invertIrq);
|
||||||
|
uint8_t bufIn[256]; // Maximum Payload size of SX1261/62/68 is 255
|
||||||
|
uint8_t bufOut[256]; // Maximum Payload size of SX1261/62/68 is 255
|
||||||
|
|
||||||
// sx1262_get_status();
|
DownBoundPacket downboundPacket;
|
||||||
|
UplinkPacket uplinkPacket;
|
||||||
|
SystemControlPacket systemControlPacket;
|
||||||
|
|
||||||
ESP_LOGI(TAG_RADIO, "Clearing IRQs");
|
|
||||||
sx1262_clearIrqStatus(SX1262_IRQ_TXDone);
|
|
||||||
|
|
||||||
sx1262_get_status();
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
vTaskDelay(pdMS_TO_TICKS(1000));
|
start_time = esp_timer_get_time(); // µs since boot
|
||||||
|
if (packetReadiness == 1)
|
||||||
|
{
|
||||||
|
uint8_t downPacketSize = 0;
|
||||||
|
memset(bufOut, 0, sizeof(bufOut));
|
||||||
|
downboundPacket.missionTimer = start_time;
|
||||||
|
downboundPacket.packetIndex = packetIndex++;
|
||||||
|
downboundPacket.packetType = 1;
|
||||||
|
|
||||||
|
memcpy(bufOut, &downboundPacket, sizeof(downboundPacket));
|
||||||
|
downPacketSize += sizeof(downboundPacket);
|
||||||
|
memcpy(((uint8_t *)bufOut) + downPacketSize, &telemetryPacket, sizeof(telemetryPacket));
|
||||||
|
downPacketSize += sizeof(telemetryPacket);
|
||||||
|
|
||||||
|
ESP_LOGI(pcTaskGetName(NULL), "%d byte packet sent...", downPacketSize);
|
||||||
|
|
||||||
|
// Wait for transmission to complete
|
||||||
|
if (LoRaSend(bufOut, downPacketSize, SX126x_TXMODE_SYNC) == false)
|
||||||
|
{
|
||||||
|
ESP_LOGE(pcTaskGetName(NULL), "LoRaSend fail");
|
||||||
|
} else {
|
||||||
|
packetReadiness = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set frequency to 868 MHz
|
uint8_t rxLen = LoRaReceive(bufIn, sizeof(bufIn));
|
||||||
|
if (rxLen > 0)
|
||||||
|
{
|
||||||
|
ESP_LOGI(pcTaskGetName(NULL), "%d byte packet received:[%.*s]", rxLen, rxLen, bufIn);
|
||||||
|
|
||||||
// Set TX power to 22 dBm
|
int8_t rssi, snr;
|
||||||
|
GetPacketStatus(&rssi, &snr);
|
||||||
|
ESP_LOGI(pcTaskGetName(NULL), "rssi=%d[dBm] snr=%d[dB]", rssi, snr);
|
||||||
|
}
|
||||||
|
|
||||||
// sx1262_setTxContinuousWave();
|
int lost = GetPacketLost();
|
||||||
|
if (lost != 0)
|
||||||
|
{
|
||||||
|
ESP_LOGW(pcTaskGetName(NULL), "%d packets lost", lost);
|
||||||
|
}
|
||||||
|
|
||||||
|
end_time = esp_timer_get_time();
|
||||||
|
elapsed = end_time - start_time;
|
||||||
|
|
||||||
|
if (elapsed < interval_us)
|
||||||
|
{
|
||||||
|
vTaskDelay(pdMS_TO_TICKS((interval_us - elapsed) / 1000));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@@ -9,6 +9,11 @@
|
|||||||
|
|
||||||
#define TAG_RADIO "RADIO"
|
#define TAG_RADIO "RADIO"
|
||||||
|
|
||||||
|
#include "packets.h"
|
||||||
|
|
||||||
void lora_comms_task(void *pvParameters);
|
void lora_comms_task(void *pvParameters);
|
||||||
|
|
||||||
|
extern TelemetryPacket telemetryPacket;
|
||||||
|
extern uint8_t packetReadiness;
|
||||||
|
|
||||||
#endif
|
#endif
|
@@ -1,4 +1,8 @@
|
|||||||
#include "sensors.h"
|
#include "sensors.h"
|
||||||
|
#include "esp_timer.h"
|
||||||
|
#include "radio.h"
|
||||||
|
#include "../hw/gps.h"
|
||||||
|
#include "servocontroller.h"
|
||||||
|
|
||||||
#define BLINK_GPIO 2
|
#define BLINK_GPIO 2
|
||||||
|
|
||||||
@@ -13,8 +17,9 @@ static void configure_led(void)
|
|||||||
void i2c_sensors_task(void *pvParameters)
|
void i2c_sensors_task(void *pvParameters)
|
||||||
{
|
{
|
||||||
// initialize the xLastWakeTime variable with the current time.
|
// initialize the xLastWakeTime variable with the current time.
|
||||||
TickType_t last_wake_time = xTaskGetTickCount();
|
const int64_t interval_us = 100000; // 100 ms
|
||||||
const TickType_t I2C0_TASK_SAMPLING_RATE = 5;
|
int64_t start_time, end_time, elapsed;
|
||||||
|
|
||||||
//
|
//
|
||||||
// initialize i2c device configuration
|
// initialize i2c device configuration
|
||||||
|
|
||||||
@@ -26,8 +31,8 @@ void i2c_sensors_task(void *pvParameters)
|
|||||||
mcp3550_spi_init();
|
mcp3550_spi_init();
|
||||||
configure_led();
|
configure_led();
|
||||||
|
|
||||||
int16_t accel[3], gyro[3], temp;
|
int16_t accel[3], gyro[3], temp, magnet[3];
|
||||||
float accel_f[3], gyro_f[3], temp_f;
|
float accel_f[3], gyro_f[3], temp_f, magnet_f[3];
|
||||||
|
|
||||||
uint16_t eCO2;
|
uint16_t eCO2;
|
||||||
uint16_t tvoc;
|
uint16_t tvoc;
|
||||||
@@ -38,30 +43,32 @@ void i2c_sensors_task(void *pvParameters)
|
|||||||
uint16_t current;
|
uint16_t current;
|
||||||
uint16_t power;
|
uint16_t power;
|
||||||
|
|
||||||
|
bme680_data_t bmeData;
|
||||||
// task loop entry point
|
// task loop entry point
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
|
packetReadiness = 2;
|
||||||
|
start_time = esp_timer_get_time(); // µs since boot
|
||||||
//
|
//
|
||||||
// handle sensor
|
// handle sensor
|
||||||
|
|
||||||
if (BME680_DEV_HANDLE)
|
if (BME680_DEV_HANDLE)
|
||||||
{
|
{
|
||||||
bme680_data_t data;
|
esp_err_t result = bme680_get_data(BME680_DEV_HANDLE, &bmeData);
|
||||||
esp_err_t result = bme680_get_data(BME680_DEV_HANDLE, &data);
|
|
||||||
if (result != ESP_OK)
|
if (result != ESP_OK)
|
||||||
{
|
{
|
||||||
ESP_LOGE(TAG_BME, "bme680 device read failed (%s)", esp_err_to_name(result));
|
ESP_LOGE(TAG_BME, "bme680 device read failed (%s)", esp_err_to_name(result));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
data.barometric_pressure = data.barometric_pressure / 100;
|
bmeData.barometric_pressure = bmeData.barometric_pressure / 100;
|
||||||
ESP_LOGI(TAG_BME, "dewpoint temperature:%.2f °C", data.dewpoint_temperature);
|
ESP_LOGI(TAG_BME, "dewpoint temperature:%.2f °C", bmeData.dewpoint_temperature);
|
||||||
ESP_LOGI(TAG_BME, "air temperature: %.2f °C", data.air_temperature);
|
ESP_LOGI(TAG_BME, "air temperature: %.2f °C", bmeData.air_temperature);
|
||||||
ESP_LOGI(TAG_BME, "relative humidity: %.2f %%", data.relative_humidity);
|
ESP_LOGI(TAG_BME, "relative humidity: %.2f %%", bmeData.relative_humidity);
|
||||||
ESP_LOGI(TAG_BME, "barometric pressure: %.2f hPa", data.barometric_pressure);
|
ESP_LOGI(TAG_BME, "barometric pressure: %.2f hPa", bmeData.barometric_pressure);
|
||||||
ccs811_set_env_data(data.air_temperature, data.relative_humidity);
|
ccs811_set_env_data(bmeData.air_temperature, bmeData.relative_humidity);
|
||||||
ESP_LOGI(TAG_BME, "gas resistance: %.2f kOhms", data.gas_resistance / 1000);
|
ESP_LOGI(TAG_BME, "gas resistance: %.2f kOhms", bmeData.gas_resistance / 1000);
|
||||||
ESP_LOGI(TAG_BME, "iaq score: %u (%s)", data.iaq_score, bme680_air_quality_to_string(data.iaq_score));
|
ESP_LOGI(TAG_BME, "iaq score: %u (%s)", bmeData.iaq_score, bme680_air_quality_to_string(bmeData.iaq_score));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -73,12 +80,13 @@ void i2c_sensors_task(void *pvParameters)
|
|||||||
ESP_LOGI(TAG_CCS, "eCO₂: %d ppm, TVOC: %d ppb", eCO2, tvoc);
|
ESP_LOGI(TAG_CCS, "eCO₂: %d ppm, TVOC: %d ppb", eCO2, tvoc);
|
||||||
ESP_LOGI(TAG_CCS, "Current: %d μA, Raw voltage: %d V", currentCCS, rawData);
|
ESP_LOGI(TAG_CCS, "Current: %d μA, Raw voltage: %d V", currentCCS, rawData);
|
||||||
|
|
||||||
if (mpu9250_read_sensor_data(MPU9250_DEV_HANDLE, accel, gyro, &temp) == ESP_OK)
|
if (mpu9250_read_sensor_data(MPU9250_DEV_HANDLE, accel, gyro, &temp, magnet) == ESP_OK)
|
||||||
{
|
{
|
||||||
mpu9250_convert_data(accel, gyro, temp, accel_f, gyro_f, &temp_f);
|
mpu9250_convert_data(accel, gyro, temp, magnet, accel_f, gyro_f, &temp_f, magnet_f);
|
||||||
|
|
||||||
ESP_LOGI(TAG_MPU, "Accel: X=%.2f g, Y=%.2f g, Z=%.2f g", accel_f[0], accel_f[1], accel_f[2]);
|
ESP_LOGI(TAG_MPU, "Accel: X=%.2f g, Y=%.2f g, Z=%.2f g", accel_f[0], accel_f[1], accel_f[2]);
|
||||||
ESP_LOGI(TAG_MPU, "Gyro: X=%.2f°/s, Y=%.2f°/s, Z=%.2f°/s", gyro_f[0], gyro_f[1], gyro_f[2]);
|
ESP_LOGI(TAG_MPU, "Gyro: X=%.2f°/s, Y=%.2f°/s, Z=%.2f°/s", gyro_f[0], gyro_f[1], gyro_f[2]);
|
||||||
|
ESP_LOGI(TAG_MPU, "Magnet: X=%.2fμT, Y=%.2fμT, Z=%.2fμT", magnet_f[0], magnet_f[1], magnet_f[2]);
|
||||||
ESP_LOGI(TAG_MPU, "Temperature: %.2f °C", temp_f);
|
ESP_LOGI(TAG_MPU, "Temperature: %.2f °C", temp_f);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -89,7 +97,7 @@ void i2c_sensors_task(void *pvParameters)
|
|||||||
ina260_readParams(&volts, ¤t, &power);
|
ina260_readParams(&volts, ¤t, &power);
|
||||||
ina260_printParams(volts, current, power);
|
ina260_printParams(volts, current, power);
|
||||||
|
|
||||||
float VREFVoltage = volts * 1.25 / 1000; //Mame vobec nieco na VREFE? Na scheme su len medzi sebou prepojene
|
float VREFVoltage = volts * 1.25 / 1000; // Mame vobec nieco na VREFE? Na scheme su len medzi sebou prepojene
|
||||||
|
|
||||||
mics_adc_data_t ADCData = mcp3550_read_all(5.0); // vref = 5.0V
|
mics_adc_data_t ADCData = mcp3550_read_all(5.0); // vref = 5.0V
|
||||||
log_mics_adc_values(&ADCData);
|
log_mics_adc_values(&ADCData);
|
||||||
@@ -101,7 +109,74 @@ void i2c_sensors_task(void *pvParameters)
|
|||||||
gpio_set_level(BLINK_GPIO, s_led_state);
|
gpio_set_level(BLINK_GPIO, s_led_state);
|
||||||
/* Toggle the LED state */
|
/* Toggle the LED state */
|
||||||
s_led_state = !s_led_state;
|
s_led_state = !s_led_state;
|
||||||
vTaskDelaySecUntil(&last_wake_time, I2C0_TASK_SAMPLING_RATE);
|
end_time = esp_timer_get_time();
|
||||||
|
elapsed = end_time - start_time;
|
||||||
|
|
||||||
|
if (elapsed < interval_us)
|
||||||
|
{
|
||||||
|
vTaskDelay(pdMS_TO_TICKS((interval_us - elapsed) / 1000));
|
||||||
|
}
|
||||||
|
if (packetReadiness == 0) {
|
||||||
|
memset(&telemetryPacket, 0, sizeof(telemetryPacket));
|
||||||
|
telemetryPacket.accelerationX = accel[0];
|
||||||
|
telemetryPacket.accelerationY = accel[1];
|
||||||
|
telemetryPacket.accelerationZ = accel[2];
|
||||||
|
|
||||||
|
telemetryPacket.gyroX = gyro[0];
|
||||||
|
telemetryPacket.gyroX = gyro[1];
|
||||||
|
telemetryPacket.gyroX = gyro[2];
|
||||||
|
|
||||||
|
telemetryPacket.magnetX = gyro[0];
|
||||||
|
telemetryPacket.magnetX = gyro[1];
|
||||||
|
telemetryPacket.magnetX = gyro[2];
|
||||||
|
|
||||||
|
telemetryPacket.accelerometer_temperature = temp;
|
||||||
|
|
||||||
|
telemetryPacket.eCO2 = eCO2;
|
||||||
|
telemetryPacket.tvoc = tvoc;
|
||||||
|
telemetryPacket.currentCCS = currentCCS;
|
||||||
|
telemetryPacket.rawCCSData = rawData;
|
||||||
|
|
||||||
|
telemetryPacket.volts = volts;
|
||||||
|
telemetryPacket.current = current;
|
||||||
|
telemetryPacket.power = power;
|
||||||
|
|
||||||
|
|
||||||
|
telemetryPacket.temperature = bmeData.raw_data.temperature;
|
||||||
|
telemetryPacket.humidity = bmeData.raw_data.humidity;
|
||||||
|
telemetryPacket.pressure = bmeData.raw_data.pressure;
|
||||||
|
telemetryPacket.gas = bmeData.raw_data.gas;
|
||||||
|
telemetryPacket.gas_range = bmeData.raw_data.gas_range;
|
||||||
|
telemetryPacket.heater_stable = bmeData.raw_data.heater_stable;
|
||||||
|
telemetryPacket.gas_valid = bmeData.raw_data.gas_valid;
|
||||||
|
|
||||||
|
telemetryPacket.NH3 = ADCData.raw_nh3;
|
||||||
|
telemetryPacket.CO = ADCData.raw_co;
|
||||||
|
telemetryPacket.NO2 = ADCData.raw_no2;
|
||||||
|
telemetryPacket.UVC = ADCData.raw_uvc;
|
||||||
|
|
||||||
|
//TODO MOVE THIS TO A BETTER PLACE FOR SYNC
|
||||||
|
telemetryPacket.time_seconds = gpsDataOut.time_seconds;
|
||||||
|
telemetryPacket.latitude_centi_degrees = gpsDataOut.latitude_centi_degrees;
|
||||||
|
telemetryPacket.longitude_centi_degrees = gpsDataOut.longitude_centi_degrees;
|
||||||
|
telemetryPacket.fix_quality = gpsDataOut.fix_quality;
|
||||||
|
telemetryPacket.num_satellites = gpsDataOut.num_satellites;
|
||||||
|
telemetryPacket.altitude_centi_meters = gpsDataOut.altitude_centi_meters;
|
||||||
|
telemetryPacket.date_yyddmm = gpsDataOut.date_yyddmm;
|
||||||
|
telemetryPacket.speed_centi_knots = gpsDataOut.speed_centi_knots;
|
||||||
|
|
||||||
|
telemetryPacket.predicted_altitude_centi_meters = predictedPosition.altitude_centi_meters;
|
||||||
|
telemetryPacket.predicted_latitude_centi_degrees = predictedPosition.latitude_centi_degrees;
|
||||||
|
telemetryPacket.predicted_longitude_centi_degrees = predictedPosition.longitude_centi_degrees;
|
||||||
|
|
||||||
|
telemetryPacket.targetServoA = servoState.targetServoA;
|
||||||
|
telemetryPacket.targetServoB = servoState.targetServoB;
|
||||||
|
telemetryPacket.currentServoA = servoState.currentServoA;
|
||||||
|
telemetryPacket.currentServoB = servoState.currentServoB;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
packetReadiness = 1;
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
// free resources
|
// free resources
|
||||||
|
10
main/components/servocontroller.c
Normal file
10
main/components/servocontroller.c
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
#include "servocontroller.h"
|
||||||
|
#include "string.h"
|
||||||
|
|
||||||
|
ServoState servoState;
|
||||||
|
|
||||||
|
//TODO add a task and implement
|
||||||
|
|
||||||
|
void servoControllerInit() {
|
||||||
|
memset(&servoState, 0, sizeof(servoState));
|
||||||
|
}
|
19
main/components/servocontroller.h
Normal file
19
main/components/servocontroller.h
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
#ifndef SERVO_CONTROLLER_COMPONENT
|
||||||
|
#define SERVO_CONTROLLER_COMPONENT
|
||||||
|
|
||||||
|
#include "stdint.h"
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int16_t currentServoA;
|
||||||
|
int16_t targetServoA;
|
||||||
|
int16_t currentServoB;
|
||||||
|
int16_t targetServoB;
|
||||||
|
} ServoState;
|
||||||
|
|
||||||
|
|
||||||
|
extern ServoState servoState;
|
||||||
|
|
||||||
|
void servoControllerInit();
|
||||||
|
|
||||||
|
#endif
|
108
main/hw/gps.c
108
main/hw/gps.c
@@ -9,11 +9,15 @@
|
|||||||
#define BUF_SIZE 1024
|
#define BUF_SIZE 1024
|
||||||
#define GPS_LINE_MAX_LEN 128
|
#define GPS_LINE_MAX_LEN 128
|
||||||
|
|
||||||
|
gps_binary_struct_t gpsDataOut;
|
||||||
static QueueHandle_t uart_queue;
|
static QueueHandle_t uart_queue;
|
||||||
|
|
||||||
|
predicted_binary_position_struct_t predictedPosition;
|
||||||
|
|
||||||
// Initializes UART for GPS
|
// Initializes UART for GPS
|
||||||
void gps_init()
|
void gps_init()
|
||||||
{
|
{
|
||||||
|
memset(&gpsDataOut, 0, sizeof(gpsDataOut));
|
||||||
uart_config_t uart_config = {
|
uart_config_t uart_config = {
|
||||||
.baud_rate = 9600,
|
.baud_rate = 9600,
|
||||||
.data_bits = UART_DATA_8_BITS,
|
.data_bits = UART_DATA_8_BITS,
|
||||||
@@ -49,9 +53,12 @@ void gps_task(void *arg)
|
|||||||
|
|
||||||
if (strstr(line, "$GPGGA") == line) {
|
if (strstr(line, "$GPGGA") == line) {
|
||||||
parse_gpgga(line);
|
parse_gpgga(line);
|
||||||
|
parse_gpgga_to_struct(line, &gpsDataOut);
|
||||||
} else if (strstr(line, "$GPRMC") == line) {
|
} else if (strstr(line, "$GPRMC") == line) {
|
||||||
parse_gprmc(line);
|
parse_gprmc(line);
|
||||||
|
parse_gprmc_to_struct(line, &gpsDataOut);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
line_pos = 0;
|
line_pos = 0;
|
||||||
@@ -134,3 +141,104 @@ void parse_gprmc(const char *nmea)
|
|||||||
date, utc_time, lat, lat_dir, lon, lon_dir, speed_knots, status);
|
date, utc_time, lat, lat_dir, lon, lon_dir, speed_knots, status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Function to convert time string (hhmmss.sss) to seconds since start of day
|
||||||
|
static uint32_t time_to_seconds_struct(const char *time_str) {
|
||||||
|
if (time_str == NULL || strlen(time_str) < 6) return 0;
|
||||||
|
uint32_t hours = (time_str[0] - '0') * 10 + (time_str[1] - '0');
|
||||||
|
uint32_t minutes = (time_str[2] - '0') * 10 + (time_str[3] - '0');
|
||||||
|
uint32_t seconds = (time_str[4] - '0') * 10 + (time_str[5] - '0');
|
||||||
|
return hours * 3600 + minutes * 60 + seconds;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to convert DMS (degrees minutes.decimalminutes) to centi-degrees
|
||||||
|
static int32_t dms_to_centi_degrees_struct(const char *dms_str, const char *direction) {
|
||||||
|
if (dms_str == NULL || direction == NULL || strlen(dms_str) < 7) return 0;
|
||||||
|
char degrees_str[4] = {0};
|
||||||
|
char minutes_decimal_str[10] = {0};
|
||||||
|
strncpy(degrees_str, dms_str, 2);
|
||||||
|
strncpy(minutes_decimal_str, dms_str + 2, strlen(dms_str) - 2);
|
||||||
|
double degrees = atof(degrees_str);
|
||||||
|
double minutes = atof(minutes_decimal_str);
|
||||||
|
double decimal_degrees = degrees + (minutes / 60.0);
|
||||||
|
if (direction[0] == 'S' || direction[0] == 'W') {
|
||||||
|
decimal_degrees *= -1.0;
|
||||||
|
}
|
||||||
|
return (int32_t)(decimal_degrees * 10000);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to convert altitude string to centi-meters
|
||||||
|
static int16_t altitude_to_centi_meters_struct(const char *alt_str) {
|
||||||
|
if (alt_str == NULL) return 0;
|
||||||
|
return (int16_t)(atof(alt_str) * 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to convert speed from knots to centi-knots
|
||||||
|
static uint16_t speed_to_centi_knots_struct(const char *speed_str) {
|
||||||
|
if (speed_str == NULL) return 0;
|
||||||
|
return (uint16_t)(atof(speed_str) * 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to convert date string (ddmmyy) to yymmdd integer
|
||||||
|
static uint16_t date_to_yyddmm_struct(const char *date_str) {
|
||||||
|
if (date_str == NULL || strlen(date_str) != 6) return 0;
|
||||||
|
uint16_t day = (date_str[0] - '0') * 10 + (date_str[1] - '0');
|
||||||
|
uint16_t month = (date_str[2] - '0') * 10 + (date_str[3] - '0');
|
||||||
|
uint16_t year_short = (date_str[4] - '0') * 10 + (date_str[5] - '0');
|
||||||
|
// Assuming year is in the 21st century for simplicity
|
||||||
|
return (2000 + year_short) * 10000 + month * 100 + day;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to parse GPGGA NMEA string and return the struct
|
||||||
|
void parse_gpgga_to_struct(const char *nmea, gps_binary_struct_t *data)
|
||||||
|
{
|
||||||
|
char *fields[15];
|
||||||
|
char temp[GPS_LINE_MAX_LEN];
|
||||||
|
strncpy(temp, nmea, GPS_LINE_MAX_LEN);
|
||||||
|
temp[GPS_LINE_MAX_LEN - 1] = '\0';
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
char *token = strtok(temp, ",");
|
||||||
|
while (token != NULL && i < 15) {
|
||||||
|
fields[i++] = token;
|
||||||
|
token = strtok(NULL, ",");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i >= 10) {
|
||||||
|
data->time_seconds = time_to_seconds_struct(fields[1]);
|
||||||
|
data->latitude_centi_degrees = dms_to_centi_degrees_struct(fields[2], fields[3]);
|
||||||
|
data->longitude_centi_degrees = dms_to_centi_degrees_struct(fields[4], fields[5]);
|
||||||
|
data->fix_quality = atoi(fields[6]);
|
||||||
|
data->num_satellites = atoi(fields[7]);
|
||||||
|
data->altitude_centi_meters = altitude_to_centi_meters_struct(fields[9]);
|
||||||
|
} else {
|
||||||
|
ESP_LOGW(TAG, "GPGGA: Not enough fields to parse struct");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to parse GPRMC NMEA string and return the struct
|
||||||
|
void parse_gprmc_to_struct(const char *nmea, gps_binary_struct_t *data)
|
||||||
|
{
|
||||||
|
char *fields[13];
|
||||||
|
char temp[GPS_LINE_MAX_LEN];
|
||||||
|
strncpy(temp, nmea, GPS_LINE_MAX_LEN);
|
||||||
|
temp[GPS_LINE_MAX_LEN - 1] = '\0';
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
char *token = strtok(temp, ",");
|
||||||
|
while (token != NULL && i < 13) {
|
||||||
|
fields[i++] = token;
|
||||||
|
token = strtok(NULL, ",");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i >= 12) {
|
||||||
|
data->time_seconds = time_to_seconds_struct(fields[1]);
|
||||||
|
data->latitude_centi_degrees = dms_to_centi_degrees_struct(fields[3], fields[4]);
|
||||||
|
data->longitude_centi_degrees = dms_to_centi_degrees_struct(fields[5], fields[6]);
|
||||||
|
data->date_yyddmm = date_to_yyddmm_struct(fields[9]);
|
||||||
|
data->speed_centi_knots = speed_to_centi_knots_struct(fields[7]);
|
||||||
|
// Fix quality and num_satellites are typically in GPGGA, so they might be 0 here.
|
||||||
|
} else {
|
||||||
|
ESP_LOGW(TAG, "GPRMC: Not enough fields to parse struct");
|
||||||
|
}
|
||||||
|
}
|
@@ -5,10 +5,35 @@
|
|||||||
#include "soc/uart_struct.h"
|
#include "soc/uart_struct.h"
|
||||||
#include "buscfg.h"
|
#include "buscfg.h"
|
||||||
|
|
||||||
|
// Structure to hold parsed GPS data in a compact binary format
|
||||||
|
typedef struct {
|
||||||
|
uint32_t time_seconds; // Seconds since start of day
|
||||||
|
int32_t latitude_centi_degrees; // Latitude * 10,000
|
||||||
|
int32_t longitude_centi_degrees; // Longitude * 10,000
|
||||||
|
uint8_t fix_quality;
|
||||||
|
uint8_t num_satellites;
|
||||||
|
int16_t altitude_centi_meters; // Altitude * 100
|
||||||
|
uint16_t date_yyddmm; // YYDDMM (from GPRMC)
|
||||||
|
uint16_t speed_centi_knots; // Speed * 100 (from GPRMC)
|
||||||
|
} gps_binary_struct_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int32_t latitude_centi_degrees; // Latitude * 10,000
|
||||||
|
int32_t longitude_centi_degrees; // Longitude * 10,000
|
||||||
|
int16_t altitude_centi_meters; // Altitude * 100
|
||||||
|
} predicted_binary_position_struct_t;
|
||||||
|
|
||||||
|
extern gps_binary_struct_t gpsDataOut;
|
||||||
|
|
||||||
|
extern predicted_binary_position_struct_t predictedPosition;
|
||||||
|
|
||||||
void gps_task(void *arg);
|
void gps_task(void *arg);
|
||||||
void parse_gpgga(const char *nmea);
|
void parse_gpgga(const char *nmea);
|
||||||
void parse_gprmc(const char *nmea);
|
void parse_gprmc(const char *nmea);
|
||||||
|
|
||||||
|
void parse_gprmc_to_struct(const char *nmea, gps_binary_struct_t *data);
|
||||||
|
void parse_gpgga_to_struct(const char *nmea, gps_binary_struct_t *data);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
@@ -1,4 +1,5 @@
|
|||||||
#include "mpu9250.h"
|
#include "mpu9250.h"
|
||||||
|
#include "esp_timer.h"
|
||||||
|
|
||||||
i2c_device_config_t MPU9250_DEV_CFG = {
|
i2c_device_config_t MPU9250_DEV_CFG = {
|
||||||
.dev_addr_length = I2C_ADDR_BIT_LEN_7,
|
.dev_addr_length = I2C_ADDR_BIT_LEN_7,
|
||||||
@@ -6,9 +7,11 @@ i2c_device_config_t MPU9250_DEV_CFG = {
|
|||||||
.scl_speed_hz = 100000,
|
.scl_speed_hz = 100000,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define MAG_SCALE (4912.0f / 32760.0f)
|
||||||
|
|
||||||
i2c_master_dev_handle_t MPU9250_DEV_HANDLE;
|
i2c_master_dev_handle_t MPU9250_DEV_HANDLE;
|
||||||
|
|
||||||
esp_err_t mpu9250_read_sensor_data(i2c_master_dev_handle_t dev_handle, int16_t *accel, int16_t *gyro, int16_t *temp)
|
esp_err_t mpu9250_read_sensor_data(i2c_master_dev_handle_t dev_handle, int16_t *accel, int16_t *gyro, int16_t *temp, int16_t *magnet)
|
||||||
{
|
{
|
||||||
uint8_t buffer[14]; // 6 (Accel) + 2 (Temp) + 6 (Gyro)
|
uint8_t buffer[14]; // 6 (Accel) + 2 (Temp) + 6 (Gyro)
|
||||||
esp_err_t ret = i2c_read_register(dev_handle, 0x3B, buffer, 14);
|
esp_err_t ret = i2c_read_register(dev_handle, 0x3B, buffer, 14);
|
||||||
@@ -20,14 +23,24 @@ esp_err_t mpu9250_read_sensor_data(i2c_master_dev_handle_t dev_handle, int16_t *
|
|||||||
accel[1] = (((uint16_t)(buffer[2] & 0xFF)) << 8) | (buffer[3] & 0xFF); // Accel Y
|
accel[1] = (((uint16_t)(buffer[2] & 0xFF)) << 8) | (buffer[3] & 0xFF); // Accel Y
|
||||||
accel[2] = (((uint16_t)(buffer[4] & 0xFF)) << 8) | (buffer[5] & 0xFF); // Accel Z
|
accel[2] = (((uint16_t)(buffer[4] & 0xFF)) << 8) | (buffer[5] & 0xFF); // Accel Z
|
||||||
*temp = (((uint16_t)(buffer[6] & 0xFF)) << 8) | (buffer[7] & 0xFF); // Temperature
|
*temp = (((uint16_t)(buffer[6] & 0xFF)) << 8) | (buffer[7] & 0xFF); // Temperature
|
||||||
gyro[0] = (((uint16_t)(buffer[8] & 0xFF)) << 8) | (buffer[9] & 0xFF);; // Gyro X
|
gyro[0] = (((uint16_t)(buffer[8] & 0xFF)) << 8) | (buffer[9] & 0xFF);
|
||||||
gyro[1] = (((uint16_t)(buffer[10] & 0xFF)) << 8) | (buffer[11] & 0xFF);; // Gyro Y
|
; // Gyro X
|
||||||
gyro[2] = (((uint16_t)(buffer[12] & 0xFF)) << 8) | (buffer[13] & 0xFF);; // Gyro Z
|
gyro[1] = (((uint16_t)(buffer[10] & 0xFF)) << 8) | (buffer[11] & 0xFF);
|
||||||
|
; // Gyro Y
|
||||||
|
gyro[2] = (((uint16_t)(buffer[12] & 0xFF)) << 8) | (buffer[13] & 0xFF);
|
||||||
|
; // Gyro Z
|
||||||
|
|
||||||
|
ret = i2c_read_register(dev_handle, 0x03, buffer, 6);
|
||||||
|
if (ret != ESP_OK)
|
||||||
|
return ret;
|
||||||
|
magnet[0] = (((uint16_t)(buffer[0] & 0xFF)) << 8) | (buffer[1] & 0xFF); // Magnet X
|
||||||
|
magnet[1] = (((uint16_t)(buffer[2] & 0xFF)) << 8) | (buffer[3] & 0xFF); // Magnet Y
|
||||||
|
magnet[2] = (((uint16_t)(buffer[4] & 0xFF)) << 8) | (buffer[5] & 0xFF); // Magnet Z
|
||||||
|
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mpu9250_convert_data(int16_t *accel, int16_t *gyro, int16_t temp, float *accel_out, float *gyro_out, float *temp_out)
|
void mpu9250_convert_data(int16_t *accel, int16_t *gyro, int16_t temp, int16_t *magnet, float *accel_out, float *gyro_out, float *temp_out, float *magnet_out)
|
||||||
{
|
{
|
||||||
accel_out[0] = accel[0] / 16384.0; // Accel X in g
|
accel_out[0] = accel[0] / 16384.0; // Accel X in g
|
||||||
accel_out[1] = accel[1] / 16384.0; // Accel Y in g
|
accel_out[1] = accel[1] / 16384.0; // Accel Y in g
|
||||||
@@ -37,10 +50,16 @@ void mpu9250_convert_data(int16_t *accel, int16_t *gyro, int16_t temp, float *ac
|
|||||||
gyro_out[1] = gyro[1] / 131.0; // Gyro Y in deg/s
|
gyro_out[1] = gyro[1] / 131.0; // Gyro Y in deg/s
|
||||||
gyro_out[2] = gyro[2] / 131.0; // Gyro Z in deg/s
|
gyro_out[2] = gyro[2] / 131.0; // Gyro Z in deg/s
|
||||||
|
|
||||||
|
magnet_out[0] = magnet[0] * MAG_SCALE; // Gyro X in deg/s
|
||||||
|
magnet_out[1] = magnet[1] * MAG_SCALE; // Gyro Y in deg/s
|
||||||
|
magnet_out[2] = magnet[2] * MAG_SCALE; // Gyro Z in deg/s
|
||||||
|
|
||||||
*temp_out = (temp / 333.87) + 21.0; // Temperature in °C
|
*temp_out = (temp / 333.87) + 21.0; // Temperature in °C
|
||||||
}
|
}
|
||||||
|
|
||||||
void mpu9250_init() {
|
void mpu9250_init()
|
||||||
|
{
|
||||||
ESP_ERROR_CHECK(i2c_master_bus_add_device(i2c0_bus_hdl, &MPU9250_DEV_CFG, &MPU9250_DEV_HANDLE));
|
ESP_ERROR_CHECK(i2c_master_bus_add_device(i2c0_bus_hdl, &MPU9250_DEV_CFG, &MPU9250_DEV_HANDLE));
|
||||||
i2c_write_register_16(MPU9250_DEV_HANDLE, 0x6B, 0x0001); // zapni uz tu hovadinu
|
i2c_write_register_16(MPU9250_DEV_HANDLE, 0x6B, 0x0001); // zapni uz tu hovadinu
|
||||||
|
i2c_write_register_16(MPU9250_DEV_HANDLE, 0x0A, 0x0012); // zapni uz tu hovadinu
|
||||||
}
|
}
|
@@ -8,8 +8,8 @@ extern i2c_device_config_t MPU9250_DEV_CFG;
|
|||||||
extern i2c_master_dev_handle_t MPU9250_DEV_HANDLE;
|
extern i2c_master_dev_handle_t MPU9250_DEV_HANDLE;
|
||||||
|
|
||||||
|
|
||||||
esp_err_t mpu9250_read_sensor_data(i2c_master_dev_handle_t dev_handle, int16_t *accel, int16_t *gyro, int16_t *temp);
|
esp_err_t mpu9250_read_sensor_data(i2c_master_dev_handle_t dev_handle, int16_t *accel, int16_t *gyro, int16_t *temp, int16_t *magnet);
|
||||||
void mpu9250_convert_data(int16_t *accel, int16_t *gyro, int16_t temp, float *accel_out, float *gyro_out, float *temp_out);
|
void mpu9250_convert_data(int16_t *accel, int16_t *gyro, int16_t temp, int16_t *magnet, float *accel_out, float *gyro_out, float *temp_out, float *magnet_out);
|
||||||
void mpu9250_init();
|
void mpu9250_init();
|
||||||
|
|
||||||
#endif
|
#endif
|
1412
main/hw/sx1262.c
1412
main/hw/sx1262.c
File diff suppressed because it is too large
Load Diff
672
main/hw/sx1262.h
672
main/hw/sx1262.h
@@ -1,330 +1,434 @@
|
|||||||
#ifndef SX1262_H
|
#ifndef _RA01S_H
|
||||||
#define SX1262_H
|
#define _RA01S_H
|
||||||
|
|
||||||
#include "driver/spi_master.h"
|
#include "driver/spi_master.h"
|
||||||
#include "driver/gpio.h"
|
|
||||||
#include <stdint.h>
|
|
||||||
#include "buscfg.h"
|
|
||||||
#include "mcp23018.h"
|
|
||||||
|
|
||||||
#include <string.h>
|
//return values
|
||||||
|
#define ERR_NONE 0
|
||||||
|
#define ERR_PACKET_TOO_LONG 1
|
||||||
|
#define ERR_UNKNOWN 2
|
||||||
|
#define ERR_TX_TIMEOUT 3
|
||||||
|
#define ERR_RX_TIMEOUT 4
|
||||||
|
#define ERR_CRC_MISMATCH 5
|
||||||
|
#define ERR_WRONG_MODEM 6
|
||||||
|
#define ERR_INVALID_BANDWIDTH 7
|
||||||
|
#define ERR_INVALID_SPREADING_FACTOR 8
|
||||||
|
#define ERR_INVALID_CODING_RATE 9
|
||||||
|
#define ERR_INVALID_FREQUENCY_DEVIATION 10
|
||||||
|
#define ERR_INVALID_BIT_RATE 11
|
||||||
|
#define ERR_INVALID_RX_BANDWIDTH 12
|
||||||
|
#define ERR_INVALID_DATA_SHAPING 13
|
||||||
|
#define ERR_INVALID_SYNC_WORD 14
|
||||||
|
#define ERR_INVALID_OUTPUT_POWER 15
|
||||||
|
#define ERR_INVALID_MODE 16
|
||||||
|
#define ERR_INVALID_TRANCEIVER 17
|
||||||
|
#define ERR_INVALID_SETRX_STATE 18
|
||||||
|
#define ERR_INVALID_SETTX_STATE 19
|
||||||
|
#define ERR_IDLE_TIMEOUT 20
|
||||||
|
#define ERR_SPI_TRANSACTION 21
|
||||||
|
|
||||||
#include "esp_task.h"
|
// SX126X physical layer properties
|
||||||
|
#define XTAL_FREQ ( double )32000000
|
||||||
|
#define FREQ_DIV ( double )pow( 2.0, 25.0 )
|
||||||
|
#define FREQ_STEP ( double )( XTAL_FREQ / FREQ_DIV )
|
||||||
|
|
||||||
#define TAG "SX1262"
|
#define LOW 0
|
||||||
|
#define HIGH 1
|
||||||
|
#define BUSY_WAIT 5000
|
||||||
|
|
||||||
#define LOG_LOCAL_LEVEL ESP_LOG_DEBUG
|
// SX126X Model
|
||||||
#include "esp_log.h"
|
#define SX1261_TRANCEIVER 0x01
|
||||||
|
#define SX1262_TRANCEIVER 0x02
|
||||||
|
#define SX1268_TRANCEIVER 0x08
|
||||||
|
|
||||||
#define LOG_LOCAL_LEVEL ESP_LOG_DEBUG
|
// SX126X SPI commands
|
||||||
|
// operational modes commands
|
||||||
|
#define SX126X_CMD_NOP 0x00
|
||||||
|
#define SX126X_CMD_SET_SLEEP 0x84
|
||||||
|
#define SX126X_CMD_SET_STANDBY 0x80
|
||||||
|
#define SX126X_CMD_SET_FS 0xC1
|
||||||
|
#define SX126X_CMD_SET_TX 0x83
|
||||||
|
#define SX126X_CMD_SET_RX 0x82
|
||||||
|
#define SX126X_CMD_STOP_TIMER_ON_PREAMBLE 0x9F
|
||||||
|
#define SX126X_CMD_SET_RX_DUTY_CYCLE 0x94
|
||||||
|
#define SX126X_CMD_SET_CAD 0xC5
|
||||||
|
#define SX126X_CMD_SET_TX_CONTINUOUS_WAVE 0xD1
|
||||||
|
#define SX126X_CMD_SET_TX_INFINITE_PREAMBLE 0xD2
|
||||||
|
#define SX126X_CMD_SET_REGULATOR_MODE 0x96
|
||||||
|
#define SX126X_CMD_CALIBRATE 0x89
|
||||||
|
#define SX126X_CMD_CALIBRATE_IMAGE 0x98
|
||||||
|
#define SX126X_CMD_SET_PA_CONFIG 0x95
|
||||||
|
#define SX126X_CMD_SET_RX_TX_FALLBACK_MODE 0x93
|
||||||
|
|
||||||
#define LORA_SPI_HOST SPI3_HOST
|
// register and buffer access commands
|
||||||
|
#define SX126X_CMD_WRITE_REGISTER 0x0D
|
||||||
|
#define SX126X_CMD_READ_REGISTER 0x1D
|
||||||
|
#define SX126X_CMD_WRITE_BUFFER 0x0E
|
||||||
|
#define SX126X_CMD_READ_BUFFER 0x1E
|
||||||
|
|
||||||
extern spi_device_handle_t spi;
|
// DIO and IRQ control
|
||||||
|
#define SX126X_CMD_SET_DIO_IRQ_PARAMS 0x08
|
||||||
|
#define SX126X_CMD_GET_IRQ_STATUS 0x12
|
||||||
|
#define SX126X_CMD_CLEAR_IRQ_STATUS 0x02
|
||||||
|
#define SX126X_CMD_SET_DIO2_AS_RF_SWITCH_CTRL 0x9D
|
||||||
|
#define SX126X_CMD_SET_DIO3_AS_TCXO_CTRL 0x97
|
||||||
|
|
||||||
typedef struct
|
// RF, modulation and packet commands
|
||||||
{
|
#define SX126X_CMD_SET_RF_FREQUENCY 0x86
|
||||||
uint8_t status;
|
#define SX126X_CMD_SET_PACKET_TYPE 0x8A
|
||||||
uint16_t error;
|
#define SX126X_CMD_GET_PACKET_TYPE 0x11
|
||||||
} sx1262_status_t;
|
#define SX126X_CMD_SET_TX_PARAMS 0x8E
|
||||||
|
#define SX126X_CMD_SET_MODULATION_PARAMS 0x8B
|
||||||
|
#define SX126X_CMD_SET_PACKET_PARAMS 0x8C
|
||||||
|
#define SX126X_CMD_SET_CAD_PARAMS 0x88
|
||||||
|
#define SX126X_CMD_SET_BUFFER_BASE_ADDRESS 0x8F
|
||||||
|
#define SX126X_CMD_SET_LORA_SYMB_NUM_TIMEOUT 0xA0
|
||||||
|
|
||||||
typedef struct
|
#define SX126X_PA_CONFIG_SX1261 0x01
|
||||||
{
|
#define SX126X_PA_CONFIG_SX1262 0x00
|
||||||
uint16_t preambleLength;
|
|
||||||
uint8_t headerType;
|
|
||||||
uint8_t payloadLength;
|
|
||||||
uint8_t crcType;
|
|
||||||
uint8_t invertIQ;
|
|
||||||
} sx1262_LoRaPacketParams_t;
|
|
||||||
|
|
||||||
#define SX126X_DIOX_OUTPUT_ENABLE 0x0580
|
// status commands
|
||||||
#define SX126X_DIOX_INPUT_ENABLE 0x0583
|
#define SX126X_CMD_GET_STATUS 0xC0
|
||||||
#define SX126X_DIOX_PULL_UP_CONTROL 0x0584
|
#define SX126X_CMD_GET_RSSI_INST 0x15
|
||||||
#define SX126X_DIOX_PULL_DOWN_CONTROL 0x0585
|
#define SX126X_CMD_GET_RX_BUFFER_STATUS 0x13
|
||||||
|
#define SX126X_CMD_GET_PACKET_STATUS 0x14
|
||||||
|
#define SX126X_CMD_GET_DEVICE_ERRORS 0x17
|
||||||
|
#define SX126X_CMD_CLEAR_DEVICE_ERRORS 0x07
|
||||||
|
#define SX126X_CMD_GET_STATS 0x10
|
||||||
|
#define SX126X_CMD_RESET_STATS 0x00
|
||||||
|
|
||||||
#define SX126X_WHITENING_INIT_MSB 0x06B8
|
|
||||||
#define SX126X_WHITENING_INIT_LSB 0x06B9
|
|
||||||
|
|
||||||
#define SX126X_CRC_INIT_MSB 0x06BC
|
// SX126X register map
|
||||||
#define SX126X_CRC_INIT_LSB 0x06BD
|
#define SX126X_REG_HOPPING_ENABLE 0x0385
|
||||||
|
#define SX126X_REG_PACKECT_LENGTH 0x0386
|
||||||
|
#define SX126X_REG_NB_HOPPING_BLOCKS 0x0387
|
||||||
|
#define SX126X_REG_NB_SYMBOLS0 0x0388
|
||||||
|
#define SX126X_REG_FREQ0 0x038A
|
||||||
|
#define SX126X_REG_NB_SYMBOLS15 0x03E2
|
||||||
|
#define SX126X_REG_FREQ15 0x03E4
|
||||||
|
#define SX126X_REG_DIOX_OUTPUT_ENABLE 0x0580
|
||||||
|
#define SX126X_REG_DIOX_INPUT_ENABLE 0x0583
|
||||||
|
#define SX126X_REG_DIOX_PILL_UP_CONTROL 0x0584
|
||||||
|
#define SX126X_REG_DIOX_PULL_DOWN_CONTROL 0x0585
|
||||||
|
#define SX126X_REG_WHITENING_INITIAL_MSB 0x06B8
|
||||||
|
#define SX126X_REG_WHITENING_INITIAL_LSB 0x06B9
|
||||||
|
#define SX126X_REG_CRC_INITIAL_MSB 0x06BC
|
||||||
|
#define SX126X_REG_CRC_INITIAL_LSB 0x06BD
|
||||||
|
#define SX126X_REG_CRC_POLYNOMIAL_MSB 0x06BE
|
||||||
|
#define SX126X_REG_CRC_POLYNOMIAL_LSB 0x06BF
|
||||||
|
#define SX126X_REG_SYNC_WORD_0 0x06C0
|
||||||
|
#define SX126X_REG_SYNC_WORD_1 0x06C1
|
||||||
|
#define SX126X_REG_SYNC_WORD_2 0x06C2
|
||||||
|
#define SX126X_REG_SYNC_WORD_3 0x06C3
|
||||||
|
#define SX126X_REG_SYNC_WORD_4 0x06C4
|
||||||
|
#define SX126X_REG_SYNC_WORD_5 0x06C5
|
||||||
|
#define SX126X_REG_SYNC_WORD_6 0x06C6
|
||||||
|
#define SX126X_REG_SYNC_WORD_7 0x06C7
|
||||||
|
#define SX126X_REG_NODE_ADDRESS 0x06CD
|
||||||
|
#define SX126X_REG_BROADCAST_ADDRESS 0x06CE
|
||||||
|
#define SX126X_REG_IQ_POLARITY_SETUP 0x0736
|
||||||
|
#define SX126X_REG_LORA_SYNC_WORD_MSB 0x0740
|
||||||
|
#define SX126X_REG_LORA_SYNC_WORD_LSB 0x0741
|
||||||
|
#define SX126X_REG_RANDOM_NUMBER_0 0x0819
|
||||||
|
#define SX126X_REG_RANDOM_NUMBER_1 0x081A
|
||||||
|
#define SX126X_REG_RANDOM_NUMBER_2 0x081B
|
||||||
|
#define SX126X_REG_RANDOM_NUMBER_3 0x081C
|
||||||
|
#define SX126X_REG_TX_MODULETION 0x0889
|
||||||
|
#define SX126X_REG_RX_GAIN 0x08AC
|
||||||
|
#define SX126X_REG_TX_CLAMP_CONFIG 0x08D8
|
||||||
|
#define SX126X_REG_OCP_CONFIGURATION 0x08E7
|
||||||
|
#define SX126X_REG_RTC_CONTROL 0x0902
|
||||||
|
#define SX126X_REG_XTA_TRIM 0x0911
|
||||||
|
#define SX126X_REG_XTB_TRIM 0x0912
|
||||||
|
#define SX126X_REG_DIO3_OUTPUT_VOLTAGE_CONTROL 0x0920
|
||||||
|
#define SX126X_REG_EVENT_MASK 0x0944
|
||||||
|
|
||||||
#define SX126X_CRC_POLY_MSB 0x06BE
|
|
||||||
#define SX126X_CRC_POLY_LSB 0x06BF
|
|
||||||
|
|
||||||
#define SX126X_SYNCWORD_0 0x06C0
|
// SX126X SPI command variables
|
||||||
#define SX126X_SYNCWORD_1 0x06C1
|
//SX126X_CMD_SET_SLEEP
|
||||||
#define SX126X_SYNCWORD_2 0x06C2
|
#define SX126X_SLEEP_START_COLD 0b00000000 // 2 2 sleep mode: cold start, configuration is lost (default)
|
||||||
#define SX126X_SYNCWORD_3 0x06C3
|
#define SX126X_SLEEP_START_WARM 0b00000100 // 2 2 warm start, configuration is retained
|
||||||
#define SX126X_SYNCWORD_4 0x06C4
|
#define SX126X_SLEEP_RTC_OFF 0b00000000 // 0 0 wake on RTC timeout: disabled
|
||||||
#define SX126X_SYNCWORD_5 0x06C5
|
#define SX126X_SLEEP_RTC_ON 0b00000001 // 0 0 enabled
|
||||||
#define SX126X_SYNCWORD_6 0x06C6
|
|
||||||
#define SX126X_SYNCWORD_7 0x06C7
|
|
||||||
|
|
||||||
#define SX126X_NODE_ADDRESS 0x06CD
|
//SX126X_CMD_SET_STANDBY
|
||||||
#define SX126X_BROADCAST_ADDRESS 0x06CE
|
#define SX126X_STANDBY_RC 0x00 // 7 0 standby mode: 13 MHz RC oscillator
|
||||||
|
#define SX126X_STANDBY_XOSC 0x01 // 7 0 32 MHz crystal oscillator
|
||||||
|
|
||||||
#define SX126X_IQ_POLARITY_SETUP 0x0736
|
//SX126X_CMD_SET_RX
|
||||||
|
#define SX126X_RX_TIMEOUT_NONE 0x000000 // 23 0 Rx timeout duration: no timeout (Rx single mode)
|
||||||
|
#define SX126X_RX_TIMEOUT_INF 0xFFFFFF // 23 0 infinite (Rx continuous mode)
|
||||||
|
|
||||||
#define SX126X_LORA_SYNCWORD_MSB 0x0740
|
//SX126X_CMD_STOP_TIMER_ON_PREAMBLE
|
||||||
#define SX126X_LORA_SYNCWORD_LSB 0x0741
|
#define SX126X_STOP_ON_PREAMBLE_OFF 0x00 // 7 0 stop timer on: sync word or header (default)
|
||||||
|
#define SX126X_STOP_ON_PREAMBLE_ON 0x01 // 7 0 preamble detection
|
||||||
|
|
||||||
#define SX126X_RANDOM_NUMBER_0 0x0819
|
//SX126X_CMD_SET_REGULATOR_MODE
|
||||||
#define SX126X_RANDOM_NUMBER_1 0x081A
|
#define SX126X_REGULATOR_LDO 0x00 // 7 0 set regulator mode: LDO (default)
|
||||||
#define SX126X_RANDOM_NUMBER_2 0x081B
|
#define SX126X_REGULATOR_DC_DC 0x01 // 7 0 DC-DC
|
||||||
#define SX126X_RANDOM_NUMBER_3 0x081C
|
|
||||||
|
|
||||||
#define SX126X_TX_MODULATION 0x0889
|
//SX126X_CMD_CALIBRATE
|
||||||
#define SX126X_RX_GAIN 0x08AC
|
#define SX126X_CALIBRATE_IMAGE_OFF 0b00000000 // 6 6 image calibration: disabled
|
||||||
|
#define SX126X_CALIBRATE_IMAGE_ON 0b01000000 // 6 6 enabled
|
||||||
|
#define SX126X_CALIBRATE_ADC_BULK_P_OFF 0b00000000 // 5 5 ADC bulk P calibration: disabled
|
||||||
|
#define SX126X_CALIBRATE_ADC_BULK_P_ON 0b00100000 // 5 5 enabled
|
||||||
|
#define SX126X_CALIBRATE_ADC_BULK_N_OFF 0b00000000 // 4 4 ADC bulk N calibration: disabled
|
||||||
|
#define SX126X_CALIBRATE_ADC_BULK_N_ON 0b00010000 // 4 4 enabled
|
||||||
|
#define SX126X_CALIBRATE_ADC_PULSE_OFF 0b00000000 // 3 3 ADC pulse calibration: disabled
|
||||||
|
#define SX126X_CALIBRATE_ADC_PULSE_ON 0b00001000 // 3 3 enabled
|
||||||
|
#define SX126X_CALIBRATE_PLL_OFF 0b00000000 // 2 2 PLL calibration: disabled
|
||||||
|
#define SX126X_CALIBRATE_PLL_ON 0b00000100 // 2 2 enabled
|
||||||
|
#define SX126X_CALIBRATE_RC13M_OFF 0b00000000 // 1 1 13 MHz RC osc. calibration: disabled
|
||||||
|
#define SX126X_CALIBRATE_RC13M_ON 0b00000010 // 1 1 enabled
|
||||||
|
#define SX126X_CALIBRATE_RC64K_OFF 0b00000000 // 0 0 64 kHz RC osc. calibration: disabled
|
||||||
|
#define SX126X_CALIBRATE_RC64K_ON 0b00000001 // 0 0 enabled
|
||||||
|
|
||||||
#define SX126X_TX_CLAMP_CONFIG 0x08D8
|
//SX126X_CMD_CALIBRATE_IMAGE
|
||||||
#define SX126X_OCP_CONFIGURATION 0x08E7
|
#define SX126X_CAL_IMG_430_MHZ_1 0x6B
|
||||||
|
#define SX126X_CAL_IMG_430_MHZ_2 0x6F
|
||||||
|
#define SX126X_CAL_IMG_470_MHZ_1 0x75
|
||||||
|
#define SX126X_CAL_IMG_470_MHZ_2 0x81
|
||||||
|
#define SX126X_CAL_IMG_779_MHZ_1 0xC1
|
||||||
|
#define SX126X_CAL_IMG_779_MHZ_2 0xC5
|
||||||
|
#define SX126X_CAL_IMG_863_MHZ_1 0xD7
|
||||||
|
#define SX126X_CAL_IMG_863_MHZ_2 0xDB
|
||||||
|
#define SX126X_CAL_IMG_902_MHZ_1 0xE1
|
||||||
|
#define SX126X_CAL_IMG_902_MHZ_2 0xE9
|
||||||
|
|
||||||
#define SX126X_RTC_CONTROL 0x0902
|
//SX126X_CMD_SET_PA_CONFIG
|
||||||
|
#define SX126X_PA_CONFIG_HP_MAX 0x07
|
||||||
|
#define SX126X_PA_CONFIG_SX1268 0x01
|
||||||
|
#define SX126X_PA_CONFIG_PA_LUT 0x01
|
||||||
|
|
||||||
#define SX126X_XTA_TRIM 0x0911
|
//SX126X_CMD_SET_RX_TX_FALLBACK_MODE
|
||||||
#define SX126X_XTB_TRIM 0x0912
|
#define SX126X_RX_TX_FALLBACK_MODE_FS 0x40 // 7 0 after Rx/Tx go to: FS mode
|
||||||
|
#define SX126X_RX_TX_FALLBACK_MODE_STDBY_XOSC 0x30 // 7 0 standby with crystal oscillator
|
||||||
|
#define SX126X_RX_TX_FALLBACK_MODE_STDBY_RC 0x20 // 7 0 standby with RC oscillator (default)
|
||||||
|
|
||||||
#define SX126X_DIO3_OUTPUT_VOLTAGE 0x0920
|
//SX126X_CMD_SET_DIO_IRQ_PARAMS
|
||||||
#define SX126X_EVENT_MASK 0x0944
|
#define SX126X_IRQ_TIMEOUT 0b1000000000 // 9 9 Rx or Tx timeout
|
||||||
|
#define SX126X_IRQ_CAD_DETECTED 0b0100000000 // 8 8 channel activity detected
|
||||||
|
#define SX126X_IRQ_CAD_DONE 0b0010000000 // 7 7 channel activity detection finished
|
||||||
|
#define SX126X_IRQ_CRC_ERR 0b0001000000 // 6 6 wrong CRC received
|
||||||
|
#define SX126X_IRQ_HEADER_ERR 0b0000100000 // 5 5 LoRa header CRC error
|
||||||
|
#define SX126X_IRQ_HEADER_VALID 0b0000010000 // 4 4 valid LoRa header received
|
||||||
|
#define SX126X_IRQ_SYNC_WORD_VALID 0b0000001000 // 3 3 valid sync word detected
|
||||||
|
#define SX126X_IRQ_PREAMBLE_DETECTED 0b0000000100 // 2 2 preamble detected
|
||||||
|
#define SX126X_IRQ_RX_DONE 0b0000000010 // 1 1 packet received
|
||||||
|
#define SX126X_IRQ_TX_DONE 0b0000000001 // 0 0 packet transmission completed
|
||||||
|
#define SX126X_IRQ_ALL 0b1111111111 // 9 0 all interrupts
|
||||||
|
#define SX126X_IRQ_NONE 0b0000000000 // 9 0 no interrupts
|
||||||
|
|
||||||
// Default values where applicable
|
//SX126X_CMD_SET_DIO2_AS_RF_SWITCH_CTRL
|
||||||
#define SX126X_RX_GAIN_POWER_SAVING 0x94
|
#define SX126X_DIO2_AS_IRQ 0x00 // 7 0 DIO2 configuration: IRQ
|
||||||
#define SX126X_RX_GAIN_BOOSTED 0x96
|
#define SX126X_DIO2_AS_RF_SWITCH 0x01 // 7 0 RF switch control
|
||||||
|
|
||||||
#define SX126X_LORA_SYNCWORD_PUBLIC 0x3444
|
//SX126X_CMD_SET_DIO3_AS_TCXO_CTRL
|
||||||
#define SX126X_LORA_SYNCWORD_PRIVATE 0x1424
|
#define SX126X_DIO3_OUTPUT_1_6 0x00 // 7 0 DIO3 voltage output for TCXO: 1.6 V
|
||||||
|
#define SX126X_DIO3_OUTPUT_1_7 0x01 // 7 0 1.7 V
|
||||||
|
#define SX126X_DIO3_OUTPUT_1_8 0x02 // 7 0 1.8 V
|
||||||
|
#define SX126X_DIO3_OUTPUT_2_2 0x03 // 7 0 2.2 V
|
||||||
|
#define SX126X_DIO3_OUTPUT_2_4 0x04 // 7 0 2.4 V
|
||||||
|
#define SX126X_DIO3_OUTPUT_2_7 0x05 // 7 0 2.7 V
|
||||||
|
#define SX126X_DIO3_OUTPUT_3_0 0x06 // 7 0 3.0 V
|
||||||
|
#define SX126X_DIO3_OUTPUT_3_3 0x07 // 7 0 3.3 V
|
||||||
|
|
||||||
#define SX126X_OCP_LEVEL_SX1262 0x38 // 140mA
|
//Radio complete Wake-up Time with TCXO stabilisation time
|
||||||
#define SX126X_OCP_LEVEL_SX1261 0x18 // 60mA
|
#define RADIO_TCXO_SETUP_TIME 5000 // [us]
|
||||||
|
|
||||||
typedef struct
|
//SX126X_CMD_SET_PACKET_TYPE
|
||||||
{
|
#define SX126X_PACKET_TYPE_GFSK 0x00 // 7 0 packet type: GFSK
|
||||||
uint8_t spreadingFactor; // LoRa SF: 0x05 (SF5) to 0x0C (SF12)
|
#define SX126X_PACKET_TYPE_LORA 0x01 // 7 0 LoRa
|
||||||
uint8_t bandwidth; // LoRa BW: 0x00 (7.81 kHz) to 0x06 (500 kHz)
|
|
||||||
uint8_t codingRate; // LoRa CR: 0x01 (4/5) to 0x04 (4/8)
|
|
||||||
uint8_t lowDataRateOpt; // LDRO: 0x00 (disabled) or 0x01 (enabled)
|
|
||||||
} sx1262_LoRaModulationParams_t;
|
|
||||||
|
|
||||||
typedef struct
|
//SX126X_CMD_SET_TX_PARAMS
|
||||||
{
|
#define SX126X_PA_RAMP_10U 0x00 // 7 0 ramp time: 10 us
|
||||||
uint32_t bitRate; // GFSK bitrate (BR), calculated as 32 * Fxtal / BR
|
#define SX126X_PA_RAMP_20U 0x01 // 7 0 20 us
|
||||||
uint8_t pulseShape; // GFSK filter: 0x00 (none) to 0x0B (Gaussian BT 1)
|
#define SX126X_PA_RAMP_40U 0x02 // 7 0 40 us
|
||||||
uint8_t bandwidth; // GFSK RX bandwidth: 0x1F (4.8 kHz) to 0x09 (467 kHz)
|
#define SX126X_PA_RAMP_80U 0x03 // 7 0 80 us
|
||||||
uint32_t frequencyDev; // GFSK frequency deviation (Fdev)
|
#define SX126X_PA_RAMP_200U 0x04 // 7 0 200 us
|
||||||
} sx1262_GFSKModulationParams_t;
|
#define SX126X_PA_RAMP_800U 0x05 // 7 0 800 us
|
||||||
|
#define SX126X_PA_RAMP_1700U 0x06 // 7 0 1700 us
|
||||||
|
#define SX126X_PA_RAMP_3400U 0x07 // 7 0 3400 us
|
||||||
|
|
||||||
#include <math.h>
|
//SX126X_CMD_SET_MODULATION_PARAMS
|
||||||
|
#define SX126X_GFSK_FILTER_NONE 0x00 // 7 0 GFSK filter: none
|
||||||
|
#define SX126X_GFSK_FILTER_GAUSS_0_3 0x08 // 7 0 Gaussian, BT = 0.3
|
||||||
|
#define SX126X_GFSK_FILTER_GAUSS_0_5 0x09 // 7 0 Gaussian, BT = 0.5
|
||||||
|
#define SX126X_GFSK_FILTER_GAUSS_0_7 0x0A // 7 0 Gaussian, BT = 0.7
|
||||||
|
#define SX126X_GFSK_FILTER_GAUSS_1 0x0B // 7 0 Gaussian, BT = 1
|
||||||
|
#define SX126X_GFSK_RX_BW_4_8 0x1F // 7 0 GFSK Rx bandwidth: 4.8 kHz
|
||||||
|
#define SX126X_GFSK_RX_BW_5_8 0x17 // 7 0 5.8 kHz
|
||||||
|
#define SX126X_GFSK_RX_BW_7_3 0x0F // 7 0 7.3 kHz
|
||||||
|
#define SX126X_GFSK_RX_BW_9_7 0x1E // 7 0 9.7 kHz
|
||||||
|
#define SX126X_GFSK_RX_BW_11_7 0x16 // 7 0 11.7 kHz
|
||||||
|
#define SX126X_GFSK_RX_BW_14_6 0x0E // 7 0 14.6 kHz
|
||||||
|
#define SX126X_GFSK_RX_BW_19_5 0x1D // 7 0 19.5 kHz
|
||||||
|
#define SX126X_GFSK_RX_BW_23_4 0x15 // 7 0 23.4 kHz
|
||||||
|
#define SX126X_GFSK_RX_BW_29_3 0x0D // 7 0 29.3 kHz
|
||||||
|
#define SX126X_GFSK_RX_BW_39_0 0x1C // 7 0 39.0 kHz
|
||||||
|
#define SX126X_GFSK_RX_BW_46_9 0x14 // 7 0 46.9 kHz
|
||||||
|
#define SX126X_GFSK_RX_BW_58_6 0x0C // 7 0 58.6 kHz
|
||||||
|
#define SX126X_GFSK_RX_BW_78_2 0x1B // 7 0 78.2 kHz
|
||||||
|
#define SX126X_GFSK_RX_BW_93_8 0x13 // 7 0 93.8 kHz
|
||||||
|
#define SX126X_GFSK_RX_BW_117_3 0x0B // 7 0 117.3 kHz
|
||||||
|
#define SX126X_GFSK_RX_BW_156_2 0x1A // 7 0 156.2 kHz
|
||||||
|
#define SX126X_GFSK_RX_BW_187_2 0x12 // 7 0 187.2 kHz
|
||||||
|
#define SX126X_GFSK_RX_BW_234_3 0x0A // 7 0 234.3 kHz
|
||||||
|
#define SX126X_GFSK_RX_BW_312_0 0x19 // 7 0 312.0 kHz
|
||||||
|
#define SX126X_GFSK_RX_BW_373_6 0x11 // 7 0 373.6 kHz
|
||||||
|
#define SX126X_GFSK_RX_BW_467_0 0x09 // 7 0 467.0 kHz
|
||||||
|
#define SX126X_LORA_BW_7_8 0x00 // 7 0 LoRa bandwidth: 7.8 kHz
|
||||||
|
#define SX126X_LORA_BW_10_4 0x08 // 7 0 10.4 kHz
|
||||||
|
#define SX126X_LORA_BW_15_6 0x01 // 7 0 15.6 kHz
|
||||||
|
#define SX126X_LORA_BW_20_8 0x09 // 7 0 20.8 kHz
|
||||||
|
#define SX126X_LORA_BW_31_25 0x02 // 7 0 31.25 kHz
|
||||||
|
#define SX126X_LORA_BW_41_7 0x0A // 7 0 41.7 kHz
|
||||||
|
#define SX126X_LORA_BW_62_5 0x03 // 7 0 62.5 kHz
|
||||||
|
#define SX126X_LORA_BW_125_0 0x04 // 7 0 125.0 kHz
|
||||||
|
#define SX126X_LORA_BW_250_0 0x05 // 7 0 250.0 kHz
|
||||||
|
#define SX126X_LORA_BW_500_0 0x06 // 7 0 500.0 kHz
|
||||||
|
#define SX126X_LORA_CR_4_5 0x01 // 7 0 LoRa coding rate: 4/5
|
||||||
|
#define SX126X_LORA_CR_4_6 0x02 // 7 0 4/6
|
||||||
|
#define SX126X_LORA_CR_4_7 0x03 // 7 0 4/7
|
||||||
|
#define SX126X_LORA_CR_4_8 0x04 // 7 0 4/8
|
||||||
|
#define SX126X_LORA_LOW_DATA_RATE_OPTIMIZE_OFF 0x00 // 7 0 LoRa low data rate optimization: disabled
|
||||||
|
#define SX126X_LORA_LOW_DATA_RATE_OPTIMIZE_ON 0x01 // 7 0 enabled
|
||||||
|
|
||||||
#define XTAL_FREQ (double)32000000
|
//SX126X_CMD_SET_PACKET_PARAMS
|
||||||
#define FREQ_DIV (double)pow(2.0, 25.0)
|
#define SX126X_GFSK_PREAMBLE_DETECT_OFF 0x00 // 7 0 GFSK minimum preamble length before reception starts: detector disabled
|
||||||
#define FREQ_STEP (double)(XTAL_FREQ / FREQ_DIV)
|
#define SX126X_GFSK_PREAMBLE_DETECT_8 0x04 // 7 0 8 bits
|
||||||
|
#define SX126X_GFSK_PREAMBLE_DETECT_16 0x05 // 7 0 16 bits
|
||||||
|
#define SX126X_GFSK_PREAMBLE_DETECT_24 0x06 // 7 0 24 bits
|
||||||
|
#define SX126X_GFSK_PREAMBLE_DETECT_32 0x07 // 7 0 32 bits
|
||||||
|
#define SX126X_GFSK_ADDRESS_FILT_OFF 0x00 // 7 0 GFSK address filtering: disabled
|
||||||
|
#define SX126X_GFSK_ADDRESS_FILT_NODE 0x01 // 7 0 node only
|
||||||
|
#define SX126X_GFSK_ADDRESS_FILT_NODE_BROADCAST 0x02 // 7 0 node and broadcast
|
||||||
|
#define SX126X_GFSK_PACKET_FIXED 0x00 // 7 0 GFSK packet type: fixed (payload length known in advance to both sides)
|
||||||
|
#define SX126X_GFSK_PACKET_VARIABLE 0x01 // 7 0 variable (payload length added to packet)
|
||||||
|
#define SX126X_GFSK_CRC_OFF 0x01 // 7 0 GFSK packet CRC: disabled
|
||||||
|
#define SX126X_GFSK_CRC_1_BYTE 0x00 // 7 0 1 byte
|
||||||
|
#define SX126X_GFSK_CRC_2_BYTE 0x02 // 7 0 2 byte
|
||||||
|
#define SX126X_GFSK_CRC_1_BYTE_INV 0x04 // 7 0 1 byte, inverted
|
||||||
|
#define SX126X_GFSK_CRC_2_BYTE_INV 0x06 // 7 0 2 byte, inverted
|
||||||
|
#define SX126X_GFSK_WHITENING_OFF 0x00 // 7 0 GFSK data whitening: disabled
|
||||||
|
#define SX126X_GFSK_WHITENING_ON 0x01 // 7 0 enabled
|
||||||
|
#define SX126X_LORA_HEADER_EXPLICIT 0x00 // 7 0 LoRa header mode: explicit
|
||||||
|
#define SX126X_LORA_HEADER_IMPLICIT 0x01 // 7 0 implicit
|
||||||
|
#define SX126X_LORA_CRC_OFF 0x00 // 7 0 LoRa CRC mode: disabled
|
||||||
|
#define SX126X_LORA_CRC_ON 0x01 // 7 0 enabled
|
||||||
|
#define SX126X_LORA_IQ_STANDARD 0x00 // 7 0 LoRa IQ setup: standard
|
||||||
|
#define SX126X_LORA_IQ_INVERTED 0x01 // 7 0 inverted
|
||||||
|
|
||||||
#define SX1262_SLEEPCFG_ColdStart_RTCDisable 0
|
//SX126X_CMD_SET_CAD_PARAMS
|
||||||
#define SX1262_SLEEPCFG_ColdStart_RTCEnable 1
|
#define SX126X_CAD_ON_1_SYMB 0x00 // 7 0 number of symbols used for CAD: 1
|
||||||
#define SX1262_SLEEPCFG_WarmStart_RTCDisable 4
|
#define SX126X_CAD_ON_2_SYMB 0x01 // 7 0 2
|
||||||
#define SX1262_SLEEPCFG_WarmStart_RTCEnable 5
|
#define SX126X_CAD_ON_4_SYMB 0x02 // 7 0 4
|
||||||
|
#define SX126X_CAD_ON_8_SYMB 0x03 // 7 0 8
|
||||||
|
#define SX126X_CAD_ON_16_SYMB 0x04 // 7 0 16
|
||||||
|
#define SX126X_CAD_GOTO_STDBY 0x00 // 7 0 after CAD is done, always go to STDBY_RC mode
|
||||||
|
#define SX126X_CAD_GOTO_RX 0x01 // 7 0 after CAD is done, go to Rx mode if activity is detected
|
||||||
|
|
||||||
#define SX1262_STANDBY_RC 0
|
//SX126X_CMD_GET_STATUS
|
||||||
#define SX1262_STANDBY_XOSC 1
|
#define SX126X_STATUS_MODE_STDBY_RC 0b00100000 // 6 4 current chip mode: STDBY_RC
|
||||||
|
#define SX126X_STATUS_MODE_STDBY_XOSC 0b00110000 // 6 4 STDBY_XOSC
|
||||||
|
#define SX126X_STATUS_MODE_FS 0b01000000 // 6 4 FS
|
||||||
|
#define SX126X_STATUS_MODE_RX 0b01010000 // 6 4 RX
|
||||||
|
#define SX126X_STATUS_MODE_TX 0b01100000 // 6 4 TX
|
||||||
|
#define SX126X_STATUS_DATA_AVAILABLE 0b00000100 // 3 1 command status: packet received and data can be retrieved
|
||||||
|
#define SX126X_STATUS_CMD_TIMEOUT 0b00000110 // 3 1 SPI command timed out
|
||||||
|
#define SX126X_STATUS_CMD_INVALID 0b00001000 // 3 1 invalid SPI command
|
||||||
|
#define SX126X_STATUS_CMD_FAILED 0b00001010 // 3 1 SPI command failed to execute
|
||||||
|
#define SX126X_STATUS_TX_DONE 0b00001100 // 3 1 packet transmission done
|
||||||
|
#define SX126X_STATUS_SPI_FAILED 0b11111111 // 7 0 SPI transaction failed
|
||||||
|
|
||||||
#define SX1262_TIMEOUT_ONCE 0
|
//SX126X_CMD_GET_PACKET_STATUS
|
||||||
#define SX1262_TIMEOUT_RX_CONTINOUS 0xFFFFFF
|
#define SX126X_GFSK_RX_STATUS_PREAMBLE_ERR 0b10000000 // 7 7 GFSK Rx status: preamble error
|
||||||
|
#define SX126X_GFSK_RX_STATUS_SYNC_ERR 0b01000000 // 6 6 sync word error
|
||||||
|
#define SX126X_GFSK_RX_STATUS_ADRS_ERR 0b00100000 // 5 5 address error
|
||||||
|
#define SX126X_GFSK_RX_STATUS_CRC_ERR 0b00010000 // 4 4 CRC error
|
||||||
|
#define SX126X_GFSK_RX_STATUS_LENGTH_ERR 0b00001000 // 3 3 length error
|
||||||
|
#define SX126X_GFSK_RX_STATUS_ABORT_ERR 0b00000100 // 2 2 abort error
|
||||||
|
#define SX126X_GFSK_RX_STATUS_PACKET_RECEIVED 0b00000010 // 2 2 packet received
|
||||||
|
#define SX126X_GFSK_RX_STATUS_PACKET_SENT 0b00000001 // 2 2 packet sent
|
||||||
|
|
||||||
#define SX1262_RECEIVE_MODE 0
|
//SX126X_CMD_GET_DEVICE_ERRORS
|
||||||
#define SX1262_TRANSMIT_MODE 1
|
#define SX126X_PA_RAMP_ERR 0b100000000 // 8 8 device errors: PA ramping failed
|
||||||
|
#define SX126X_PLL_LOCK_ERR 0b001000000 // 6 6 PLL failed to lock
|
||||||
|
#define SX126X_XOSC_START_ERR 0b000100000 // 5 5 crystal oscillator failed to start
|
||||||
|
#define SX126X_IMG_CALIB_ERR 0b000010000 // 4 4 image calibration failed
|
||||||
|
#define SX126X_ADC_CALIB_ERR 0b000001000 // 3 3 ADC calibration failed
|
||||||
|
#define SX126X_PLL_CALIB_ERR 0b000000100 // 2 2 PLL calibration failed
|
||||||
|
#define SX126X_RC13M_CALIB_ERR 0b000000010 // 1 1 RC13M calibration failed
|
||||||
|
#define SX126X_RC64K_CALIB_ERR 0b000000001 // 0 0 RC64K calibration failed
|
||||||
|
|
||||||
#define SX1262_STOP_TIMER_ON_PREAMBLE_DISABLE 0x00
|
|
||||||
#define SX1262_STOP_TIMER_ON_PREAMBLE_ENABLE 0x01
|
|
||||||
|
|
||||||
#define SX1262_REGULATOR_LDO_ONLY 0x00
|
// SX126X SPI register variables
|
||||||
#define SX1262_REGULATOR_DC_DC_LDO 0x01
|
//SX126X_REG_LORA_SYNC_WORD_MSB + LSB
|
||||||
|
#define SX126X_SYNC_WORD_PUBLIC 0x3444
|
||||||
|
#define SX126X_SYNC_WORD_PRIVATE 0x1424
|
||||||
|
|
||||||
#define SX1262_FALLBACK_FS 0x40
|
#define SX126x_TXMODE_ASYNC 0x01
|
||||||
#define SX1262_FALLBACK_STANDBY_XOSC 0x30
|
#define SX126x_TXMODE_SYNC 0x02
|
||||||
#define SX1262_FALLBACK_RC 0x20
|
#define SX126x_TXMODE_BACK2RX 0x04
|
||||||
|
|
||||||
#define SX1262_IRQ_TXDone (1 << 0)
|
// Public function
|
||||||
#define SX1262_IRQ_RXDone (1 << 1)
|
void LoRaInit(void);
|
||||||
#define SX1262_IRQ_PreambleDetected (1 << 2)
|
int16_t LoRaBegin(uint32_t frequencyInHz, int8_t txPowerInDbm, float tcxoVoltage, bool useRegulatorLDO);
|
||||||
#define SX1262_IRQ_SyncWordValid (1 << 3)
|
void LoRaConfig(uint8_t spreadingFactor, uint8_t bandwidth, uint8_t codingRate, uint16_t preambleLength, uint8_t payloadLen, bool crcOn, bool invertIrq);
|
||||||
#define SX1262_IRQ_HeaderValid (1 << 4)
|
uint8_t LoRaReceive(uint8_t *pData, int16_t len);
|
||||||
#define SX1262_IRQ_HeaderError (1 << 5)
|
bool LoRaSend(uint8_t *pData, int16_t len, uint8_t mode);
|
||||||
#define SX1262_IRQ_CRCError (1 << 6)
|
void LoRaDebugPrint(bool enable);
|
||||||
#define SX1262_IRQ_ChannelActivityDetectionDone (1 << 7)
|
|
||||||
#define SX1262_IRQ_ChannelActivityDetected (1 << 8)
|
|
||||||
#define SX1262_IRQ_Timeout (1 << 9)
|
|
||||||
#define SX1262_IRQ_ALL (SX1262_IRQ_TXDone | SX1262_IRQ_RXDone | SX1262_IRQ_PreambleDetected | SX1262_IRQ_SyncWordValid | SX1262_IRQ_HeaderValid | SX1262_IRQ_HeaderError | SX1262_IRQ_CRCError | SX1262_IRQ_ChannelActivityDetectionDone | SX1262_IRQ_ChannelActivityDetected | SX1262_IRQ_Timeout)
|
|
||||||
|
|
||||||
#define SX1262_TCXO_VOLTAGE16dV 0x00
|
// Private function
|
||||||
#define SX1262_TCXO_VOLTAGE17dV 0x01
|
void spi_write_byte(uint8_t* Dataout, size_t DataLength );
|
||||||
#define SX1262_TCXO_VOLTAGE18dV 0x02
|
void spi_read_byte(uint8_t* Datain, uint8_t* Dataout, size_t DataLength );
|
||||||
#define SX1262_TCXO_VOLTAGE22dV 0x03
|
uint8_t spi_transfer(uint8_t address);
|
||||||
#define SX1262_TCXO_VOLTAGE24dV 0x04
|
|
||||||
#define SX1262_TCXO_VOLTAGE27dV 0x05
|
|
||||||
#define SX1262_TCXO_VOLTAGE30dV 0x06
|
|
||||||
#define SX1262_TCXO_VOLTAGE33dV 0x07
|
|
||||||
|
|
||||||
#define SX1262_PACKET_TYPE_GFSK 0x00
|
bool ReceiveMode(void);
|
||||||
#define SX1262_PACKET_TYPE_LORA 0x01
|
void GetPacketStatus(int8_t *rssiPacket, int8_t *snrPacket);
|
||||||
|
void SetTxPower(int8_t txPowerInDbm);
|
||||||
|
|
||||||
#define SX1262_Ramp_10U (0x00)
|
void FixInvertedIQ(uint8_t iqConfig);
|
||||||
#define SX1262_Ramp_20U (0x01)
|
void SetDio3AsTcxoCtrl(float voltage, uint32_t delay);
|
||||||
#define SX1262_Ramp_40U (0x02)
|
void SetDio2AsRfSwitchCtrl(uint8_t enable);
|
||||||
#define SX1262_Ramp_80U (0x03)
|
void Reset(void);
|
||||||
#define SX1262_Ramp_200U (0x04)
|
void SetStandby(uint8_t mode);
|
||||||
#define SX1262_Ramp_800U (0x05)
|
void SetRfFrequency(uint32_t frequency);
|
||||||
#define SX1262_Ramp_1700U (0x06)
|
void Calibrate(uint8_t calibParam);
|
||||||
#define SX1262_Ramp_3400U (0x07)
|
void CalibrateImage(uint32_t frequency);
|
||||||
|
void SetRegulatorMode(uint8_t mode);
|
||||||
|
void SetBufferBaseAddress(uint8_t txBaseAddress, uint8_t rxBaseAddress);
|
||||||
|
void SetPowerConfig(int8_t power, uint8_t rampTime);
|
||||||
|
void SetOvercurrentProtection(float currentLimit);
|
||||||
|
void SetSyncWord(int16_t sync);
|
||||||
|
void SetPaConfig(uint8_t paDutyCycle, uint8_t hpMax, uint8_t deviceSel, uint8_t paLut);
|
||||||
|
void SetDioIrqParams(uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask, uint16_t dio3Mask);
|
||||||
|
void SetStopRxTimerOnPreambleDetect(bool enable);
|
||||||
|
void SetLoRaSymbNumTimeout(uint8_t SymbNum);
|
||||||
|
void SetPacketType(uint8_t packetType);
|
||||||
|
void SetModulationParams(uint8_t spreadingFactor, uint8_t bandwidth, uint8_t codingRate, uint8_t lowDataRateOptimize);
|
||||||
|
void SetCadParams(uint8_t cadSymbolNum, uint8_t cadDetPeak, uint8_t cadDetMin, uint8_t cadExitMode, uint32_t cadTimeout);
|
||||||
|
void SetCad();
|
||||||
|
uint8_t GetStatus(void);
|
||||||
|
uint16_t GetIrqStatus(void);
|
||||||
|
void ClearIrqStatus(uint16_t irq);
|
||||||
|
void SetRx(uint32_t timeout);
|
||||||
|
void SetTx(uint32_t timeoutInMs);
|
||||||
|
int GetPacketLost();
|
||||||
|
uint8_t GetRssiInst();
|
||||||
|
void GetRxBufferStatus(uint8_t *payloadLength, uint8_t *rxStartBufferPointer);
|
||||||
|
void Wakeup(void);
|
||||||
|
void WaitForIdleBegin(unsigned long timeout, char *text);
|
||||||
|
bool WaitForIdle(unsigned long timeout, char *text, bool stop);
|
||||||
|
uint8_t ReadBuffer(uint8_t *rxData, int16_t rxDataLen);
|
||||||
|
void WriteBuffer(uint8_t *txData, int16_t txDataLen);
|
||||||
|
void WriteRegister(uint16_t reg, uint8_t* data, uint8_t numBytes);
|
||||||
|
void ReadRegister(uint16_t reg, uint8_t* data, uint8_t numBytes);
|
||||||
|
void WriteCommand(uint8_t cmd, uint8_t* data, uint8_t numBytes);
|
||||||
|
uint8_t WriteCommand2(uint8_t cmd, uint8_t* data, uint8_t numBytes);
|
||||||
|
void ReadCommand(uint8_t cmd, uint8_t* data, uint8_t numBytes);
|
||||||
|
void SPItransfer(uint8_t cmd, bool write, uint8_t* dataOut, uint8_t* dataIn, uint8_t numBytes, bool waitForBusy);
|
||||||
|
void LoRaError(int error);
|
||||||
|
|
||||||
#define SX1262_HEADER_TYPE_VARIABLE 0x00
|
|
||||||
#define SX1262_HEADER_TYPE_FIXED 0x01
|
|
||||||
|
|
||||||
#define SX1262_CRC_OFF 0x00
|
|
||||||
#define SX1262_CRC_ON 0x01
|
|
||||||
|
|
||||||
#define SX1262_STANDARD_IQ 0x00
|
|
||||||
#define SX1262_INVERTED_IQ 0x01
|
|
||||||
|
|
||||||
#define SX1262_CAD_ON_1_SYMB 0x00
|
|
||||||
#define SX1262_CAD_ON_2_SYMB 0x01
|
|
||||||
#define SX1262_CAD_ON_4_SYMB 0x02
|
|
||||||
#define SX1262_CAD_ON_8_SYMB 0x03
|
|
||||||
#define SX1262_CAD_ON_16_SYMB 0x04
|
|
||||||
#define SX1262_CAD_ONLY 0x00
|
|
||||||
#define SX1262_CAD_RX 0x01
|
|
||||||
|
|
||||||
#define SX1262_ERROR_CALIBRATION_RC64K (1 << 0)
|
|
||||||
#define SX1262_ERROR_CALIBRATION_RC13M (1 << 1)
|
|
||||||
#define SX1262_ERROR_CALIBRATION_PLL (1 << 2)
|
|
||||||
#define SX1262_ERROR_CALIBRATION_ADC (1 << 3)
|
|
||||||
#define SX1262_ERROR_CALIBRATION_IMG (1 << 4)
|
|
||||||
#define SX1262_ERROR_CALIBRATION_XOSC (1 << 5)
|
|
||||||
#define SX1262_ERROR_PLL_LOCK (1 << 6)
|
|
||||||
#define SX1262_ERROR_PA_RAMP (1 << 8)
|
|
||||||
|
|
||||||
#define SX1262_CALIB_RC64K (1 << 0) // RC64k calibration enabled
|
|
||||||
#define SX1262_CALIB_RC13M (1 << 1) // RC13M calibration enabled
|
|
||||||
#define SX1262_CALIB_PLL (1 << 2) // PLL calibration enabled
|
|
||||||
#define SX1262_CALIB_ADC_PULSE (1 << 3) // ADC pulse calibration enabled
|
|
||||||
#define SX1262_CALIB_ADC_BULK_N (1 << 4) // ADC bulk N calibration enabled
|
|
||||||
#define SX1262_CALIB_ADC_BULK_P (1 << 5) // ADC bulk P calibration enabled
|
|
||||||
#define SX1262_CALIB_IMAGE (1 << 6) // Image calibration enabled
|
|
||||||
#define SX1262_CALIB_RESERVED (1 << 7) // Reserved bit (RFU)
|
|
||||||
|
|
||||||
// Combined mask for all calibration settings
|
|
||||||
#define SX1262_CALIBRATION_ALL (SX1262_CALIB_RC64K | SX1262_CALIB_RC13M | \
|
|
||||||
SX1262_CALIB_PLL | SX1262_CALIB_ADC_PULSE | \
|
|
||||||
SX1262_CALIB_ADC_BULK_N | SX1262_CALIB_ADC_BULK_P | \
|
|
||||||
SX1262_CALIB_IMAGE)
|
|
||||||
|
|
||||||
// GFSK Pulse Shape
|
|
||||||
#define SX1262_GFSK_NO_FILTER (0x00)
|
|
||||||
#define SX1262_GFSK_BT_0_3 (0x08)
|
|
||||||
#define SX1262_GFSK_BT_0_5 (0x09)
|
|
||||||
#define SX1262_GFSK_BT_0_7 (0x0A)
|
|
||||||
#define SX1262_GFSK_BT_1_0 (0x0B)
|
|
||||||
|
|
||||||
// GFSK Bandwidth
|
|
||||||
#define SX1262_GFSK_RX_BW_4800 (0x1F)
|
|
||||||
#define SX1262_GFSK_RX_BW_5800 (0x17)
|
|
||||||
#define SX1262_GFSK_RX_BW_7300 (0x0F)
|
|
||||||
#define SX1262_GFSK_RX_BW_9700 (0x1E)
|
|
||||||
#define SX1262_GFSK_RX_BW_11700 (0x16)
|
|
||||||
#define SX1262_GFSK_RX_BW_14600 (0x0E)
|
|
||||||
#define SX1262_GFSK_RX_BW_19500 (0x1D)
|
|
||||||
#define SX1262_GFSK_RX_BW_23400 (0x15)
|
|
||||||
#define SX1262_GFSK_RX_BW_29300 (0x0D)
|
|
||||||
#define SX1262_GFSK_RX_BW_39000 (0x1C)
|
|
||||||
#define SX1262_GFSK_RX_BW_46900 (0x14)
|
|
||||||
#define SX1262_GFSK_RX_BW_58600 (0x0C)
|
|
||||||
#define SX1262_GFSK_RX_BW_78200 (0x1B)
|
|
||||||
#define SX1262_GFSK_RX_BW_93800 (0x13)
|
|
||||||
#define SX1262_GFSK_RX_BW_117300 (0x0B)
|
|
||||||
#define SX1262_GFSK_RX_BW_156200 (0x1A)
|
|
||||||
#define SX1262_GFSK_RX_BW_187200 (0x12)
|
|
||||||
#define SX1262_GFSK_RX_BW_234300 (0x0A)
|
|
||||||
#define SX1262_GFSK_RX_BW_312000 (0x19)
|
|
||||||
#define SX1262_GFSK_RX_BW_373600 (0x11)
|
|
||||||
#define SX1262_GFSK_RX_BW_467000 (0x09)
|
|
||||||
|
|
||||||
// LoRa Spreading Factor (SF)
|
|
||||||
#define SX1262_LORA_SF5 (0x05)
|
|
||||||
#define SX1262_LORA_SF6 (0x06)
|
|
||||||
#define SX1262_LORA_SF7 (0x07)
|
|
||||||
#define SX1262_LORA_SF8 (0x08)
|
|
||||||
#define SX1262_LORA_SF9 (0x09)
|
|
||||||
#define SX1262_LORA_SF10 (0x0A)
|
|
||||||
#define SX1262_LORA_SF11 (0x0B)
|
|
||||||
#define SX1262_LORA_SF12 (0x0C)
|
|
||||||
|
|
||||||
// LoRa Bandwidth (BW)
|
|
||||||
#define SX1262_LORA_BW_7 (0x00) // 7.81 kHz
|
|
||||||
#define SX1262_LORA_BW_10 (0x08) // 10.42 kHz
|
|
||||||
#define SX1262_LORA_BW_15 (0x01) // 15.63 kHz
|
|
||||||
#define SX1262_LORA_BW_20 (0x09) // 20.83 kHz
|
|
||||||
#define SX1262_LORA_BW_31 (0x02) // 31.25 kHz
|
|
||||||
#define SX1262_LORA_BW_41 (0x0A) // 41.67 kHz
|
|
||||||
#define SX1262_LORA_BW_62 (0x03) // 62.50 kHz
|
|
||||||
#define SX1262_LORA_BW_125 (0x04) // 125 kHz
|
|
||||||
#define SX1262_LORA_BW_250 (0x05) // 250 kHz
|
|
||||||
#define SX1262_LORA_BW_500 (0x06) // 500 kHz
|
|
||||||
|
|
||||||
// LoRa Coding Rate (CR)
|
|
||||||
#define SX1262_LORA_CR_4_5 (0x01)
|
|
||||||
#define SX1262_LORA_CR_4_6 (0x02)
|
|
||||||
#define SX1262_LORA_CR_4_7 (0x03)
|
|
||||||
#define SX1262_LORA_CR_4_8 (0x04)
|
|
||||||
|
|
||||||
#define SX1262_LORA_SYNC_WORD_MSB (0x0740)
|
|
||||||
#define SX1262_LORA_SYNC_WORD_LSB (0x0741)
|
|
||||||
|
|
||||||
void sx1262_setPacketType(uint8_t packetType);
|
|
||||||
void sx1262_init();
|
|
||||||
void sx1262_reset();
|
|
||||||
void sx1262_wait_for_busy();
|
|
||||||
void sx1262_write_command(uint8_t cmd, uint8_t *data, uint8_t len);
|
|
||||||
void sx1262_read_command(uint8_t cmd, uint8_t *tx_payload_buffer, uint8_t tx_payload_len, uint8_t *rx_buffer, uint8_t len);
|
|
||||||
sx1262_status_t sx1262_get_status();
|
|
||||||
void sx1262_setSleep(uint8_t sleepCFG);
|
|
||||||
void sx1262_setStandby(uint8_t standbyConf);
|
|
||||||
void sx1262_setFrequencySynthesis();
|
|
||||||
void sx1262_setMode(uint8_t mode, uint32_t timeout);
|
|
||||||
void sx1262_stopTimerOnPreamble(uint8_t enable);
|
|
||||||
void sx1262_setRxDutyCycle(uint32_t rxPeriod, uint32_t sleepPeriod);
|
|
||||||
void sx1262_setChannelActivityDetection(void);
|
|
||||||
void sx1262_setTxContinuousWave(void);
|
|
||||||
void sx1262_setTxInfinitePreamble(void);
|
|
||||||
void sx1262_setRegulatorMode(uint8_t mode);
|
|
||||||
void sx1262_calibrate(uint8_t calibParam);
|
|
||||||
void sx1262_calibrateImage(uint8_t freq1, uint8_t freq2);
|
|
||||||
void sx1262_setRxTXFallbackMode(uint8_t fallbackMode);
|
|
||||||
void sx1262_writeRegister(uint16_t address, const uint8_t *data, size_t length);
|
|
||||||
void sx1262_readRegister(uint16_t address, uint8_t *data, size_t length);
|
|
||||||
void sx1262_writeBuffer(uint8_t offset, const uint8_t *data, size_t length);
|
|
||||||
void sx1262_readBuffer(uint8_t offset, uint8_t *data, size_t length);
|
|
||||||
void sx1262_setDioIrqParams(uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask, uint16_t dio3Mask);
|
|
||||||
uint16_t sx1262_getIrqStatus(void);
|
|
||||||
void sx1262_clearIrqStatus(uint16_t clearIrqParam);
|
|
||||||
void sx1262_setDIO2AsRfSwitchCtrl(uint8_t enable);
|
|
||||||
void sx1262_setDIO3AsTCXOCtrl(uint8_t tcxoVoltage, uint32_t delay);
|
|
||||||
void sx1262_setFrequency(uint32_t frequency);
|
|
||||||
uint8_t sx1262_getPacketType();
|
|
||||||
void sx1262_configure_tx_power(uint8_t paDutyCycle, uint8_t hpMax, uint8_t paLut, int8_t power, uint8_t rampTime);
|
|
||||||
void sx1262_setLoRaPacketParams(sx1262_LoRaPacketParams_t *params);
|
|
||||||
void sx1262_setCadParams(uint8_t cadSymbolNum, uint8_t cadDetPeak, uint8_t cadDetMin, uint8_t cadExitMode, uint32_t cadTimeout);
|
|
||||||
void sx1262_setBufferBaseAddress(uint8_t txBaseAddr, uint8_t rxBaseAddr);
|
|
||||||
void sx1262_setLoRaSymbNumTimeout(uint8_t symbNum);
|
|
||||||
void sx1262_getStatus(uint8_t *status);
|
|
||||||
void sx1262_getRxBufferStatus(uint8_t *payloadLengthRx, uint8_t *rxStartBufferPointer);
|
|
||||||
void sx1262_getPacketStatus(uint8_t *rssi, uint8_t *snr, uint8_t *signalRssi);
|
|
||||||
uint8_t sx1262_getRssiInst(uint8_t *rssiInst);
|
|
||||||
void sx1262_getStats(uint16_t *pktReceived, uint16_t *pktCrcError, uint16_t *pktHeaderErr);
|
|
||||||
void sx1262_resetStats(void);
|
|
||||||
uint16_t sx1262_getDeviceErrors();
|
|
||||||
void sx1262_clearDeviceErrors(void);
|
|
||||||
|
|
||||||
void sx1262_setLoRaModulationParams(const sx1262_LoRaModulationParams_t *params);
|
|
||||||
|
|
||||||
void sx1262_setGFSKModulationParams(const sx1262_GFSKModulationParams_t *params);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -64,6 +64,8 @@ void app_main(void)
|
|||||||
|
|
||||||
mcp23018_init();
|
mcp23018_init();
|
||||||
|
|
||||||
|
void servoControllerInit();
|
||||||
|
|
||||||
/* create task pinned to the app core */
|
/* create task pinned to the app core */
|
||||||
xTaskCreate(
|
xTaskCreate(
|
||||||
i2c_sensors_task,
|
i2c_sensors_task,
|
||||||
|
@@ -1091,6 +1091,8 @@ esp_err_t bme680_get_data(bme680_handle_t handle, bme680_data_t *const data) {
|
|||||||
data->heater_stable = adc_data.heater_stable;
|
data->heater_stable = adc_data.heater_stable;
|
||||||
data->gas_valid = adc_data.gas_valid;
|
data->gas_valid = adc_data.gas_valid;
|
||||||
|
|
||||||
|
data->raw_data = adc_data;
|
||||||
|
|
||||||
/* compute scores */
|
/* compute scores */
|
||||||
bme680_compute_iaq(data);
|
bme680_compute_iaq(data);
|
||||||
|
|
||||||
|
@@ -308,6 +308,22 @@ typedef struct bme680_cal_factors_s {
|
|||||||
int8_t range_switching_error;
|
int8_t range_switching_error;
|
||||||
} bme680_cal_factors_t;
|
} bme680_cal_factors_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief BME680 ADC data structure definition.
|
||||||
|
*/
|
||||||
|
typedef struct bme680_adc_data_s {
|
||||||
|
uint32_t temperature;
|
||||||
|
uint16_t humidity;
|
||||||
|
uint32_t pressure;
|
||||||
|
uint16_t gas;
|
||||||
|
bool gas_valid;
|
||||||
|
uint8_t gas_range;
|
||||||
|
uint8_t gas_index;
|
||||||
|
bool heater_stable;
|
||||||
|
} bme680_adc_data_t;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief BME680 data structure definition.
|
* @brief BME680 data structure definition.
|
||||||
*/
|
*/
|
||||||
@@ -325,22 +341,9 @@ typedef struct bme680_data_s {
|
|||||||
float temperature_score;
|
float temperature_score;
|
||||||
float humidity_score;
|
float humidity_score;
|
||||||
float gas_score;
|
float gas_score;
|
||||||
|
bme680_adc_data_t raw_data;
|
||||||
} bme680_data_t;
|
} bme680_data_t;
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief BME680 ADC data structure definition.
|
|
||||||
*/
|
|
||||||
typedef struct bme680_adc_data_s {
|
|
||||||
uint32_t temperature;
|
|
||||||
uint16_t humidity;
|
|
||||||
uint32_t pressure;
|
|
||||||
uint16_t gas;
|
|
||||||
bool gas_valid;
|
|
||||||
uint8_t gas_range;
|
|
||||||
uint8_t gas_index;
|
|
||||||
bool heater_stable;
|
|
||||||
} bme680_adc_data_t;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief BME680 configuration structure definition.
|
* @brief BME680 configuration structure definition.
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user