前言:
为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长。
1. 简述
HCI(Host Interface Controller):是 Host 和 Controller 通信之间的接口。定义了特定的格式来控制蓝牙芯片来做相应的动作(比如:inquiry,connect,disconnect)
HCI 层为上层级提供了一个统一访问 HCI 控制器的接口,其接口为一系列的指令和事件,接口适用于 BR/EDR/LE/AMP 控制器。
HCI 层位于蓝牙高层协议和低层协议之间,其目的是实现主机设备与蓝牙模块之间的互操作,即 HCI 是蓝牙主机与主机控制器间软硬件接口。HCI 为蓝牙硬件中基带控制器和链接管理器提供了命令接口,从而实现对硬件状态注册器和控制寄存器的访问,提供了对蓝牙基带的统一访问模式。 目前,HCI 的传输层主要有:USB,RS-232,UART 等。
2. 数据交互
HCI 是双向的,发给 Controller 的命令称之为 HCI Command,Controller 发给上层的成为 HCI Event。
模块接收到每个 CMD 后都会回复一个与之对应的 EVENT 作为回应。 此机制应作为软件流控机制处理。 即, MCU 发送 CMD 后应等待一个与之对应的 EVENT, 收到 EVENT 后再发送新的 CMD。
蓝牙启动的时候,主机会像蓝牙发送:复位、波特率设置、协议代码等,一般蓝牙稳定后发送一个 READY EVENT 通知主机可以正常发送 CMD。
2.1 HCI CMD
Controller 可以接受除去 host 包头外的 255 字节。
CMD 包格式参考: 【0x01 0x01 0x06 0x11 0x22 0x33 0x44 0x55 0x66】
类型 | 长度 | 数据 |
---|---|---|
CMD | Byte0 | 0x01 |
Opcode | Byte1 | 0x01 |
Length | Byte2 | 0x06 |
Payload | Byte3~Byte8 | 0x11 0x22 0x33 0x44 0x55 0x66 |
2.2 HCI EVENT
模块发送给 MCU 的包称为 EVENT(事件), 模块通过发送 EVENT 来完成通知蓝牙状态变化、 上报数据等操作。
参数 | 解释 |
---|---|
Event Code | 用以区分不同的事件(0x00~0xFF) |
Parameter_Total_length | 参数的长度(以字节为单位) |
Event Parameter[0] ~ Event Parameter[N] | 参数列表 |
CMD 包格式参考: