fix: 重构 EV1527 发射时序,使用硬件 Timer0 保证 100% 精准码宽延迟以成功触发接收机
This commit is contained in:
194
Drivers/rf.c
194
Drivers/rf.c
@@ -3,15 +3,15 @@
|
||||
#include "../App/rgb.h"
|
||||
#include "intrins.h"
|
||||
|
||||
// ATR5179 <EFBFBD><EFBFBD>Ƶǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD><EFBFBD>ؿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŷ<EFBFBD><EFBFBD><EFBFBD>
|
||||
sbit RF_TX = P2^0; // V1 <EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD> (1: ѡͨ<D1A1><CDA8><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD> TX ·<EFBFBD><EFBFBD>)
|
||||
sbit RF_RX = P3^7; // V2 <EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD> (1: ѡͨ<D1A1><CDA8><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD> RX ·<EFBFBD><EFBFBD>)
|
||||
// ATR5179 射频前端天线开关控制引脚定义
|
||||
sbit RF_TX = P2^0; // V1 控制端 (1: 选通天线到发射 TX 路径)
|
||||
sbit RF_RX = P3^7; // V2 控制端 (1: 选通天线到接收 RX 路径)
|
||||
|
||||
// <EFBFBD><EFBFBD>ƵоƬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŷ<EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD>°<EFBFBD> PCB <20><><EFBFBD>ŶԵ<C5B6><D4B5><EFBFBD><EFBFBD><EFBFBD>)
|
||||
sbit RF_TX_DAT = P2^1; // LR690L <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (DIN) - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Pin 22 (P2.1)
|
||||
sbit RF_RX_DATA = P3^6; // LR690L <EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (DATA) - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Pin 19 (P3.6)
|
||||
// 射频芯片数据与电源控制引脚定义 (根据新版 PCB 引脚对调修正)
|
||||
sbit RF_TX_DAT = P2^1; // LR690L 发射调制数据输入引脚 (DIN) - 物理连接 Pin 22 (P2.1)
|
||||
sbit RF_RX_DATA = P3^6; // LR690L 接收解调数据输出引脚 (DATA) - 物理连接 Pin 19 (P3.6)
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>ӡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><> system.c <EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD>)
|
||||
// 声明外部延时及串口打印函数 (在 system.c 中定义)
|
||||
extern void Delay_us(u16 us);
|
||||
extern void Delay_ms(u16 ms);
|
||||
extern u16 GetTimer0_Safe(void);
|
||||
@@ -24,156 +24,176 @@ extern void Uart_SendHex32(u32 val);
|
||||
extern void Uart_SendByte(u8 dat);
|
||||
|
||||
/**
|
||||
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƵоƬ<EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD> GPIO <20><><EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD>״̬
|
||||
* @brief 初始化无线射频芯片相关的 GPIO 引脚方向与状态
|
||||
*/
|
||||
void RF_Init(void)
|
||||
{
|
||||
// EAXFR = 1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܼĴ<EFBFBD><EFBFBD><EFBFBD> (XSFR)
|
||||
// EAXFR = 1 允许访问扩展特殊功能寄存器 (XSFR)
|
||||
EAXFR = 1;
|
||||
|
||||
// 1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> P2.0 (RF_TX) <EFBFBD><EFBFBD> P2.1 (RF_TX_DAT) Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ (M1=0, M0=1)
|
||||
// 1. 配置 P2.0 (RF_TX) 和 P2.1 (RF_TX_DAT) 为推挽输出模式 (M1=0, M0=1)
|
||||
P2M1 &= ~((1 << 0) | (1 << 1));
|
||||
P2M0 |= ((1 << 0) | (1 << 1));
|
||||
|
||||
// 2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> P3.7 (RF_RX) <EFBFBD><EFBFBD> P3.5 (SHUT) Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ (M1=0, M0=1)
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> P3.6 (RF_RX_DATA) Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ (M1=1, M0=0)<EFBFBD><EFBFBD>ƥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 2. 配置 P3.7 (RF_RX) 和 P3.5 (SHUT) 为推挽输出模式 (M1=0, M0=1)
|
||||
// 配置 P3.6 (RF_RX_DATA) 为高阻输入模式 (M1=1, M0=0)以匹配接收解调输入
|
||||
P3M1 &= ~((1 << 5) | (1 << 7));
|
||||
P3M1 |= (1 << 6);
|
||||
P3M0 &= ~(1 << 6);
|
||||
P3M0 |= ((1 << 5) | (1 << 7));
|
||||
|
||||
// 3. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳĬ<EFBFBD>ϵij<EFBFBD>ʼ<EFBFBD><EFBFBD>ƽ
|
||||
RF_TX = 0; // <EFBFBD>Ͽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ·
|
||||
SHUT = 1; // Ĭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SHUT<EFBFBD><EFBFBD>ʹ LR690L <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߹ر<EFBFBD>״̬
|
||||
RF_RX = 0; // <EFBFBD>Ͽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ·
|
||||
RF_TX_DAT = 0; // <EFBFBD><EFBFBD><EFBFBD>Ʒ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>
|
||||
// 3. 设置系统默认的初始电平
|
||||
RF_TX = 0; // 断开发射天线通路
|
||||
SHUT = 1; // 默认拉高 SHUT,使 LR690L 处于休眠关闭状态
|
||||
RF_RX = 0; // 断开接收天线通路
|
||||
RF_TX_DAT = 0; // 调制发送数据线置低
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>շ<EFBFBD>ϵͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>
|
||||
* @param mode <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ (0-<2D><><EFBFBD>߸<EFBFBD><DFB8><EFBFBD>, 1-<2D><><EFBFBD>չ<EFBFBD><D5B9><EFBFBD>, 2-<2D><><EFBFBD>乤<EFBFBD><E4B9A4>)
|
||||
* @brief 配置无线射频收发系统的运行模式与天线切换
|
||||
* @param mode 运行模式 (0-休眠隔离, 1-接收工作, 2-发射工作)
|
||||
*/
|
||||
void RF_SetMode(u8 mode)
|
||||
{
|
||||
if (mode == 0) // ====== ģʽ 0: <EFBFBD><EFBFBD><EFBFBD>߸<EFBFBD><EFBFBD><EFBFBD>ģʽ (Sleep/Idle) ======
|
||||
if (mode == 0) // ====== 模式 0: 休眠隔离模式 (Sleep/Idle) ======
|
||||
{
|
||||
SHUT = 1; // ǿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SHUT <20><><EFBFBD>ţ<EFBFBD>ʹ LR690L <20><><EFBFBD><EFBFBD><D7BD><EFBFBD><EFBFBD><EFBFBD><CDB9>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||||
RF_RX = 0; // <EFBFBD>رս<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD><EFBFBD>أ<EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>·
|
||||
RF_TX = 0; // <EFBFBD>رշ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD><EFBFBD><EFBFBD>
|
||||
SHUT = 1; // 强制拉高 SHUT 引脚,使 LR690L 彻底进入低功耗待机
|
||||
RF_RX = 0; // 关闭接收天线开关,防止外界电磁杂波串入接收电路
|
||||
RF_TX = 0; // 关闭发射天线开关
|
||||
}
|
||||
else if (mode == 1) // ====== ģʽ 1: <EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD><EFBFBD>ģʽ (RX Mode) ======
|
||||
else if (mode == 1) // ====== 模式 1: 接收工作模式 (RX Mode) ======
|
||||
{
|
||||
SHUT = 0; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> SHUT ʹ<EFBFBD><EFBFBD> LR690L оƬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
RF_TX = 0; // <EFBFBD>رշ<EFBFBD><EFBFBD>俪<EFBFBD><EFBFBD>
|
||||
RF_RX = 1; // ѡͨ<EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD> RX <20><><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD>ʹ<EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7>Ƶ<EFBFBD>Ŵ<EFBFBD>
|
||||
SHUT = 0; // 拉低 SHUT 使能 LR690L 芯片,开始解调接收
|
||||
RF_TX = 0; // 关闭发射开关
|
||||
RF_RX = 1; // 选通天线到 RX 接收路径,使能接收链路高频放大
|
||||
}
|
||||
else if (mode == 2) // ====== ģʽ 2: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>乤<EFBFBD><EFBFBD>ģʽ (TX Mode) ======
|
||||
else if (mode == 2) // ====== 模式 2: 发发射工作模式 (TX Mode) ======
|
||||
{
|
||||
SHUT = 1; // <EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>źŶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD>
|
||||
RF_RX = 0; // <EFBFBD>رս<EFBFBD><EFBFBD>տ<EFBFBD><EFBFBD><EFBFBD>
|
||||
RF_TX = 1; // ѡͨ<EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD> TX <20><><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>߷<EFBFBD><DFB7><EFBFBD>
|
||||
SHUT = 1; // 接收机停机,防止发射强信号顶坏接收前端
|
||||
RF_RX = 0; // 关闭接收开关
|
||||
RF_TX = 1; // 选通天线到 TX 发射路径,使能天线发射
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> EV1527 Э<>鵥<EFBFBD>ε<EFBFBD><CEB5>Ʒ<EFBFBD><C6B7><EFBFBD>һ֡ 24 λ<><CEBB>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD> (Sync + 24bit Data)
|
||||
* @brief 使用单片机硬件 Timer0 实现高精度发射电平时延控制
|
||||
* @param us 延时微秒数
|
||||
* @note STC32G 在 24MHz 晶振 12T 模式下,Timer0 的 1 tick 正好等于 0.5us (2MHz)
|
||||
*/
|
||||
void RF_Delay_us(u16 us)
|
||||
{
|
||||
u16 ticks = us * 2;
|
||||
TL0 = 0;
|
||||
TH0 = 0;
|
||||
TR0 = 1; // 启动定时器 0
|
||||
while (GetTimer0_Safe() < ticks);
|
||||
TR0 = 0; // 停止定时器 0
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 按照 EV1527 协议单次调制发送一帧 24 位射频数据 (Sync + 24bit Data)
|
||||
*/
|
||||
void EV1527_TxFrame(u32 addr, u8 dat)
|
||||
{
|
||||
u8 i;
|
||||
u32 tx_val;
|
||||
|
||||
// <EFBFBD>ϲ<EFBFBD> 20 λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD> 4 λ<><CEBB><EFBFBD><EFBFBD><EFBFBD>룬<EFBFBD><EBA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 24 λ<>ز<EFBFBD><D8B2><EFBFBD>
|
||||
// 合并 20 位地址与 4 位数据,成为 24 位完整 EV1527 帧
|
||||
tx_val = (addr << 4) | (dat & 0x0F);
|
||||
|
||||
// 1. ͬ<EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD>ߵ<EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1T (Լ 350us)<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 31T (Լ 10850us)
|
||||
// 1. 同步头脉冲: 高电平 1T (350us) + 低电平 31T (10850us)
|
||||
RF_TX_DAT = 1;
|
||||
Delay_us(350);
|
||||
RF_Delay_us(350);
|
||||
RF_TX_DAT = 0;
|
||||
Delay_us(10850);
|
||||
RF_Delay_us(10850);
|
||||
|
||||
// 2. <EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD><EFBFBD>Ʒ<EFBFBD><EFBFBD><EFBFBD> 24 λ<><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
||||
// 2. 依次发送 24 个数据位 (MSB First)
|
||||
for (i = 0; i < 24; i++)
|
||||
{
|
||||
if (tx_val & (0x800000UL >> i))
|
||||
{
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> "1"<22><><EFBFBD>ߵ<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD> 3T (1050us)<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1T (350us)
|
||||
// 逻辑 "1": 高电平 3T (1050us) + 低电平 1T (350us)
|
||||
RF_TX_DAT = 1;
|
||||
Delay_us(1050);
|
||||
RF_Delay_us(1050);
|
||||
RF_TX_DAT = 0;
|
||||
Delay_us(350);
|
||||
RF_Delay_us(350);
|
||||
}
|
||||
else
|
||||
{
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> "0"<22><><EFBFBD>ߵ<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD> 1T (350us)<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 3T (1050us)
|
||||
// 逻辑 "0": 高电平 1T (350us) + 低电平 3T (1050us)
|
||||
RF_TX_DAT = 1;
|
||||
Delay_us(350);
|
||||
RF_Delay_us(350);
|
||||
RF_TX_DAT = 0;
|
||||
Delay_us(1050);
|
||||
RF_Delay_us(1050);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>η<EFBFBD><EFBFBD><EFBFBD> EV1527 <20><>Ƶ֡<C6B5><D6A1><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9>֡<EFBFBD><D6A1>ʧ
|
||||
* @brief 调制发射 25 帧 EV1527 射频同步电平信号以确保接收侧可靠触发
|
||||
*/
|
||||
void EV1527_Transmit(u32 addr, u8 dat)
|
||||
{
|
||||
u8 i;
|
||||
RF_SetMode(2); // <EFBFBD>л<EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD>俪<EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD>
|
||||
Delay_ms(5); // <20>ȶ<EFBFBD><C8B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶͨ·
|
||||
u8 r;
|
||||
bit ea_bak = EA; // 备份并屏蔽全局中断,确保发射高低电平周期的绝对纯净与防抖
|
||||
EA = 0;
|
||||
|
||||
// ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 10 ֡<><D6A1>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD><D5B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1 ֡<><D6A1><EFBFBD><EFBFBD><DEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
for (i = 0; i < 10; i++)
|
||||
RF_SetMode(2); // 切换为发射状态,接通天线与射频模块通道
|
||||
Delay_ms(5); // 稍作延时使射频通路稳定
|
||||
|
||||
// 连续发射 25 帧以保证接收设备顺利锁定并解码
|
||||
for (r = 0; r < 25; r++)
|
||||
{
|
||||
EV1527_TxFrame(addr, dat);
|
||||
Delay_ms(10); // ֡<>䱣<EFBFBD><E4B1A3><EFBFBD><EFBFBD>ʱ
|
||||
// 去除帧与帧之间可能导致波形不连续的 Delay_ms
|
||||
}
|
||||
|
||||
RF_TX_DAT = 0; // <EFBFBD><EFBFBD><EFBFBD>㷢<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
RF_SetMode(1); // <EFBFBD><EFBFBD><EFBFBD>»ָ<EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⷴ<EFBFBD><EFBFBD>
|
||||
RF_TX_DAT = 0; // 结束发射,拉低数据脚
|
||||
RF_SetMode(1); // 恢复为常态后台接收模式
|
||||
|
||||
EA = ea_bak; // 还原全局中断开关状态
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief <EFBFBD><EFBFBD>ȡ<EFBFBD>ض<EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD>ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD> Timer0 Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
* @brief 获取特定电平引脚状态的持续微秒时间 (利用 Timer0 硬件测量)
|
||||
*/
|
||||
u16 GetPulseDuration(u8 state, u16 timeout_us)
|
||||
{
|
||||
u16 timeout_ticks;
|
||||
|
||||
// ǿ<EFBFBD>ƹر<EFBFBD> Timer0 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>㸴λ
|
||||
// 强制关闭 Timer0 计数器,并将其计数值清零复位
|
||||
TR0 = 0;
|
||||
TMOD &= 0xF0; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Timer0 <EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>Ϊģʽ 0 (16λ<36>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>)
|
||||
TMOD &= 0xF0; // 设置 Timer0 寄存器为模式 0 (16位自动重载)
|
||||
TL0 = 0x00;
|
||||
TH0 = 0x00;
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 16 λ<><CEBB>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ticks <20><>ʱֵ (<28><> 1T ģʽ 24MHz <EFBFBD>£<EFBFBD>1 Tick = 1 / 24M = 0.0416us)
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ Timer0 Ĭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ 12T ģʽ (1 Tick = 12 / 24MHz = 0.5us)
|
||||
// 换算 16 位定时器所需的最大 ticks 超时值 (在 1T 模式 24MHz 下,1 Tick = 1 / 24M = 0.0416us)
|
||||
// 但此系统 Timer0 默认配置为 12T 模式 (1 Tick = 12 / 24MHz = 0.5us)
|
||||
timeout_ticks = (u16)((u32)timeout_us * (MAIN_Fosc / 1000000UL) / 12UL);
|
||||
|
||||
TR0 = 1; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Timer0 Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
TR0 = 1; // 启动 Timer0 硬件计数器
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ƽ״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϣ<EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ
|
||||
// 根据要捕获的电平状态进行阻塞判断,直到电平发生翻转或计数超时
|
||||
while (RF_RX_DATA == state)
|
||||
{
|
||||
if (GetTimer0_Safe() > timeout_ticks)
|
||||
{
|
||||
TR0 = 0;
|
||||
return 0; // <EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0
|
||||
return 0; // 判定超时,返回 0
|
||||
}
|
||||
}
|
||||
TR0 = 0; // <EFBFBD>ض϶<EFBFBD>ʱ<EFBFBD><EFBFBD>
|
||||
TR0 = 0; // 关断定时器
|
||||
|
||||
return (u16)((u32)GetTimer0_Safe() * 12UL / (MAIN_Fosc / 1000000UL));
|
||||
}
|
||||
|
||||
// ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>ź<EFBFBD>ȫ<EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 模拟射频信号全局变量定义
|
||||
volatile u32 mock_rx_addr = 0;
|
||||
volatile u8 mock_rx_data = 0;
|
||||
volatile bit mock_rf_ready = 0;
|
||||
|
||||
/**
|
||||
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD>Ⲣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><EFBFBD><EFBFBD> EV1527 <20><>Ƶ<EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD>֡
|
||||
* @brief 阻塞式检测并解码一个合法的 EV1527 射频信号数据帧
|
||||
*/
|
||||
bit EV1527_Decode(u32 *out_addr, u8 *out_data)
|
||||
{
|
||||
@@ -185,7 +205,7 @@ bit EV1527_Decode(u32 *out_addr, u8 *out_data)
|
||||
u16 idata raw_h[24];
|
||||
u16 idata raw_l[24];
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 检查模拟射频触发
|
||||
if (mock_rf_ready) {
|
||||
mock_rf_ready = 0;
|
||||
*out_addr = mock_rx_addr;
|
||||
@@ -193,14 +213,14 @@ bit EV1527_Decode(u32 *out_addr, u8 *out_data)
|
||||
return 1;
|
||||
}
|
||||
|
||||
// ====== 1. ͬ<EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>岶<EFBFBD><EFBFBD> ======
|
||||
// ====== 1. 同步头引导脉冲捕获 ======
|
||||
{
|
||||
u16 wait_cnt = 0;
|
||||
while (RF_RX_DATA == 1)
|
||||
{
|
||||
Delay_us(5);
|
||||
wait_cnt++;
|
||||
if (wait_cnt > 2000) // 10 <EFBFBD><EFBFBD><EFBFBD>볬ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (wait_cnt > 2000) // 10 毫秒超时保护
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -209,28 +229,28 @@ bit EV1527_Decode(u32 *out_addr, u8 *out_data)
|
||||
{
|
||||
Delay_us(5);
|
||||
wait_cnt++;
|
||||
if (wait_cnt > 4000) // 20 <EFBFBD><EFBFBD><EFBFBD>볬ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (wait_cnt > 4000) // 20 毫秒超时保护
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>ߵ<EFBFBD>ƽʱ<EFBFBD><EFBFBD>
|
||||
// 捕获引导头高电平时间
|
||||
high_time = GetPulseDuration(1, 2500);
|
||||
if (high_time < 50 || high_time > 2500) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 31T <20>͵<EFBFBD>ƽʱ<C6BD><CAB1>
|
||||
// 捕获引导头后续的 31T 低电平时间
|
||||
low_time = GetPulseDuration(0, 60000);
|
||||
if (low_time < 1500 || low_time > 60000) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD>ʱ<EFBFBD><EFBFBD> T <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD>ȼ<EFBFBD>Ϊ 1T)
|
||||
// 同步引导脉冲的基准时间 T 计算 (引导脉冲高电平宽度即为 1T)
|
||||
T = high_time;
|
||||
if (T < 100 || T > 800) return 0; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>Χ<EFBFBD><EFBFBD>: 100us ~ 800us
|
||||
if (T < 100 || T > 800) return 0; // 自适应范围限幅: 100us ~ 800us
|
||||
|
||||
// ====== 2. <EFBFBD><EFBFBD><EFBFBD>ν<EFBFBD><EFBFBD><EFBFBD> 24 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD> ======
|
||||
// ====== 2. 依次解析 24 个数据位脉宽 ======
|
||||
for (i = 0; i < 24; i++)
|
||||
{
|
||||
raw_h[i] = GetPulseDuration(1, 2000);
|
||||
@@ -240,15 +260,15 @@ bit EV1527_Decode(u32 *out_addr, u8 *out_data)
|
||||
if (raw_l[i] == 0) return 0;
|
||||
}
|
||||
|
||||
// ====== 3. ˫<EFBFBD>˱<EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ======
|
||||
// ====== 3. 双端比值解调判定数据内容 ======
|
||||
for (i = 0; i < 24; i++)
|
||||
{
|
||||
u16 total = raw_h[i] + raw_l[i];
|
||||
if (total < T * 3 || total > T * 6) return 0; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 3T~6T ֮<EFBFBD><EFBFBD>
|
||||
if (total < T * 3 || total > T * 6) return 0; // 单个数据位周期必须在 3T~6T 之间
|
||||
|
||||
if (raw_h[i] > raw_l[i] * 2)
|
||||
{
|
||||
// <EFBFBD>ߵ<EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD>Գ<EFBFBD><EFBFBD>ڵ͵<EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "1"
|
||||
// 高电平明显长于低电平,代表逻辑 "1"
|
||||
if (i < 20)
|
||||
addr = (addr << 1) | 1;
|
||||
else
|
||||
@@ -256,7 +276,7 @@ bit EV1527_Decode(u32 *out_addr, u8 *out_data)
|
||||
}
|
||||
else if (raw_l[i] > raw_h[i] * 2)
|
||||
{
|
||||
// <EFBFBD>͵<EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD>Գ<EFBFBD><EFBFBD>ڸߵ<EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "0"
|
||||
// 低电平明显长于高电平,代表逻辑 "0"
|
||||
if (i < 20)
|
||||
addr = (addr << 1);
|
||||
else
|
||||
@@ -264,18 +284,18 @@ bit EV1527_Decode(u32 *out_addr, u8 *out_data)
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0; // <EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>Ϲ棬<EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><EFBFBD><EFBFBD>䣬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
return 0; // 电平脉冲比值不合规,判定数据帧畸变,解码作废
|
||||
}
|
||||
}
|
||||
|
||||
// У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 校验无误,输出解调数据
|
||||
*out_addr = addr;
|
||||
*out_data = dat;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief RF <EFBFBD>շ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϲ<EFBFBD><EFBFBD>Թ<EFBFBD><EFBFBD><EFBFBD> (֧<>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>ӡ)
|
||||
* @brief RF 收发诊断测试功能 (支持发送与接收监听打印)
|
||||
*/
|
||||
void RF_DiagnosticMode(char choice)
|
||||
{
|
||||
@@ -283,23 +303,23 @@ void RF_DiagnosticMode(char choice)
|
||||
{
|
||||
u8 i;
|
||||
Uart_SendString("=== RF TX Test: Transmitting 20 test frames... ===\r\n");
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD><EFBFBD><EFBFBD>
|
||||
// 开启发射模式并配置天线开关
|
||||
RF_SetMode(2);
|
||||
Delay_ms(5);
|
||||
|
||||
for (i = 0; i < 20; i++)
|
||||
{
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD>η<EFBFBD><EFBFBD>Ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸
|
||||
// 连续发送测试包,每次发送伴随马达短震及指示灯闪烁
|
||||
MOTOR = 1;
|
||||
RGB_Send(0, 150, 0, 0, 150, 0); // <EFBFBD>̹<EFBFBD><EFBFBD><EFBFBD>˸
|
||||
RGB_Send(0, 150, 0, 0, 150, 0); // 绿光闪烁
|
||||
EV1527_TxFrame(0x37A86UL, 0x01);
|
||||
MOTOR = 0;
|
||||
RGB_Send(0, 0, 0, 0, 0, 0);
|
||||
|
||||
Delay_ms(150); // ֡<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
Delay_ms(150); // 帧间隔
|
||||
}
|
||||
RF_TX_DAT = 0;
|
||||
RF_SetMode(1); // <EFBFBD><EFBFBD><EFBFBD>»ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
|
||||
RF_SetMode(1); // 重新恢复接收模式
|
||||
Uart_SendString("[RF] Transmit Done!\r\n");
|
||||
}
|
||||
else if (choice == 'r')
|
||||
@@ -309,10 +329,10 @@ void RF_DiagnosticMode(char choice)
|
||||
u8 rx_data;
|
||||
|
||||
Uart_SendString("=== RF RX Test: Listening for 5 seconds... ===\r\n");
|
||||
RF_SetMode(1); // <EFBFBD><EFBFBD><EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
RF_SetMode(1); // 配置进入接收模式并使能天线
|
||||
Delay_ms(10);
|
||||
|
||||
// 5<EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 5秒的非阻塞监听
|
||||
for (wait_ms = 0; wait_ms < 5000; wait_ms++)
|
||||
{
|
||||
if (EV1527_Decode(&rx_addr, &rx_data))
|
||||
@@ -323,7 +343,7 @@ void RF_DiagnosticMode(char choice)
|
||||
Uart_SendHex8(rx_data);
|
||||
Uart_SendString("\r\n");
|
||||
|
||||
// <EFBFBD>յ<EFBFBD><EFBFBD>źź<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 收到信号后马达震动并亮青色灯提醒
|
||||
MOTOR = 1;
|
||||
RGB_Send(0, 150, 150, 0, 150, 150);
|
||||
Delay_ms(100);
|
||||
|
||||
Reference in New Issue
Block a user