106 lines
3.0 KiB
C
106 lines
3.0 KiB
C
#include "STC8_SDCC.H"
|
|
|
|
/* ========================================================================
|
|
* 系统常量
|
|
* ======================================================================== */
|
|
#define UART_BUF_SIZE 32
|
|
|
|
/* 接收状态 */
|
|
#define RX_STATE_DISCONNECTED 0
|
|
#define RX_STATE_BINDING 1
|
|
#define RX_STATE_CONNECTED 2
|
|
|
|
/* EEPROM 地址 (IAP) */
|
|
#define EEPROM_ADDR_BIND_FLAG 0x0000
|
|
#define EEPROM_ADDR_TX_ADDR 0x0001 /* 5字节 */
|
|
#define EEPROM_ADDR_RF_CH 0x0006
|
|
#define EEPROM_ADDR_BIND_PHRASE 0x0007 /* 6字节 */
|
|
#define EEPROM_BIND_MAGIC 0x5A /* 已对频标志 */
|
|
|
|
/* 数据包格式 (与发射机一致) */
|
|
#define RF_SYNC_BYTE0 0xAA
|
|
#define RF_SYNC_BYTE1 0x55
|
|
#define RF_PACKET_SIZE 32
|
|
#define RF_PHRASE_LEN 6
|
|
|
|
/* LED 闪烁模式 */
|
|
#define UNCONNECTED 0 /* 1Hz - 未连接 */
|
|
#define NRF_BINDING 1 /* 3Hz - 对频中 */
|
|
#define CONNECTED 2 /* 常亮 - 已连接 */
|
|
#define NRF_ERROR 4 /* 双闪 - NRF硬件错误 */
|
|
/* UART运行模式 */
|
|
#define UART_CMD 0
|
|
#define UART_SBUS 1
|
|
#define UART_CRSF 2
|
|
|
|
/* ========================================================================
|
|
* 全局变量
|
|
* ======================================================================== */
|
|
|
|
// 配置信息
|
|
struct CONFIG
|
|
{
|
|
// 运行模式
|
|
uint8 RunMode;
|
|
// nrf24使用的通道
|
|
uint8 NrfCH;
|
|
// nrf24使用的对频短语
|
|
uint8 BindPhr[6];
|
|
// nrf24地址,40位
|
|
uint8 RxAddr[5];
|
|
// 对频标志
|
|
uint8 BindMagic;
|
|
// 记录的发射机地址
|
|
uint8 TxAddr[5];
|
|
// 回传频率
|
|
uint8 TelemRate;
|
|
} Config;
|
|
|
|
// nrf24l01接收的数据
|
|
struct RFDATA
|
|
{
|
|
// nrf24l01一次性接收32byte数据
|
|
uint8 RefreshRate;
|
|
uint16 CH[15];
|
|
uint8 end;
|
|
} RF_Data;
|
|
|
|
// 系统滴答定时器计数 (用于LED闪烁)
|
|
static uint8 sys_tick = 0;
|
|
|
|
/* PWM 通道脉宽值 (4us单位, 放在 xdata) */
|
|
static volatile uint16_t __xdata pwm_ch[CHANNEL_COUNT];
|
|
|
|
/* 接收状态 */
|
|
static uint8_t rx_state = RX_STATE_DISCONNECTED;
|
|
static uint8_t out_mode = OUT_MODE_PWM;
|
|
|
|
/* 对频信息 (放在 xdata) */
|
|
static uint8_t __xdata bind_phrase[RF_PHRASE_LEN] = "LOVE";
|
|
static uint8_t __xdata tx_addr[NRF_ADDR_WIDTH] = {0xE7, 0xE7, 0xE7, 0xE7, 0xE7};
|
|
static uint8_t rf_channel = 40;
|
|
|
|
/* 信号丢失计数 */
|
|
static uint16_t lost_packet_cnt = 0;
|
|
#define LOST_PACKET_TIMEOUT 500 /* 500次接收超时后判丢失 (~5秒 @ 100Hz) */
|
|
|
|
/* NRF 硬件错误标志 */
|
|
static uint8_t nrf_hw_error = 0;
|
|
|
|
/* 电池电压 */
|
|
static volatile uint16_t bat_voltage_mv = 0;
|
|
|
|
/* 回传数据 */
|
|
static uint8_t telem_rssi = 0; /* 信号强度 (0-100) */
|
|
static uint8_t telem_packet_loss = 0; /* 丢包率 (0-100%) */
|
|
static uint8_t telem_rate_hz = 2; /* 回传频率 1-10Hz, 默认2Hz */
|
|
|
|
/* CRFS 模式下接收的飞控转发数据 */
|
|
static uint8_t __xdata crfs_forward_buf[24];
|
|
static uint8_t crfs_forward_len = 0;
|
|
|
|
/* 定时器计数 (用于LED闪烁) */
|
|
static volatile uint16_t sys_tick = 0;
|
|
|
|
void (*code runModel)(void) = PwmModel;
|
|
void (*code outputFun)(void) = PwmUpdate; |