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;
字段描述
- magic, 魔数, 4字节, 固定 0xA1, 0xB1, 0xC2, 0x66
- len, 数据长度,2字节, 仅计算data的长度, 注意data是0字节的可变数组, 真实数据在头部之后, 连续存放
- crc16, 校验码, 2字节, 从pkgid开始到data结束, 进行modbus crc16计算, 并大端存放
- pkgid, 包id, 2字节, 单调递增
- 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;
字段描述:
- mem_is_high, 内存是否高水位, 若为1, 对端应该停止下发IP包, 但不影响非IP包的传输
- queue_cmd, 命令包的队列是否还有数据, 若为1, 代表仍有数据待取, 用于SPI模式
- queue_ip, ip包的队列是否还有数据, 若为1, 代表仍有数据待取, 用于SPI模式
- irq_ready, 是否切换到IRQ模式, 若为1, 代表希望对端切换到IRQ模式, 且本端已经就绪
- irq_pin, 中断管脚号, 这是传给SLAVE的, 具体gpio选用, 由从机端选定
- 其余是保留字段, 当前为0