简介:一套面向STM32嵌入式开发的完整源码工程,实现了对实时时钟芯片RTC6715的驱动控制,主要解决单片机通过SPI总线配置RTC6715频率、读取当前时间以及寄存器操作等实际问题,适合正在调试外接RTC模块的嵌入式工程师参考。RAR压缩包大小为2.33MB,共151个文件,其中33个H头文件与32个C源文件构成核心代码,另有O目标文件、S启动文件、MAP映射文件及UVPROJ工程文件,便于阅读、移植和重新编译。工程中已封装多个功能函数,如频率设置、时间读取,可直接复用;同时包含标准外设库相关文件,可对照学习SPI通信时序、命令字节构造及芯片数据手册中的寄存器映射。已有327人下载学习,资源整体结构清晰,适合需要快速获取STM32驱动RTC6715参考实现的开发者。
1. STM32 驱动 RTC6715 的源码,到底在驱动什么
做图传接收、无线影音模块、射频测试工具的人,大概率都遇到过这种情况:拿到一块 RTC6715 接收模组,接上摄像头发射机,翻遍全网找不到一份能直接用的 STM32 驱动源码,好不容易找到一份却不知道对不对、怎么改。RTC6715 是一颗单芯片射频接收前端,它负责把 5.8GHz 附近的射频信号下变频成基带信号输出给后端解码,但芯片本身不会自己决定工作在哪个频点,也不会告诉你信号强度够不够——这些事需要一颗 MCU 通过串行接口写寄存器、读状态、采集模拟量来完成。这篇笔记就是把「STM32 驱动 RTC6715 的源码」这件事拆开讲清楚:芯片侧到底需要 MCU 做什么、代码怎么写、参数怎么调、上电后怎么验证。适合正在做图传接收端、航拍接收机或者想用现成射频前端自己攒一套接收链路的人,新手能照着把工程跑起来,熟手可以重点看后面分频计算和避坑的部分。
2. 动驱动之前:RTC6715 的通信机制与最小系统构成
2.1 芯片侧的三个职责:分频、锁相、输出
RTC6715 这类射频前端的内部结构其实可以简化成三块:本振分频器、锁相环、混频和放大链路。MCU 通过串行接口告诉分频器应该把参考时钟倍频到什么频率,锁相环负责把这个频率锁定在目标信道中心,混频器把接收到的射频信号和本振信号做差,输出一个固定中频或者直接下变频到基带。也就是说,单片机在整条链路里扮演的是「配置者」和「监控者」,不参与射频信号的直接处理。
理解这一点很重要,因为它决定了驱动代码的工作范围。你不需要去碰射频通道里的增益、滤波、检波这些模拟电路,那些是硬件设计决定的;你要做的事情只有三件:一是把分频系数写进寄存器,二是检测锁相环是否锁定成功,三是读取 RSSI 电压来判断当前信号强度。顺着这个思路去读一份驱动源码,就不会被芯片手册里大段的射频参数吓到,真正需要关心的寄存器就那么几个。
我见过不少人在这一步栽跟头:拿到芯片手册直接翻到寄存器表,看到几十个寄存器就懵了,以为每个都要配置。实际上常用配置就那么几条,剩下的填默认值就行。RTC6715 大多数版本的控制接口是串行三线——数据线、时钟线、使能线,有的模组还会引出锁定指示脚和 RSSI 模拟输出脚。搞清楚这几个引脚,驱动框架就出来了。
2.2 STM32 与 RTC6715 的接线:最少 6 根线
以最常见的模组封装为例,STM32 和 RTC6715 模组之间需要连的线不超过 6 根:电源、地、数据线(DATA)、时钟线(CLK)、使能线(EN)、锁定状态输出(LOCK)。RSSI 是模拟输出,要接到 STM32 的 ADC 引脚上,如果模组没引出 RSSI,就需要后端芯片输出基带信号的强度指示模拟量,或者直接用 ADC 采样中频放大器的增益控制电压。
| 模组引脚 | 作用 | STM32 侧 |
|---|---|---|
| VCC | 供电(通常 3.3V) | 3.3V 电源 |
| GND | 地 | GND |
| DATA | 串行数据输入 | 任意 GPIO 推挽输出 |
| CLK | 串行时钟 | 任意 GPIO 推挽输出 |
| EN | 使能/锁存 | 任意 GPIO 推挽输出 |
| LOCK | 锁相指示 | 任意 GPIO 输入 |
| RSSI | 信号强度模拟输出 | ADC 输入引脚 |
注意一点:有些模组把 DATA 标成 SDA,CLK 标成 SCL,容易让人误会是 I2C。判断标准很简单——看通信时序里有没有设备地址和 ACK 应答,RTC6715 这类芯片的三线写入通常只是单纯地往移位寄存器里推数据,没有从机地址的概念,本质上是 SPI 写模式的简化版。如果你把 I2C 那套读写的思路套上去,大概率调不通。
2.3 通信协议不是标准 SPI:更像移位寄存器写入
RTC6715 的控制时序与其说是 SPI,不如说更像 74HC595 那种移位寄存器的写入方式:数据线在时钟上升沿被采样,全部位推完后使能线拉一个低电平脉冲,数据被锁存到内部寄存器。很多驱动源码里直接用 GPIO 翻转模拟这个时序,代码又短又直观,比硬要挂 SPI 外设可靠得多——因为芯片手册里对时序要求给出的余量通常很宽,GPIO 模拟完全跟得上。
下面这段是 GPIO 模拟写时序的最小实现,几乎是所有 RTC6715 驱动的骨架。
void rtc6715_write_byte(uint8_t data) { for (uint8_t i = 0; i < 8; i++) { // 先放数据,再给时钟,避免建立时间不足 HAL_GPIO_WritePin(RTC6715_DATA_PORT, RTC6715_DATA_PIN, (data & 0x80) ? GPIO_PIN_SET : GPIO_PIN_RESET); data <<= 1; HAL_GPIO_WritePin(RTC6715_CLK_PORT, RTC6715_CLK_PIN, GPIO_PIN_SET); delay_us(1); HAL_GPIO_WritePin(RTC6715_CLK_PORT, RTC6715_CLK_PIN, GPIO_PIN_RESET); delay_us(1); } } void rtc6715_latch(void) { // 使能脚拉低脉冲,完成寄存器锁存 HAL_GPIO_WritePin(RTC6715_EN_PORT, RTC6715_EN_PIN, GPIO_PIN_RESET); delay_us(2); HAL_GPIO_WritePin(RTC6715_EN_PORT, RTC6715_EN_PIN, GPIO_PIN_SET); delay_us(2); }写字节的时候先置数据后给时钟,这是绝大多数串行外设的通用要求,数据建立时间至少要有几百纳秒,1us 的延时留的余量很足。锁存脉冲低电平的时间同样要保证芯片能采样到下降沿,2us 足够。这里的 delay_us 建议用定时器或者 DWT 实现,不要用空循环,否则编译优化等级一改时序就变了。
参数上有两个点值得注意:时钟频率不要超过芯片手册标称的上限,常见的是 2MHz 以下,GPIO 翻转速度完全够;数据位的顺序要以芯片手册里的寄存器位序为准,有的芯片要求先写高位,有的要求先写低位,写反了会出现频率错乱或者配置无效的怪现象。判断位序对不对,最直接的办法是写完频率之后读 LOCK 脚,锁定不了就换位序试。
3. 驱动代码骨架:从 GPIO 初始化到锁频成功
3.1 用 CubeMX 把引脚配好
工程建议直接用 CubeMX 生成,省去手写时钟树和 GPIO 初始化的时间。需要配置的引脚就三类:控制脚(DATA、CLK、EN)设为推挽输出,初始电平拉高;LOCK 脚设为输入,可以开上拉也可以不开——如果模组的 LOCK 输出是推挽型的,开上拉反而会引入不必要的电流;RSSI 脚设为 ADC 输入,采样时间建议拉到最大档,因为 RSSI 输出阻抗偏高,采样时间太短读数会偏低。
时钟树方面没有特殊要求,只要保证 delay_us 用的时间基准准确就行。RTC6715 对主控的时钟频率完全不敏感,你用的是 64MHz 还是 168MHz 都无所谓,驱动代码本身不依赖某个特定的总线频率,这一点比驱动很多数字传感器要省心。
3.2 软件模拟三线写入:时序与实现
完整的写配置流程可以拆成三步:拼装寄存器数据、按位送出、产生锁存脉冲。关键在于「拼装寄存器数据」这一步——驱动源码的差异主要都体现在这里,有人把它写成一个大 switch 分支,有人写成查表,有人用位域结构体。新手最容易犯的错是把多个寄存器的内容拆成多次锁存,每次都拉低使能脚,结果后一次写入覆盖了前一次。实际做法应该是把所有要配置的数据拼接成一个连续的数据帧,一次性锁存。
下面是一个把配置缓存拼成帧并写出的做法,也是我常用的手法:
typedef struct { uint8_t regs[6]; // 6 个配置寄存器缓存 uint8_t reg_count; } rtc6715_cfg_t; void rtc6715_write_frame(rtc6715_cfg_t *cfg) { // 使能脚保持高,数据线上按先后顺序把整个帧推完 HAL_GPIO_WritePin(RTC6715_EN_PORT, RTC6715_EN_PIN, GPIO_PIN_SET); for (uint8_t i = 0; i < cfg->reg_count; i++) { rtc6715_write_byte(cfg->regs[i]); } // 一次锁存生效,避免中间状态覆盖 rtc6715_latch(); }这里把「使能脚保持高」放在写数据之前是有讲究的:有的芯片在使能脚为高时数据线只是往内部移位寄存器推,不立即生效,等使能脚拉低才锁存;如果写一个字节就锁存一次,寄存器之间会有短暂的中间态,可能导致芯片工作状态跳变。用一个缓存数组的好处是,后续无论是切频率还是调灵敏度,只需要改数组元素然后重新调用 write_frame 就行,不用反复造轮子。
关于读取:如果模组没有数字读回功能,就不能指望通过写寄存器再读回来的方式校验配置。校验手段就靠 LOCK 脚和实际接收效果。如果你的模组手册里写了支持读回,那就需要把 DATA 脚在写完的间隙切成输入模式,等芯片输出,注意切换的时候要加延时避免总线竞争。
3.3 等 LOCK 信号:锁频成功的判断标准
LOCK 脚是驱动里最重要的状态反馈,没有之一。它告诉单片机 PLL 是否锁定了当前设定的频率。锁相环从开始工作到稳定锁定需要一段时间,不同芯片差异很大,常见范围是几毫秒到几十毫秒。驱动里不能写完寄存器立刻就去读 LOCK,那样读到的一定是假低电平,正确做法是在切频之后等待一小段时间再检测。
uint8_t rtc6715_wait_lock(uint32_t timeout_ms) { uint32_t elapsed = 0; while (elapsed < timeout_ms) { if (HAL_GPIO_ReadPin(RTC6715_LOCK_PORT, RTC6715_LOCK_PIN) == GPIO_PIN_SET) { return 1; } delay_ms(2); elapsed += 2; } return 0; }等待循环里每次查询间隔 2ms,一是给 PLL 足够的建立时间,二是避免连续读 GPIO 浪费 CPU。超时时间我一般给 100ms,遇到冷启动或者供电不稳的情况能容忍更长的锁定时间。注意:LOCK 拉高只能代表本振频率锁定,不代表一定收到了有用的信号,它跟 RSSI 是两回事——LOCK 是「我准备好了」,RSSI 是「我听到了什么」。很多新手把这两个高电平混为一谈,以为 LOCK 有了就应该出画面,结果天线没接也能 LOCK,这是正常的,芯片自己的本振锁定了而已。
4. 把频率写进芯片:分频系数计算与寄存器写入实现
4.1 参考时钟与分频比:把目标频率换算成寄存器值
RTC6715 这类射频芯片内部通常有一个参考晶振,常见的是 12MHz,也有用 13MHz 或者 16MHz 的版本。锁相环把参考时钟倍频到本振频率,倍频系数由分频寄存器决定。计算公式很简单:目标频率除以参考频率,得到的商就是分频比,再按芯片手册的分频寄存器布局拆成对应的位段写进去。
假设参考时钟是 12MHz,想接收 5800MHz 的图传信道,分频比就是 5800 ÷ 12 ≈ 483.33。但这个数不是整数,说明实际电路中存在小数分频器,或者参考频率并不是 12MHz 而是它在内部经过了一个分频。不同批次的 RTC6715 模组参考频率也可能不同,白标模组上用 12MHz 晶体的居多,某些定制品会换 12.8MHz 或 24MHz。写驱动的时候一定要把参考时钟定义成宏,并且写了注释提醒换模组必须核对。
#define RTC6715_REF_CLK_KHZ 12000UL // 参考时钟,单位 kHz,换模组必须核对 #define RTC6715_TARGET_MHZ 5800 // 目标信道中心频率,单位 MHz uint32_t rtc6715_calc_divider(uint32_t freq_mhz) { // 频率换算成 kHz 再除以参考时钟,得到分频系数 uint32_t freq_khz = freq_mhz * 1000UL; return freq_khz / RTC6715_REF_CLK_KHZ; }分频系数算出来是一个整数,比如 483,但实际小数分频会把 0.33 部分编码进另一个控制寄存器。这就是为什么驱动源码里不能只写一个大数,而是要拆成整数部分和小数部分两个字段。RTC6715 的分频寄存器通常是多字节的,高字节放整数部分,低字节放小数部分和使能位。具体的位段长度以你手里的芯片手册为准——不同批次可能有差异,但「整数 + 小数」这个拆分逻辑是一样的。
我见过某开发者直接把 483 当成寄存器值写进去,结果接收频率偏了 400 多 MHz,还以为是天线问题,折腾了半天才发现是小数分频没配置。这种事情很常见,频率计算是驱动里最容易翻车的地方,一定不要跳过去,逐位核对。
4.2 完整驱动源码:配置、读 RSSI、切信道三件套
把前面几步拼起来,一个能用的 RTC6715 驱动至少要有这三个函数:初始化、设置频率、读取信号强度。下面给出一个完整的示例,可以直接抄进 STM32 工程里改引脚后使用。
/* rtc6715_driver.c */ #include "rtc6715_driver.h" // 全局配置缓存,方便切频时复用 static rtc6715_cfg_t g_cfg; static uint8_t g_init_done = 0; void rtc6715_init(void) { // 控制引脚初始电平都拉高,避免上电瞬间误触发锁存 HAL_GPIO_WritePin(RTC6715_DATA_PORT, RTC6715_DATA_PIN, GPIO_PIN_SET); HAL_GPIO_WritePin(RTC6715_CLK_PORT, RTC6715_CLK_PIN, GPIO_PIN_SET); HAL_GPIO_WritePin(RTC6715_EN_PORT, RTC6715_EN_PIN, GPIO_PIN_SET); delay_ms(10); g_init_done = 1; } uint8_t rtc6715_set_frequency(uint32_t freq_mhz) { if (!g_init_done) return 0; // 1. 计算分频比 uint32_t div = rtc6715_calc_divider(freq_mhz); uint16_t int_part = (uint16_t)(div & 0xFFFF); uint8_t frac_part = (uint8_t)((div >> 16) & 0xFF); // 2. 装配配置帧,寄存器顺序按芯片手册重新排列 g_cfg.regs[0] = (uint8_t)(int_part >> 8); // 分频整数高字节 g_cfg.regs[1] = (uint8_t)(int_part & 0xFF); // 分频整数低字节 g_cfg.regs[2] = frac_part; // 分频小数部分 g_cfg.regs[3] = 0x00; // 控制字,默认值 g_cfg.regs[4] = 0x00; // 控制字,默认值 g_cfg.regs[5] = 0x00; // 控制字,默认值 g_cfg.reg_count = 6; rtc6715_write_frame(&g_cfg); return rtc6715_wait_lock(100); } uint16_t rtc6715_read_rssi(void) { // 启动一次 ADC 转换并读取结果,采样时间调到最大档 HAL_ADC_Start(&hadc_rssi); if (HAL_ADC_PollForConversion(&hadc_rssi, 10) == HAL_OK) { return (uint16_t)HAL_ADC_GetValue(&hadc_rssi); } return 0; }这里把分频系数拆成三个字节只是一个示意框架,真实芯片的寄存器位段不会刚好按这种整数/小数切法,但你拿到的驱动源码大概率长这样,核心思路是对的。初始化函数里把三个控制脚默认拉高,是为了避免 STM32 上电瞬间引脚下拉导致 RTC6715 误锁存进入错误状态。有些模组在 EN 上电瞬间被拉低一次,之后配置就写不进去了,必须断电重来——把初始化时赋高电平这一步写进去能省很多事。
RSSI 读取这里用的是阻塞式 ADC 转换,实际工程里如果主循环有其他任务,建议改成 DMA 采集,把 RSSI 的采样频率放到 10Hz 左右就够了,因为信号强度的变化没那么快。RSSI 输出是模拟电压,通常芯片手册会给一个「电压—dBm」对照表,ADC 读到的裸值要先转成电压再查表,才能得到有意义的信号强度数值。
4.3 代码里这几个参数建议留成宏定义
驱动源码写完之后,有几个参数是调硬件的时候经常要改的,我习惯全部用宏定义放在头文件顶部,避免每次去代码里翻。第一是参考时钟频率,这个必须暴露,理由前面已经说过了;第二是 LOCK 超时时间,换模组后如果 PLL 锁定变慢,改这个地方比改逻辑快;第三是 RSSI 采样用的 ADC 句柄,换 ADC 通道的时候只改宏,关驱动代码什么事都没有。
#ifndef RTC6715_DRIVER_H #define RTC6715_DRIVER_H #include "main.h" // 用户需要根据实际接线修改的配置项 #define RTC6715_DATA_PORT GPIOA #define RTC6715_DATA_PIN GPIO_PIN_4 #define RTC6715_CLK_PORT GPIOA #define RTC6715_CLK_PIN GPIO_PIN_5 #define RTC6715_EN_PORT GPIOA #define RTC6715_EN_PIN GPIO_PIN_6 #define RTC6715_LOCK_PORT GPIOB #define RTC6715_LOCK_PIN GPIO_PIN_0 #define RTC6715_REF_CLK_KHZ 12000UL #define RTC6715_LOCK_TIMEOUT_MS 100UL // 函数声明 void rtc6715_init(void); uint8_t rtc6715_set_frequency(uint32_t freq_mhz); uint16_t rtc6715_read_rssi(void); #endif把这些参数集中在头文件顶部,最大的好处是换模组或者换开发板的时候,不需要去理解驱动内部的实现细节,改完引脚和参考频率就能跑。这个习惯对任何芯片驱动都适用,尤其是这种带模拟电路的外设,移植成本大部分都在硬件差异上,而不是代码逻辑上。
有一个细节值得强调:宏定义的引脚和实际 CubeMX 生成的引脚一定要能对得上,不然编译不会报错,但 GPIO_WritePin 操作的是错误的引脚,表现就是代码「看起来写了,实际上什么都没写」。排查这种问题最快的方法是先读 LOCK 脚——初始化完不配置任何频率,看 LOCK 是高是低,再去查引脚配置。
5. RTC6715 驱动避坑:5 个高频翻车点与排查路径
5.1 读回数据全是 0xFF:时钟极性反了或时序太快
现象:模组不管写什么频率,行为完全不变,逻辑分析仪抓数据看到读回全是 0xFF。 原因:最常见的是时钟极性反了——芯片要求在时钟上升沿采样,驱动却在下升沿放数据,导致数据位全被采成 1。另一种可能是 GPIO 翻转速度太快,数据建立时间不足。 解决:把 rtc6715_write_byte 里的赋值顺序从「先数据后时钟」改成「先时钟后数据」试试,或者在每次翻转之后把延时从 1us 提到 5us。改完之后如果写频率能锁定,就说明是时序问题;如果还是不行,再用示波器对比芯片手册里的时序图,看看数据线和时钟线的相对相位关系。
5.2 频率写进去了但接收不到图传:参考时钟不匹配
现象:LOCK 正常拉高,RSSI 也有反应,但接上发射机就是出不了画面,或者画面全是雪花。 原因:分频比是按照 12MHz 参考时钟算的,但模组上实际焊的是 13MHz 晶体。分频寄存器里写的系数没变,实际本振却偏了 8% 左右——500 MHz 的偏差,当然什么都收不到。 解决:拆下模组屏蔽罩看晶振丝印,或者在驱动里做一个频率扫描:从 5400MHz 到 5900MHz 每隔 10MHz 写一次,同时读 RSSI,找出 RSSI 峰值对应的那个标称频率——如果实际发射是 5800MHz,但扫描发现 5400MHz 处 RSSI 最高,说明参考时钟比预期高了(5800/5400 ≈ 1.074,接近 13/12),把 RTC6715_REF_CLK_KHZ 改成 13000UL 再试。
5.3 LOCK 引脚一直拉不高:天线或供电先于软件排查
现象:写完频率之后调用 rtc6715_wait_lock,永远返回 0。 原因:LOCK 拉不高的原因排第一的不是软件,是供电。RTC6715 的 PLL 对电源纹波很敏感,如果供电端用了很细的杜邦线,或者和电机驱动共用一个电源,PLL 可能一直失锁。第二常见的是天线没接或者天线阻抗异常——本振起振条件跟天线负载有关,空载也可能导致锁定失败。 解决:先量 LOCK 引脚的静态电平,什么都不接就知道芯片有没有供电;然后用手捏住天线附近再看 LOCK 有没有变化——人体耦合改变天线阻抗,如果 LOCK 偶尔能拉高,说明电路起振了,问题在供电稳定性。软件层面可以做的就是加大超时时间到 300ms,同时降低时钟频率到 500kHz 以下,把干扰因素排掉再逐步加回来。
5.4 RSSI 数值满量程乱跳:直接读 ADC 不做滤波等于白读
现象:RSSI 读回来几乎是满量程,而且数值上下跳个不停,根本看不出信号变化。 原因:RSSI 输出本身有噪声,而且模组的 RSSI 引脚下一般有一个滤波电容,但它滤不掉低频分量。直接读 ADC 裸值不做任何处理,显示出来的就是乱跳的数。 解决:在驱动里加一个滑动平均滤波,采样 8 次去掉最大值和最小值再平均,或者用一阶低通:rssi_filtered = rssi_filtered * 0.9 + rssi_raw * 0.1。前者响应快但仍有波动,后者平滑但响应慢,建议 RTC6715 的 RSSI 用去掉极值的平均,保留一定的响应速度用于扫频找信号。另外要注意 ADC 采样时间,RSSI 输出阻抗高的模组在采样时间不足时读数会偏低,改成最大采样时间能明显改善读数稳定性。
5.5 换了一块模块就不工作:不同批次引脚丝印差异
现象:同一套代码,第一块模组跑得正常,换第二块就收不到信号了。 原因:RTC6715 模组没有统一的行业引脚标准,不同厂家出的模块引脚的顺序可能不同,有的把 EN 和 DATA 对调了,有的把 LOCK 脚换成了别的功能。你第一块好用不证明第二块也一样。 解决:拿到新模组先做一件事——把 LOCK 脚接一个 LED,不配置任何寄存器直接上电观察。如果 LED 点亮并在几秒后熄灭,说明芯片内部可能已经自动进入了一种默认接收模式;如果 LED 不亮,就要怀疑引脚定义是否一致。每换一次模组都重新对照实物丝印和 CubeMX 里的引脚映射,别默认 pin-to-pin 兼容。这类问题看着玄学,其实就是硬件差异,排查路径永远是先确认引脚,再确认时序,最后才轮到寄存器。
6. 上电验证与灵敏度调优:从「锁上频率」到「看得见画面」
驱动写完之后,验证是有顺序的。第一步先做「盲扫」:固定发射机在某个频点,让 STM32 从信道表最低频扫到最高频,每扫一个频点读一次 RSSI,把数据通过串口或 OLED 显示出来。如果 RSSI 在发射频点附近出现明显峰值,说明锁相和接收链路都是通的。这里有个经验值:RSSI 峰值比底噪高 6dB 以上,图像一般就能稳定显示。
第二步是调灵敏度。RTC6715 接收灵敏度不完全由芯片决定,前端匹配电路和天线位置影响很大。用 RSSI 读数当参考,把天线靠近和远离发射机各测一次,两次读数之差就是动态范围。好的情况下应该有 20dB 以上的落差;如果只有三五 dB,先检查天线有没有焊好、馈线有没有断裂,然后再看驱动里的频率是否真的落在信道上——用扫描法找到的峰值频点很可能比发射标称频点偏了几 MHz,这种情况要把驱动里的目标频率改成扫描到的实际峰值,而不是强行写发射机的标称频率。
最后一个技巧:把驱动封装成三个 API——init、set_frequency、read_rssi——然后在上层代码里做一个简单的自动搜台逻辑。按信道表逐个 set_frequency,每个频点等待 30ms 再 read_rssi,记录 RSSI 最高的频点并停留。这个逻辑写起来不到二十行,但实际使用中比手动写频方便太多,尤其是无人机飞远了信号变弱、需要快速切到备用频点的时候。
调 RTC6715 驱动这几年,我最大的教训就是:不要把 LOCK 拉高当成成功,不要把 RSSI 当成绝对值,先确认频率走对再谈灵敏度,先确认电源干净再谈天线匹配。这套排查习惯帮我避开了很多深夜调硬件的坑,也希望帮到你。
本文还有配套的精品资源,点击获取