【6.17】知识点清单逐点解答

第 1 步:完全不用公式讲清 P1dB(嵌入式转硬件零射频基础)

1. P1dB 到底是什么?

功率放大器(PA)理想状态:输入信号放大多少倍,输出就同步放大,输入大一倍、输出同步大一倍,完美等比例放大 。 但芯片晶体管有供电电压上限,输出不能无限变大。 当输入功率持续加大,输出功率增长会慢慢 "跟不上" 理论值,比理想线性输出少掉 1dB 的那个临界点,就叫P1dB 压缩点。 大白话:放大器开始 "力不从心、放大缩水" 的临界输入 / 输出功率。

2. 为什么一定要回退(Back-off)?

  • 超过 P1dB 后,放大不再等比例,信号会变形(失真);
  • 通信信号(蓝牙 / WiFi / 射频模块)一旦失真,会生出额外杂波(谐波),干扰相邻信道,丢包、通信距离暴跌;
  • 工程规则:实际工作功率必须比 P1dB 低几 dB,这个差值就是回退 Back-off。 举例:PA 输出 P1dB=20dBm,系统预留 3dB 回退,实际最大只用到 17dBm,保证信号不失真。

3. 数据手册里怎么找 P1dB?

  1. 目录搜关键词:1dB Compression Point / P1dB / Output Power @1dB Gain Compression
  2. 参数表格:一般标注 OP1dB(输出 1dB 压缩功率)、IP1dB(输入 1dB 压缩功率)
  3. 曲线图:Gain(dB) vs Output Power 曲线,增益往下掉 1dB 对应的横轴输出功率就是 P1dB。

第 2 步:输入功率 VS 输出功率 ASCII 曲线图 + 饱和失真谐波原理

ASCII 输入功率 (横轴) - 输出功率 (纵轴) 曲线

cpp 复制代码
输出功率(dBm)
 ^
 |                    饱和区:曲线变平缓,输出几乎不涨
 |                . . . . . . . . . . . .
 |               /
 |              /
 |             /  ← P1dB压缩点(增益开始掉1dB)
 |            /
 |           /
 |          /
 |         / ← 线性区:输入加1dB,输出精准加1dB,完美等比例放大
 |        /
 |       /
 |      /
 |     /
 |____/________________________→ 输入功率(dBm)

区域标注:

  1. 线性区:左下角斜线段,放大比例恒定,信号无变形;
  2. P1dB 点:斜线刚开始弯曲的拐点,放大倍数缩水 1dB;
  3. 饱和区:上方平缓横线,输入再加大,输出几乎不再上升。

饱和区为什么产生谐波?

  1. 线性区:信号是标准正弦波,放大后还是一模一样的正弦,只有原本基础频率(基波);
  2. 饱和区:放大器 "顶到电压天花板",正弦波上下峰值被削平,波形变成平顶畸形波;
  3. 数学直观:任何畸形、不光滑的波形,都能拆成「基波 + 2 倍频 + 3 倍频 + ...」叠加,多出的 2/3/4 倍频率分量就是谐波
  4. 危害:谐波会跑到别的通信频段,造成干扰、频谱超标。

第 3 步:SPI / I2C / UART 完整对比表 + STM32 HAL UART DMA 发送模板

三大串行总线完整对比表

对比项 UART I2C SPI
最少线数 2 根 (TX/RX);单向 1 根 2 根 (SDA/SCL) 4 根 (SCLK/MOSI/MISO/CS);单向 3 根
最高速率 几 Mbps(芯片上限常见 10M) 标准 100k / 高速 400k / 超高速几 M 几十~上百 Mbps,三者最快
传输模式 全双工(收发独立线同时跑) 半双工(同一根 SDA 收发分时) 全双工(MOSI 发、MISO 收同步并行)
同步 / 异步 异步(无同步时钟,靠波特率对齐) 同步(SCL 统一时钟) 同步(SCLK 统一时钟)
是否需要上拉电阻 不需要 必须(开漏输出) 不需要(推挽输出)
拓扑挂载 1 对 1,一对多需额外逻辑 一主多从,同总线最多挂载数十个从机 一主多从,每个从机独立 CS 片选线
典型应用 串口调试、GPS、蓝牙模块、RS485 EEPROM、OLED、温湿度传感器、RTC 时钟 Flash、ADC、LCD 屏幕、射频芯片、高速外设
优点 布线简单、远距离传输、通用调试口 引脚少、支持多从机、硬件简单 速率最快、时序简单、无地址开销、抗干扰强
缺点 多设备组网麻烦、速率低 速度最慢、总线容易卡死、必须上拉 引脚最多,从机越多 CS 控制线越多

