sx126x busy引脚状态
时间: 2023-08-03 07:47:56 浏览: 70
SX126x芯片的BUSY引脚表示的是芯片的忙碌状态。当SX126x正在进行发送或接收等操作时,BUSY引脚会处于高电平状态。当芯片处于空闲状态时,BUSY引脚会处于低电平状态。因此,通过检测SX126x的BUSY引脚状态,可以确定芯片当前是否忙碌。需要注意的是,不同的SX126x模块可能会有不同的BUSY引脚接口和电平定义,请参考具体模块的数据手册。
相关问题
sx126x.c具体内容
`sx126x.c` 是 SX126x 芯片驱动的具体实现代码,主要包括对 SX126x 芯片进行初始化、配置、发送和接收等操作的函数。
以下是 `sx126x.c` 的主要内容:
1. 宏定义和数据结构
定义了一些宏和数据结构,用于方便进行配置、控制和数据传输等操作。例如:
```c
// 定义了一些寄存器地址的宏
#define SX126X_REG_OPMODE ( 0x01U )
#define SX126X_REG_MODEM_CONFIG1 ( 0x1DU )
#define SX126X_REG_MODEM_CONFIG2 ( 0x1EU )
#define SX126X_REG_MODEM_CONFIG3 ( 0x26U )
#define SX126X_REG_PREAMBLE_LENGTH_MSB ( 0x20U )
#define SX126X_REG_PREAMBLE_LENGTH_LSB ( 0x21U )
// 定义了一些数据结构,用于方便进行配置和数据传输等操作
typedef enum
{
SX126X_MODE_RX = 0x00,
SX126X_MODE_TX = 0x01,
SX126X_MODE_CAD = 0x02
} sx126x_mode_t;
typedef struct sx126x_s
{
spi_device_handle_t spi_device;
gpio_num_t cs_pin;
gpio_num_t busy_pin;
sx126x_mode_t mode;
bool packet_crc_on;
uint32_t frequency;
uint8_t tx_power;
bool lora;
uint8_t bandwidth;
uint8_t spreading_factor;
uint8_t coding_rate;
uint16_t preamble_length;
uint8_t payload_len;
uint8_t payload[256];
} sx126x_t;
```
2. SPI通信函数
定义了一些 SPI 通信函数,用于与 SX126x 芯片进行数据传输。例如:
```c
// SPI 读写函数
static int sx126x_spi_write_read(const sx126x_t* sx126x, const uint8_t* tx_buf, uint8_t* rx_buf, size_t len)
{
spi_transaction_t trans = {
.flags = SPI_TRANS_USE_TXDATA | SPI_TRANS_USE_RXDATA,
.length = 8 * len,
.tx_data = tx_buf,
.rx_data = rx_buf,
.user = (void*)sx126x->cs_pin
};
return spi_device_transmit(sx126x->spi_device, &trans);
}
// SPI 写函数
static int sx126x_spi_write(const sx126x_t* sx126x, const uint8_t* tx_buf, size_t len)
{
spi_transaction_t trans = {
.flags = SPI_TRANS_USE_TXDATA,
.length = 8 * len,
.tx_data = tx_buf,
.user = (void*)sx126x->cs_pin
};
return spi_device_transmit(sx126x->spi_device, &trans);
}
```
3. 初始化函数
定义了初始化函数 `sx126x_init()`,用于初始化 SX126x 芯片。包括设置 SPI 通信参数、复位 SX126x 芯片、等待芯片初始化完成等操作。例如:
```c
void sx126x_init(sx126x_t* sx126x)
{
// 设置 SPI 通信参数
spi_bus_config_t spi_bus_config = {
.miso_io_num = SX126X_MISO_PIN,
.mosi_io_num = SX126X_MOSI_PIN,
.sclk_io_num = SX126X_SCK_PIN,
.quadwp_io_num = -1,
.quadhd_io_num = -1,
.max_transfer_sz = 0
};
spi_device_interface_config_t spi_device_config = {
.clock_speed_hz = 1 * 1000 * 1000,
.mode = 0,
.spics_io_num = sx126x->cs_pin,
.queue_size = 1
};
spi_bus_initialize(SPI_HOST, &spi_bus_config, 0);
spi_bus_add_device(SPI_HOST, &spi_device_config, &sx126x->spi_device);
// 复位 SX126x 芯片
gpio_set_level(sx126x->cs_pin, 1);
gpio_set_direction(sx126x->cs_pin, GPIO_MODE_OUTPUT);
gpio_set_direction(sx126x->busy_pin, GPIO_MODE_INPUT);
gpio_set_pull_mode(sx126x->busy_pin, GPIO_PULLUP_ONLY);
sx126x_reset(sx126x);
sx126x_wakeup(sx126x);
// 等待芯片初始化完成
while (!sx126x_is_in_sleep_mode(sx126x))
{
vTaskDelay(10 / portTICK_PERIOD_MS);
}
}
```
4. 接收和发送函数
定义了接收和发送函数,用于接收和发送数据。例如:
```c
// 接收函数
void sx126x_receive(sx126x_t* sx126x)
{
sx126x_set_rx(sx126x, sx126x->frequency);
sx126x->mode = SX126X_MODE_RX;
}
// 发送函数
void sx126x_send(sx126x_t* sx126x)
{
sx126x_set_tx(sx126x, sx126x->frequency);
sx126x->mode = SX126X_MODE_TX;
sx126x_write_payload(sx126x, sx126x->payload, sx126x->payload_len);
}
```
5. 常用配置函数
定义了一些常用的配置函数,用于配置 SX126x 芯片的参数,例如设置频率、发射功率、带宽、扩频因子、编码率、CRC 校验等。例如:
```c
// 设置频率
void sx126x_set_frequency(sx126x_t* sx126x, uint32_t frequency)
{
sx126x_set_standby(sx126x);
sx126x_set_rf_frequency(sx126x, frequency);
sx126x->frequency = frequency;
}
// 设置发射功率
void sx126x_set_tx_power(sx126x_t* sx126x, uint8_t power)
{
sx126x_set_tx_power_config(sx126x, power, SX126X_PA_CONFIG_SX1261);
sx126x->tx_power = power;
}
// 设置带宽、扩频因子、编码率
void sx126x_set_lora_parameters(sx126x_t* sx126x, uint8_t bandwidth, uint8_t spreading_factor, uint8_t coding_rate)
{
sx126x_set_lora_mod_params(sx126x, bandwidth, spreading_factor, coding_rate);
sx126x->bandwidth = bandwidth;
sx126x->spreading_factor = spreading_factor;
sx126x->coding_rate = coding_rate;
}
// 设置 CRC 校验
void sx126x_set_packet_crc_on(sx126x_t* sx126x, bool on)
{
sx126x_set_packet_params(sx126x, sx126x->preamble_length, on, SX126X_VARIABLE_LENGTH, SX126X_CRC_2_BYTES_INV);
sx126x->packet_crc_on = on;
}
```
6. CAD 函数
定义了 CAD 函数,用于进行信道活动检测。例如:
```c
// 设置 CAD 模式
void sx126x_set_cad_mode(sx126x_t* sx126x)
{
sx126x_set_standby(sx126x);
sx126x_set_cad(sx126x);
sx126x->mode = SX126X_MODE_CAD;
}
// 开始 CAD 操作
void sx126x_start_cad(sx126x_t* sx126x)
{
sx126x_set_cad(sx126x);
sx126x_set_dio_irq_params(sx126x, SX126X_IRQ_CAD_DONE | SX126X_IRQ_CAD_ACTIVITY_DETECTED, SX126X_IRQ_CAD_DONE | SX126X_IRQ_CAD_ACTIVITY_DETECTED, SX126X_IRQ_RADIO_NONE, SX126X_IRQ_RADIO_NONE);
sx126x_set_rx(sx126x, sx126x->frequency);
sx126x->mode = SX126X_MODE_CAD;
}
// 获取 CAD 操作结果
sx126x_cad_result_t sx126x_get_cad_result(sx126x_t* sx126x)
{
uint8_t irq_status = sx126x_get_irq_status(sx126x);
if (irq_status & SX126X_IRQ_CAD_DONE)
{
if (irq_status & SX126X_IRQ_CAD_ACTIVITY_DETECTED)
{
return SX126X_CAD_DETECTED;
}
else
{
return SX126X_CAD_IDLE;
}
}
else
{
return SX126X_CAD_BUSY;
}
}
```
以上是 `sx126x.c` 的大致内容,具体实现还需根据 SX126x 芯片的功能和硬件环境进行修改。
sx126x.h具体内容
以下是 SX126x.h 文件的具体内容,它是 SX126x 驱动程序的头文件,包含了所有的函数定义和相关的结构体定义。
```
#ifndef __SX126X_H__
#define __SX126X_H__
#include "driver/spi_master.h"
#include "driver/gpio.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
spi_device_handle_t spi;
gpio_num_t nss_pin;
gpio_num_t busy_pin;
gpio_num_t dio1_pin;
void (*cad_detected)(struct sx126x_s *);
} sx126x_t;
typedef enum {
SX126X_REGULATOR_LDO = 0x00,
SX126X_REGULATOR_DCDC = 0x01
} sx126x_regulator_mode_t;
typedef enum {
SX126X_CHIP_MODE_RESET = 0x00,
SX126X_CHIP_MODE_STANDBY_RC = 0x01,
SX126X_CHIP_MODE_STANDBY_XOSC = 0x02,
SX126X_CHIP_MODE_FS = 0x03,
SX126X_CHIP_MODE_RX = 0x04,
SX126X_CHIP_MODE_TX = 0x05,
SX126X_CHIP_MODE_CAD = 0x06
} sx126x_chip_mode_t;
typedef enum {
SX126X_TCXO_CTRL_1_7V = 0x00,
SX126X_TCXO_CTRL_2_2V = 0x01,
SX126X_TCXO_CTRL_1_6V = 0x02,
SX126X_TCXO_CTRL_1_1V = 0x03
} sx126x_tcxo_ctrl_v_t;
typedef enum {
SX126X_PA_CONFIG_HP_MAX = 0x00,
SX126X_PA_CONFIG_HP_BOOST = 0x01,
SX126X_PA_CONFIG_HP_LOW = 0x02,
SX126X_PA_CONFIG_LP_MAX = 0x03,
SX126X_PA_CONFIG_LP_BOOST = 0x04,
SX126X_PA_CONFIG_LP_LOW = 0x05
} sx126x_pa_config_t;
typedef enum {
SX126X_PA_RAMP_10_US = 0x00,
SX126X_PA_RAMP_20_US = 0x01,
SX126X_PA_RAMP_40_US = 0x02,
SX126X_PA_RAMP_80_US = 0x03,
SX126X_PA_RAMP_200_US = 0x04,
SX126X_PA_RAMP_800_US = 0x05,
SX126X_PA_RAMP_1700_US = 0x06,
SX126X_PA_RAMP_3400_US = 0x07
} sx126x_pa_ramp_t;
typedef enum {
SX126X_LORA_SF5 = 0x05,
SX126X_LORA_SF6 = 0x06,
SX126X_LORA_SF7 = 0x07,
SX126X_LORA_SF8 = 0x08,
SX126X_LORA_SF9 = 0x09,
SX126X_LORA_SF10 = 0x0A,
SX126X_LORA_SF11 = 0x0B,
SX126X_LORA_SF12 = 0x0C
} sx126x_lora_spreading_factor_t;
typedef enum {
SX126X_LORA_BW_125_KHZ = 0x00,
SX126X_LORA_BW_250_KHZ = 0x01,
SX126X_LORA_BW_500_KHZ = 0x02
} sx126x_lora_bandwidth_t;
typedef enum {
SX126X_LORA_CR_4_5 = 0x01,
SX126X_LORA_CR_4_6 = 0x02,
SX126X_LORA_CR_4_7 = 0x03,
SX126X_LORA_CR_4_8 = 0x04
} sx126x_lora_coding_rate_t;
void sx126x_reset(sx126x_t *dev);
void sx126x_write_command(sx126x_t *dev, uint8_t cmd);
void sx126x_write_command_payload(sx126x_t *dev, uint8_t cmd, const uint8_t *payload, uint8_t size);
void sx126x_read_command_payload(sx126x_t *dev, uint8_t cmd, uint8_t *payload, uint8_t size);
void sx126x_write_register(sx126x_t *dev, uint16_t addr, const uint8_t *data, uint8_t size);
void sx126x_read_register(sx126x_t *dev, uint16_t addr, uint8_t *data, uint8_t size);
void sx126x_set_sleep(sx126x_t *dev, uint8_t sleep_cfg);
void sx126x_set_standby(sx126x_t *dev, sx126x_chip_mode_t chip_mode);
void sx126x_set_fs(sx126x_t *dev);
void sx126x_set_tx(sx126x_t *dev, uint32_t timeout);
void sx126x_set_rx(sx126x_t *dev, uint32_t timeout);
void sx126x_set_cad(sx126x_t *dev);
void sx126x_set_buffer_base_address(sx126x_t *dev, uint8_t tx_base_addr, uint8_t rx_base_addr);
void sx126x_set_lora_sync_word(sx126x_t *dev, uint8_t sync_word);
void sx126x_set_lora_symb_num_timeout(sx126x_t *dev, uint16_t symb_num);
void sx126x_set_lora_preamble_length(sx126x_t *dev, uint16_t preamble_length);
void sx126x_set_lora_payload_length(sx126x_t *dev, uint8_t payload_length);
void sx126x_set_lora_crc(sx126x_t *dev, bool enable_crc);
void sx126x_set_lora_coding_rate(sx126x_t *dev, sx126x_lora_coding_rate_t coding_rate);
void sx126x_set_lora_bandwidth(sx126x_t *dev, sx126x_lora_bandwidth_t bandwidth);
void sx126x_set_lora_spreading_factor(sx126x_t *dev, sx126x_lora_spreading_factor_t spreading_factor);
void sx126x_set_tx_params(sx126x_t *dev, int8_t power, sx126x_pa_ramp_t ramp_time);
void sx126x_set_cad_params(sx126x_t *dev, uint8_t cad_symb_num, uint8_t cad_detect_peak);
void sx126x_set_pa_config(sx126x_t *dev, sx126x_pa_config_t pa_config, uint8_t pa_duty_cycle, uint8_t hp_max, uint8_t device_sel);
void sx126x_set_regulator_mode(sx126x_t *dev, sx126x_regulator_mode_t mode);
void sx126x_set_tcxo_mode(sx126x_t *dev, bool use_ext, sx126x_tcxo_ctrl_v_t v_tcxo);
void sx126x_set_dio2_as_rf_sw_ctrl(sx126x_t *dev, bool enable);
void sx126x_set_dio3_as_tcxo_ctrl(sx126x_t *dev, sx126x_tcxo_ctrl_v_t tcxo_voltage);
void sx126x_set_dio3_as_int_ctrl(sx126x_t *dev, bool enable);
void sx126x_set_dio4_as_pll_lock(sx126x_t *dev);
void sx126x_set_dio5_as_mode_ready(sx126x_t *dev);
bool sx126x_get_irq_status_lora_rx_done(sx126x_t *dev);
bool sx126x_get_irq_status_lora_tx_done(sx126x_t *dev);
bool sx126x_get_irq_status_cad_detected(sx126x_t *dev);
bool sx126x_is_tx_done(sx126x_t *dev);
bool sx126x_is_rx_done(sx126x_t *dev);
bool sx126x_is_cad_detected(sx126x_t *dev);
void sx126x_clear_irq_status(sx126x_t *dev);
void sx126x_process_irq(sx126x_t *dev);
#ifdef __cplusplus
}
#endif
#endif /* __SX126X_H__ */
```