跳转至

AirLink链路层描述

注意, 具体传输, 是通过物理层实现的, 而指令的执行, 是通过指令层执行的

链路层只保证数据包被 "正确"传输, 并抛弃出错的包, 当前不支持重传.

C语言描述

typedef struct airlink_link_data {
    uint8_t magic[4];
    uint16_t len;
    uint16_t crc16;
    uint32_t pkgid; // 包序号,为了重传
    airlink_flags_t flags; // 包头标志,首先是为了支持流量控制
    uint8_t data[0];
}airlink_link_data_t;

字段描述

  1. magic, 魔数, 4字节, 固定 0xA1, 0xB1, 0xC2, 0x66
  2. len, 数据长度,2字节, 仅计算data的长度, 注意data是0字节的可变数组, 真实数据在头部之后, 连续存放
  3. crc16, 校验码, 2字节, 从pkgid开始到data结束, 进行modbus crc16计算, 并大端存放
  4. pkgid, 包id, 2字节, 单调递增
  5. flags, 链接控制数据, 8字节

链接控制数据

C语言描述

typedef struct airlink_flags {
    uint8_t mem_is_high: 1;
    uint8_t queue_cmd: 1; // 用于指示命令包的队列是否还有数据
    uint8_t queue_ip: 1; // 用于ip包的队列是否还有数据
    uint8_t irq_ready: 1; // 是否切换到IRQ模式
    uint8_t irq_pin: 4;   // 中断管脚号, 这是传给SLAVE的, 从 GPIO12(GPIO140)开始算
    uint32_t revert: 24; // 保留位, 用于扩展
}airlink_flags_t;

字段描述:

  1. mem_is_high, 内存是否高水位, 若为1, 对端应该停止下发IP包, 但不影响非IP包的传输
  2. queue_cmd, 命令包的队列是否还有数据, 若为1, 代表仍有数据待取, 用于SPI模式
  3. queue_ip, ip包的队列是否还有数据, 若为1, 代表仍有数据待取, 用于SPI模式
  4. irq_ready, 是否切换到IRQ模式, 若为1, 代表希望对端切换到IRQ模式, 且本端已经就绪
  5. irq_pin, 中断管脚号, 这是传给SLAVE的, 具体gpio选用, 由从机端选定
  6. 其余是保留字段, 当前为0