STM32 HAL UART DMA 发送代码模板(阻塞 / 非阻塞双版本)

cpp 复制代码
#include "stm32f1xx_hal.h"

// 全局发送缓冲区
uint8_t tx_buf[128];
uint16_t tx_len;

// 1. DMA非阻塞发送(后台传输,CPU不等待)
void UART_DMA_Send(uint8_t *data, uint16_t len)
{
    // 等待上一次DMA传输完成
    while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);
    // 启动DMA发送
    HAL_UART_Transmit_DMA(&huart1, data, len);
}

// 2. 等待DMA发送完成封装
void UART_DMA_Send_Wait(uint8_t *data, uint16_t len)
{
    UART_DMA_Send(data, len);
    // 阻塞等待传输结束
    HAL_UART_TxCpltCallback(&huart1);
}

// DMA发送完成中断回调函数(HAL库标准重写)
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART1)
    {
        // 发送完成后置标记、清空缓冲区等业务逻辑
    }
}

// 使用示例
void Test_DMA_UART(void)
{
    uint8_t msg[] = "Hello DMA UART\r\n";
    UART_DMA_Send(msg, sizeof(msg));
}

第 4 步:零基础用「开漏输出」解释 I2C 要上拉、SPI 不用

先搞懂两个基础概念(零基础)

  1. 推挽输出(SPI 引脚用的) 引脚内部有两个开关管:上管接电源 VCC、下管接地 GND。
  • 输出高电平:上管打开、下管关闭 → 引脚直接连通 VCC,自带高电位;
  • 输出低电平:下管打开、上管关闭 → 引脚直接连通 GND,强制拉低; 不管高低电平,内部都有管子驱动电平,不需要外部电阻帮忙
  1. 开漏输出(I2C 的 SDA/SCL 引脚专用) 引脚内部只有接地的下开关管,没有接 VCC 的上管
  • 输出低电平:内部管子导通,引脚直接拉到 GND;
  • 输出高电平:内部两个管子全部断开,引脚完全悬空,没有任何电压。

I2C 为什么必须上拉电阻?

I2C 是多设备共享两根总线,所有芯片 SDA/SCL 并联在一起:

  1. 总线要出现高电平:所有设备内部管子全部断开,引脚悬空,电平飘移不稳定;
  2. 外部接上拉电阻(一端 VCC、一端总线),悬空时电阻把总线拉高到 VCC,稳定高电平;
  3. 任意设备要发低电平,内部开漏管子导通,强行把总线拉低,电阻不会阻碍拉低动作。 如果不上拉:总线永远无法稳定高电平,I2C 通信彻底失效。

SPI 为什么不需要上拉?

SPI 每条信号线独立,主机 MOSI/SCLK/MISO 全部是推挽输出

  • 想高就内部上管直连 VCC,想低就内部下管直连 GND;
  • 不存在引脚悬空无驱动的情况,完全不需要外部电阻补充电平。

一句话总结

I2C 引脚是开漏,内部没有上拉驱动,必须外接电阻拉高总线;SPI 是推挽输出,内部自带高低电平驱动,不用上拉电阻。

课后题目练习

1. PA 的 P1dB=30dBm,输出 27dBm,安全吗?回退够不够?

第一步:计算回退量

回退(Output Back-off,OBO)= P1dB 饱和输出功率 - 实际工作输出功率 回退 = 30 - 27 = 3dB

