在进一步学习、实践CH582M的蓝牙处理知识之前,打算花点时间学习蓝牙方面的基础知识。
我最早接触和无线通讯有关的数字电路,是汽车的遥控器。但那种是不需要编程的。后来又接触到NRF24L01。SPI接口,数据通讯需要编程。通讯数据包中有固定长度的数据单元。可以利用这段数据段,实现自己的通讯协议。那么蓝牙通讯,是不是也是类似的呢?
这里,抛开蓝牙通讯的硬件,先从协议学起。
一、经典蓝牙的基础速率(BR)数据包
数据包构成:

⭐ 接入码(Access Code,72比特或者68比特)
⭐ 包头(Packet Header, 54比特)
⭐ 载荷(Payload,基础速率模式下为0至2745比特)。
1、接入码

位于数据包的最前端,用于同步、直流补偿和物理信道识别。
1) 前导码 (Preamble):4比特的固定模式(1010或0101),其序列取决于后续同步字的最低有效位(LSB),主要用于接收端的直流补偿。
2) 同步字 (Sync Word):64比特,是接入码的核心。它由一个24比特的LAP地址(Lower Address Part)生成。这个LAP地址来自主设备(Central)的蓝牙设备地址(BD_ADDR),确保了不同微微网拥有不同的同步字,接收方据此判断数据包是否属于当前网络。
3)尾码 (Trailer):4比特,同样为1010或0101,其序列取决于同步字的最高有效位(MSB)。它仅在包头紧随其后时才会出现。
接入码有两种主要长度:72比特(包含尾码,后接包头)和68比特(不包含尾码,用于寻呼、查询等不含包头的短消息)。
2、包头
包头固定为54比特,携带着链路控制的关键信息。这54比特并非原始信息,而是由18比特的原始包头信息经过1/3比例前向纠错码(FEC) 编码后形成的。8比特的原始包头包含以下6个字段:
⭐ LT_ADDR:3比特,逻辑传输地址
在主设备到从设备的时隙中,它指示目标从设备;在从设备到主设备的时序中,它指示源从设备。这正是用于区分微微网内不同设备的“目标地址”。
⭐ TYPE: 4比特,包类型码
用于指定当前数据包的具体类型(如ACL、SCO、eSCO等),并隐含了数据包将占用多少个时隙的信息。
⭐ FLOW: 1比特,流控位
用于对ACL链路进行流控。当接收方缓冲区满时,置0(STOP)以请求对方暂停发送;可接收数据时置1。
⭐ ARQN: 1比特,确认指示位
用于自动重传请求(ARQ),向发送方确认上一个数据包是否被成功接收。
⭐ SEQN: 1比特,序列号
用于对数据包进行编号,以帮助检测重传和维持包的顺序。
⭐ HEC :8比特,包头错误校验
用于校验包头信息的完整性。其生成与主设备的UAP(Upper Address Part)相关。
3、载荷
载荷是实际传输的用户数据或控制信息,长度可变(在基础速率模式下为0至2745比特),其具体结构取决于包的类型和所在的逻辑链路。
经典蓝牙主要支持两种逻辑链路,其载荷结构不同:
⭐ ACL (异步无连接链路):用于传输数据。其载荷通常由载荷头、载荷主体和CRC校验码三部分组成。
⭐ SCO/eSCO (同步面向连接链路):用于传输语音等实时性要求高的同步数据。其载荷结构不同,通常不包含载荷头,且长度可能固定(如SCO的HV3包),以最小化延迟。
二、EDR模式下的结构变化
在增强数据速率(EDR)模式下,数据包的前半部分(接入码和包头)与BR模式相同,以确保兼容性。主要变化发生在包头之后:
⭐ 在包头和载荷之间,会插入保护间隔(Guard Time) 和同步序列(Sync Sequence),用于让接收机切换到不同的调制方式(从GFSK切换到PSK)。
⭐ EDR模式下的载荷传输速率更高,但基础的数据包“三部分”结构框架依然保留
我要赚赏金
