2、硬件接口详解:UART、I2C、PPS与天线

定位模块的硬件接口,说白了就是模块跟外面世界对话的「嘴巴」和「耳朵」。选对了、接对了,数据才能稳稳流进来。我这些年调试过的定位板子少说也有几十种,接口上栽过的跟头真不少。今天咱们就把这几个关键接口掰开揉碎讲清楚。

本章核心脉络:UART做主通信 → I2C做备用/配置 → PPS输出精准时间 → 天线接口决定信号质量。四者缺一不可。

定位模块硬件接口知识体系 定位模块 UART 主通信 I2C 备用通信 PPS 秒脉冲 天线接口 波特率 · 电平 · 流控 地址 · 速率 · 配置 脉宽 · 极性 · 同步 有源/无源 · 增益

2.1 UART接口:最常用的数据通道

UART是定位模块的标配接口。几乎所有GNSS模块都通过它输出NMEA数据。我个人习惯把UART叫做「主通道」——模块上电后第一件事就是从这里往外吐数据。

2.1.1 电平匹配——最容易翻车的地方

模块的UART电平通常是3.3V或1.8V。但你的主控可能是5V。直接连?等着冒烟吧。

模块电平 主控电平 推荐方案 注意事项
3.3V 3.3V 直连 确认两者共地
3.3V 5V 电平转换器 / 分压电阻 模块TX→主控RX需降压
1.8V 3.3V 必须用电平转换芯片 分压电阻可能不够稳
1.8V 5V 两级电平转换 不建议,尽量选同电平

我曾经在一个项目里偷懒,用两个电阻分压把3.3V降到1.8V给模块RX。结果低温环境下分压比漂了,模块死活不响应。后来老老实实加了TXS0108电平转换芯片,问题全消。电平匹配别省成本,尤其是量产产品。

2.1.2 波特率配置

模块默认波特率通常是9600或115200。我建议你直接用115200——9600在输出高频定位数据时容易丢包。

// 以UBX协议配置u-blox模块波特率为例
// 发送CFG-PRT消息,将UART1波特率设为115200
uint8_t cfg_prt[] = {
    0xB5, 0x62,           // 同步字符
    0x06, 0x00,           // CFG-PRT 消息ID
    0x14, 0x00,           // 负载长度 20字节
    0x01, 0x00,           // 端口ID: UART1
    0x00, 0x00,           // 保留
    0x00, 0x00,           // TX准备就绪
    0xD0, 0x08,           // 模式: 8位数据, 无校验, 1停止位
    0x00, 0xC2, 0x01, 0x00, // 波特率 115200 (0x0001C200)
    0x00, 0x00,           // 保留
    0x00, 0x00,           // 保留
    0x00, 0x00,           // 保留
    0x00, 0x00            // 保留
};
// 计算校验和并发送...

小技巧:调试阶段先用9600波特率确认硬件连接没问题,再切到115200跑性能。这样能快速区分是硬件问题还是速率问题。

2.2 I2C接口:备用通信与配置通道

I2C接口在定位模块上通常不是主力,但它的作用很关键——当UART被占用时,你可以通过I2C读取数据或修改配置。我做过一个无人机项目,飞控的UART口全被传感器占满了,最后就是用I2C把定位模块挂上去的。

2.2.1 I2C地址与速率

模块的I2C地址一般是7位,常见地址有0x42或0x43。速率通常支持100kHz或400kHz。

参数 典型值 说明
I2C地址 0x42 (7位) 部分模块可通过引脚配置
最大速率 400 kHz 建议先用100kHz调试
数据格式 UBX / NMEA 与UART输出内容一致
上拉电阻 4.7kΩ 根据总线电容调整

2.2.2 I2C读取示例

// 通过I2C读取定位模块数据(伪代码)
#define GNSS_I2C_ADDR 0x42

uint8_t i2c_read_gnss(void) {
    uint8_t buf[100];
    uint8_t len;
    
    // 第一步:发送读取请求
    i2c_start(GNSS_I2C_ADDR << 1 | I2C_WRITE);
    i2c_write(0xFF);  // 特殊读取触发字节
    i2c_stop();
    
    // 第二步:读取数据长度
    i2c_start(GNSS_I2C_ADDR << 1 | I2C_READ);
    len = i2c_read_ack();
    
    // 第三步:读取数据内容
    for(int i = 0; i < len; i++) {
        buf[i] = (i == len-1) ? i2c_read_nack() : i2c_read_ack();
    }
    i2c_stop();
    
    return len;
}

注意:I2C读取定位数据时,模块可能还没准备好新数据。我建议你加一个超时机制——等100ms还没数据就重试,别死等。

2.3 PPS秒脉冲输出引脚

PPS(Pulse Per Second)是定位模块输出的精准秒脉冲信号。它的上升沿与UTC秒对齐,精度在纳秒级。说白了,这就是一个硬件级别的「对时信号」。

2.3.1 PPS的典型参数

参数 典型值 说明
脉宽 100ms 可配置,部分模块支持1ms~500ms
极性 正脉冲 上升沿对齐UTC秒
精度 ±10ns (锁定后) 受晶振和信号强度影响
输出电平 3.3V 与模块VCC一致

2.3.2 怎么用PPS

PPS最常见的用法是给主控提供精准时间基准。比如你做一个基站同步系统,所有基站都接收同一个定位模块的PPS信号,时间误差就能控制在纳秒级。

我建议:PPS引脚尽量走短走直,别跟高频信号挨着。我在一个4G基站项目里,PPS线跟电源线走了同一段排线,结果脉冲抖动大了几十倍。后来单独飞了一根杜邦线,问题解决。

2.4 天线接口:有源 vs 无源

天线是定位模块的「眼睛」。选错了天线,模块性能直接打对折。我见过太多人买了几百块的模块,配个几块钱的天线,然后抱怨定位不准。

2.4.1 有源天线 vs 无源天线

对比项 有源天线 无源天线
内置LNA 有 无
供电 需要3V/5V供电 不需要
增益 20~30dB 0~5dB
适用场景 长馈线、室内、弱信号 短馈线、强信号、低成本
价格 较高 较低

2.4.2 天线供电注意事项

有源天线需要模块从天线引脚输出直流偏压。大部分模块默认开启天线供电,但有些需要你通过命令打开。

// 以u-blox M8系列为例,开启天线供电
uint8_t cfg_ant[] = {
    0xB5, 0x62,           // 同步字符
    0x06, 0x13,           // CFG-ANT 消息ID
    0x04, 0x00,           // 负载长度 4字节
    0x01, 0x00,           // 标志: 开启天线供电
    0x00, 0x00,           // 引脚配置
    0x00, 0x00            // 保留
};
// 计算校验和...

我曾经在一个户外项目中用了有源天线,但没注意模块的天线短路检测功能。结果天线馈线被老鼠咬破,模块的LNA供电直接短路,烧了三个模块才找到原因。后来我都在天线供电线上串一个100Ω电阻做限流保护。

2.4.3 天线选型建议

  • 馈线长度 < 1米:用无源天线就够了,省钱省事
  • 馈线长度 1~5米:必须用有源天线,否则信号衰减太大
  • 室内使用:有源天线是唯一选择,陶瓷无源天线在室内基本废了
  • 车载应用:推荐有源天线,注意天线要放在车顶金属面上

总结一下:UART是主力通道,电平匹配别马虎;I2C是备用方案,关键时刻能救命;PPS是时间基准,走线要讲究;天线是信号入口,有源无源看场景。这四个接口搞明白了,定位模块的硬件部署就成功了一大半。