第二步:判断是否安全、回退是否够用

  1. 基础定义 P1dB 是放大器增益压缩 1dB 的临界点,超过这个功率信号就开始失真、产生谐波干扰;工作功率低于 P1dB 才有线性余量。
  2. 行业通用标准
  • 普通恒包络信号(FM、GSM、蓝牙 BLE):2~3dB 回退即可满足线性要求;
  • 高峰均比信号(WiFi、5G、OFDM):需要 6~10dB 大回退,不然失真严重。
  1. 本题结论
  • 仅从数值看:3dB 回退,没有超过 P1dB,硬件不会饱和烧毁,基础安全
  • 回退够不够分场景: ✅ 蓝牙、对讲机等恒包络单载波:3dB 回退足够; ❌ WiFi、LTE、宽带调制信号:3dB 回退严重不足,会频谱超标、误码高,需要降低输出功率到 20~24dBm,预留 6~10dB 回退。

总结短句

回退 3dB,硬件不会饱和;恒包络通信够用,OFDM 类高峰均信号回退不足。


2. UART 为什么叫 "异步"?没有时钟线怎么同步收发?

一、什么是同步 / 异步的核心区别

  • 同步总线(SPI/I2C):单独拉出一根时钟线(SCLK/SCL),主机统一发时钟脉冲,收发双方完全跟着同一时钟节拍走,叫同步;
  • 异步(UART)没有共享时钟信号线,发送端和接收端各自用独立晶振产生时钟,互不连通,所以叫 "异步"。

二、没有时钟线,UART 如何对齐、同步数据?

靠 3 套约定规则实现帧同步,不用外部时钟:

  1. 提前统一波特率 收发两端软件预先设置完全相同的波特率(9600/115200 等),约定 "每 1bit 占用多少微秒",这是底层时间基准。
  2. 起始位做触发同步(核心) 总线空闲时固定为高电平; 发送数据前先拉 1bit 低电平(起始位),接收芯片一直检测电平,一旦抓到下降沿,立刻启动自己内部计数器,从此刻开始逐 bit 采样数据。
  3. 帧格式统一约定 双方提前约定:1 起始位 + 8 位数据 + 1 停止位(可选校验位),接收端按固定长度收完一帧,停止位回到高电平,等待下一次起始位。

通俗比喻

同步 SPI:两个人共用一个节拍器,跟着同一拍子读写; 异步 UART:两人各拿自己的手表,提前说好每字间隔多久,一方敲一下桌子(起始位),另一方立刻按自己手表计时读字。

一句话总结

异步 = 无共享时钟线;靠统一波特率 + 起始下降沿触发,实现收发数据对齐。


3. I2C 为什么要上拉电阻,SPI 不需要?(开漏输出原理讲解)

前置两个电路概念(零基础)

  1. 开漏输出(I2C SDA/SCL 引脚专用) 芯片引脚内部只有下拉 MOS 管(连通 GND),没有上拉管接电源:
  • 输出低电平:内部下拉管导通 → 引脚直接接地,稳定低;
  • 输出高电平:内部上下管子全部断开 → 引脚悬空,无电压驱动,电平漂浮不定。
  1. 推挽输出(SPI 所有信号线) 引脚内部同时有上拉管(接 VCC)、下拉管(接 GND):
  • 输出高:内部上管导通,直连电源,主动拉高;
  • 输出低:内部下管导通,直连地,主动拉低; 两种电平都由芯片内部主动驱动,引脚永远不会悬空。

① I2C 必须上拉电阻的原因

I2C 是多设备并联共享总线,所有从机 SDA/SCL 全部并在两根线上:

  1. 总线要输出高电平时,所有设备内部开漏管全部断开,总线悬空;
  2. 外部上拉电阻一端接 VCC、一端接总线,悬空时电阻强制把总线拉到稳定高电平;
  3. 任意设备发低电平时,自身开漏下拉管导通,能轻松把总线拉低,电阻不会阻碍低电平;
  4. 不上拉:总线无法稳定高电平,I2C 识别不到停止位、应答位,通信完全失效。

② SPI 完全不需要上拉电阻

  1. SPI 所有信号线(SCLK/MOSI/MISO/CS)全部是推挽输出;
  2. 不管高 / 低电平,芯片内部管子直接驱动电平,不存在引脚悬空;
  3. 拓扑上每个从机有独立 CS 片选,不会多设备共用一条总线争夺电平,无需外部电阻辅助。

极简总结

I2C 引脚是开漏结构,内部无法主动输出高电平,必须外接电阻拉高总线;SPI 为推挽输出,内部自带高低电平驱动,不需要上拉电阻。