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 上升沿, 从机处理接收数据 ───┘
文字版:
- 主机拉低 CS
- 主机等待从机拉低 RDY (轮询 5ms 一次, 或由 IRQ 引脚中断触发)
- 主机开始全双工 1600B 事务
- 主机拉高 CS → 从机立即拉高 RDY, 处理接收到的数据, 处理完成后再次拉低 RDY
数据处理
- 基于 CS 的高低电平, 自然实现包的整体分割 (每次 CS 拉低→拉高是一个完整的 1600B 物理帧)
- 链路层在 1600B 缓冲中多缓冲扫描 magic (
0xA1 0xB1 0xCA 0x66), 找到 magic 后裁剪成 1 个或多个 AirLink 链路帧, 分别送入指令层 - 单个 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 字节 (转义前).
数据处理
- 所有链路层数据按 0x7E 规则转换
- 包头为
0x7E, 包尾为0x7E - 包内
0x7E转义为0x7D 0x01,0x7D转义为0x7D 0x02 - 不符合转义规则的数据, 抛弃
- 转义前 (即原始 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 行)