- 物理层
1/ BLE 使用 2.4Ghz工业 科学 及 医疗 频段 (ISM).(2402Hz - 2480Hz )
2/ GFSK 调制 , 物理层比特率 1Mbit/s 1Mbps
3/ 40个通道, 37个自适应自动调频数据通道 用于两个连接设备的通讯, 3个固定广播通道 37(中心频率,2402Hz) 38(2426) 39(2480)
4/ 发射功率 (0.01mW(-20dBm) - 10mW(10dBm)) // 弱到强. 一般 接收到的频率为 -35dBm
- 链路层
链路层有 报文结构
前导码(1字节) + 接入地址(4) + PDU() + CRC(3,对PDU的计算)
硬件实现 硬件实现 软件实现 硬件实现
分两种
广播接入地址是固定的 0x8e89bed6
数据接入地址由 主机在发起态通过连接请求发送给从机.
PDU // 分为 广播通道和 数据通道
报文(1字节) + 长度(1) + 数据净荷(0-296bit,0-37byte)
数据流是小端的,低字节先传送.
状态有 5 个状态
扫描态
︿
﹀
广播态 ‹› 就绪态 ‹› 发起态
↘ ︿ ↙
连接态
数据在空中传播前最后一步是经过白化(FSK接收机接收连续相同bit能力差,白化,使数据随机化)处理的.
在接收的第一步经过硬件去白化,然后再进行 CRC校验.
- radio
上面说的是 链路层的软件部分并没有涉及到具体怎么驱动硬件,而是说的是
怎么调用驱动发送 PDU.
那么 这一部分 就是 radio 的驱动.
radio 也包括一个状态机 , 和 链路层的状态机不同.
在链路层的 连接态 之内, radio 也 涉及到 状态切换. 所以看来 这两个状态机没有特别具体的联系关系.
1. 发送 easy DMA
将 PDU包的地址 赋给 寄存器, 然后 DMA 就 主动开始发送数据.
2. 包结构
3. 设备地址-白名单
4. radio 的状态机和时间参数
5. radio 的 基本配置
包
- 最底层的包
链路层有 报文结构
前导码(1字节) + 接入地址(4) + PDU() + CRC(3,对PDU的计算)
硬件实现 硬件实现 软件实现 硬件实现
分两种
广播接入地址是固定的 0x8e89bed6
数据接入地址由 主机在发起态通过连接请求发送给从机.
- 广播通道包 及数据通道包
PDU // 分为 广播通道和 数据通道
报文(1字节) + 长度(1) + 数据净荷(0-296bit,0-37byte)
广播通道的 PDU
报文类型
数据通道的 PDU
LLID
- 数据净荷
广播信道的数据净荷
由多个 AD(advertising and scan response data) 组成
AD 格式
长度 (1字节,数据的长度) + 数据(类型(1个字节)+类型数据)
数据信道的数据净荷
L2CAP包
- L2CAP包
length (2字节) + channel ID (2) + information payload
channel ID
0x0004 属性协议 ,在 att 组包, gatt 使用
0x0005 低功耗信令通道 , 在 l2cap 组包 , gap 使用
0x0006 安全管理协议 , 在smp 组包.
- 0x0005
information payload
code(1字节) + identifier(1) + length(2,data的字节数) + data
code :
0x00 : 保留,没有用到
0x01 : 命令拒绝
0x12 : 连接参数更新 请求 // 连接参数的第一次确定是在 发起态的 CONNECT_REQ 中 , 设定了 连接间隔时间,和从机潜伏次数 .
// 而这里是建立连接之后的 连接态中(且是从机发给主机)的 一个命令,可以 提出 更改(连接间隔时间和从机潜伏次数)的建议
// 在 建立连接之后的 连接态中(且是主机发给从机) (数据信道的数据净荷中, LL_CONNECTION_UPDATE_REQ), 也可以改变 连接参数.
0x13 : 连接参数更新 应答