蓝牙HCI协议详解
蓝牙HCI协议详解
1 蓝牙协议栈框图
以上框图中说明参见:# 吐血推荐历史最全的蓝牙协议栈介绍
2. Transport层的交互方式
HCI(Host Contorl Interface)位于上述蓝牙协议框图中的TRANSPORT层:
TRANSPORT层:此部分在硬件接口(UART/USB/SDIO)实现HOST跟CONTROLLER的交互,交互可选以下几个协议,
1)H2USB方式的transport
2)H4:UART方式的transport
3)H5:UART方式的transport
4)BCSP:UART方式的transport
5)SDIO Transport,一般很少用到SDIO, 但确实有
3. 重点–HCI-H4格式介绍
3.1 H4
H4是UART传输种最简单也是最常用的一个Transport(带流控)。
3.2 HCI数据格式
H4是UART传输种最简的一个Transport,只是在HCI raw data的前面加一个Packet type就行。
3.2.1 HCI Packet TYPE
如下HCI_H4 一共有五种HCI Packet TYPE:
Packet ID Packet type 说明 备注
0x01 HCI COMMAND 由蓝牙协议栈发送给芯片的命令
0x02 HCI EVENT 由蓝牙芯片上报给蓝牙协议栈的事件7
0x03 HCI ACL 蓝牙协议栈跟蓝牙芯片双向交互的普通数据
0x04 HCI SCO 蓝牙芯片跟蓝牙协议栈双向交互的通话/语音识别等音频数据
0x05 HCI ISO 这部分是在core5.2才添加):LE audio用的数据包格式
一般常用的是H4:Packet Type代码封装如下
//---hci\include\hci_hal.h
typedef enum {
DATA_TYPE_UNKNOWN = 0,
DATA_TYPE_COMMAND = 1,
DATA_TYPE_ACL = 2,
DATA_TYPE_SCO = 3,
DATA_TYPE_EVENT = 4
} serial_data_type_t;
一般常用的是H4:收发代码封装如下
3.2.2 HCI raw date–Command packet
查看
Core_v5.3.pdf
文档可知:
3.2.3 实例–HCI_Reset
以HCI_Reset命令为例说明
HCI_Type=0x01
(HCI raw data=0x03 0x0c 0x00)
按3.1.2.2 HCI raw date–Command packet和
蓝牙的Core_v5.3.pdf
文档可知:
以下为抓包实例验证:
3.2.4 HCI命令如何查询
扩展:当然HCI命令还有很多, 可以在
蓝牙的Core_v5.3.pdf
中查看:
PS:
如有需要
蓝牙的Core_v5.3.pdf
文档的同学,可-关.注-我的同名_公-众.号“慢慢Coding”,回复
HCI
即可;
3.3 H4 uart硬件要求与连接
H4 uart硬件要求:
3.4 H4与H5的区别
主要差别在于:
- H4 带流控: 即需要BT CHIP
UART_TX/UART_RX/UART_CTS/UART_RTS/VCC/GND
接到MCU,
- 而H5,BCSP不带流控:只需要BT CHIP的
UART_TX/UART_RX/VCC/GND
接到MCU就可以通信。