跳转至

AirLink 物理层描述

AirLink 物理层定义了双芯片间通信的物理传输方式. 当前实现支持 3 种模式:

模式 常量 用途
SPI 主从 MODE_SPI_MASTER = 1 / MODE_SPI_SLAVE = 0 板内高速通信 (主推荐)
UART 对等 MODE_UART = 2 板间或低速通信
LOOPBACK 自测 MODE_LOOPBACK = 3 PC 模拟器自测 (bsp/pc)

SPI 主从模式

以一端作 SPI 主机, 另一端作 SPI 从机, 通过 6 根线通信.

管脚

名称 方向 说明
CLK 主机 → 从机 SPI 时钟, 由主机提供
MOSI 主机 → 从机 主机输出, 从机输入
MISO 从机 → 主机 从机输出, 主机输入
CS 主机 → 从机 片选, 拉低有效; CS 上升沿触发从机处理接收数据
RDY 从机 → 主机 从机就绪信号, 拉低代表可进行 SPI 通信
IRQ 从机 → 主机 从机数据通知, 拉低代表有数据待取 (可选)

传输参数

项目 默认值 说明
固定事务长度 1600 字节 收发两端每次全双工 1600B, 不够则填 0xFF 或 0x00
默认轮询周期 5 ms IRQ 不用时, 主机按此周期轮询 RDY
irq_timeout 可配置 通过 airlink.config(CONF_IRQ_TIMEOUT, ms) 设置, 范围 5-60000 ms

基本时序

              ┌── CS ──────────────────────────────────────┐
              │                                            │
              │   ┌──── RDY ─────────────────────┐         │
              │   │                            │         │
              │   ▼                            │         ▼
  主机 ─────────┐  ┌─────────────────────────┐ ┌──────────
                  │ │                         │ │
                  ▼ ▼                         ▼ ▼
              ◀─ SPI 全双工 1600B 事务 ─▶
                  │ │                         │ │
                  ▲ ▲                         ▲ ▲
  从机 ─────────┘  └─────────────────────────┘ └──────────
              ▲   ▲                            ▲   ▲
              │   └── IRQ (可选, 中断模式) ───┘   │
              │                                  │
              └── CS 上升沿, 从机处理接收数据 ───┘

文字版:

  1. 主机拉低 CS
  2. 主机等待从机拉低 RDY (轮询 5ms 一次, 或由 IRQ 引脚中断触发)
  3. 主机开始全双工 1600B 事务
  4. 主机拉高 CS → 从机立即拉高 RDY, 处理接收到的数据, 处理完成后再次拉低 RDY

数据处理

  1. 基于 CS 的高低电平, 自然实现包的整体分割 (每次 CS 拉低→拉高是一个完整的 1600B 物理帧)
  2. 链路层在 1600B 缓冲中多缓冲扫描 magic (0xA1 0xB1 0xCA 0x66), 找到 magic 后裁剪成 1 个或多个 AirLink 链路帧, 分别送入指令层
  3. 单个 SPI 事务中可能含多个链路帧 (例如 IP 包与命令包的并发), 也可能不含 (未匹配到 magic 时整帧丢弃)

RDY 与 IRQ 的区别

信号 触发方 含义
RDY 从机 "我已就绪, 可进行 SPI 通信" — 事务握手
IRQ 从机 "我有新数据待取" — 异步通知 (可选, 启用后主机进入中断驱动模式)

通过 airlink.irqmode(true, master_gpio, slave_gpio) 启用 IRQ 模式; 通过 airlink.wakeupIrqmode(...) 配置唤醒引脚极性 (luat_gpio.RISING / luat_gpio.FALLING).

UART 模式

两端对等 UART 通信, 必须使用相同的波特率/停止位/校验位, 通信期间不支持切换.

物理参数

项目 推荐值 说明
波特率 2 Mbaud Air780E/EPM 等可支持 6 Mbaud
接线 TX↔RX 交叉 A.TX → B.RX, A.RX ← B.TX, 必须稳定共地
IRQ 引脚 可选 同 SPI, 拉低有效, 用作数据通知

帧格式 (SLIP 转义)

每个链路层数据按以下规则转换:

[0x7E] [payload bytes...] [0x7E]
   ↑         ↑                 ↑
 包头     原始数据           包尾
字节 转义
0x7E (帧头/帧尾) 转义为 0x7D 0x01
0x7D (转义符) 转义为 0x7D 0x02

其他字节原样传输. 单链路层数据包, 最大 1600 字节 (转义前).

数据处理

  1. 所有链路层数据按 0x7E 规则转换
  2. 包头为 0x7E, 包尾为 0x7E
  3. 包内 0x7E 转义为 0x7D 0x01, 0x7D 转义为 0x7D 0x02
  4. 不符合转义规则的数据, 抛弃
  5. 转义前 (即原始 payload) 单个链路包 ≤ 1600 字节

LOOPBACK 模式

用于 PC 模拟器自测 (loopback self-test), 同机自收自发, 验证 nanopb RPC 和各 typed handler.

使用场景

  • components/airlink/testcase/ 下的 nanopb RPC 端到端测试 (airlink_nanopb_basic)
  • ping 异步测试 (airlink_ping_basic)
  • RPC 增强测试 (rpc_enhance_basic)

启动

airlink.start(airlink.MODE_LOOPBACK)

可调用 airlink.testNanopbGpio() / testNanopbUart() / testNanopbWlan() / testNanopbPm() 触发各 typed RPC handler 自检.

来源: components/airlink/src/task/luat_airlink_loopback_task.c (75 行)

问一下 AI