这里会显示出您选择的修订版和当前版本之间的差别。
后一修订版 | 前一修订版 | ||
cc2640r2f:hci [2017/08/31 16:30] 127.0.0.1 外部编辑 |
cc2640r2f:hci [2021/06/22 23:14] (当前版本) |
||
---|---|---|---|
行 1: | 行 1: | ||
< | < | ||
- | # Host控制接口(HCI) # | ||
- | 主控制器接口(HCI)层是在蓝牙协议栈的主机(Host)和控制器(controller)之间传送命令和事件的薄层。在纯网络处理器应用程序(即host_test项目)中,HCI层通过SPI或UART等传输协议实现。 | ||
- | 在诸如simple_peripheral项目的嵌入式无线MCU项目中,HCI层通过无线MCU内的函数调用和回调来实现。所有与Controller进行通信的命令和事件(如ATT,GAP等)将最终称为HCI API,从协议栈的Host通过HCI层传递到Controller。同样,控制器通过HCI将接收到的数据和事件发送到Host上层。 | + | # Host 控制接口( |
- | 除了标准的蓝牙LE HCI命令之外,还有许多HCI扩展供应商特定的命令可以扩展控制器的一些功能,以供应用使用。有关在嵌入式应用程序中调用的可用HCI和HCI扩展命令的描述,请参阅BLE Stack API参考。 | + | 主控制器接口( HCI )层是在蓝牙协议栈的主机( Host )和控制器( controller )之间传送命令和事件的薄层。在纯网络处理器应用程序(即 host_test 项目)中,HCI 层通过 SPI 或 UART 等传输协议实现数据处理。 |
- | BLE5-Stack支持纯网络处理器配置(host_test),即允许应用程序在外部MCU上运行以连接到BLE5-Stack。网络处理器可以通过外部传输协议(UART,SPI等)接受所有LE | + | 类似 simple_peripheral 的嵌入式无线MCU项目中,HCI 层通过无线 MCU 内的函数调用和回调来实现通信。所有与 Controller 进行通信的命令和事件(如 ATT 、GAP |
- | 类似于网络处理器配置(host_test),BLE5-Stack可以被配置为使用子集HCI命令,然后通过UASRT,SPI传递给控制器,从而能够切换到完整的嵌入式应用。此配置称为生产测试模式(PTM)。可用的HCI命令的子集是执行蓝牙RF认证的子集。有关如何在嵌入式应用程序上启用PTM的信息,请参阅使用生产测试模式(PTM)。 | + | 除了标准的蓝牙 LE HCI 命令之外,还有许多 HCI 扩展供应商特定的命令可以扩展控制器的一些功能。有关在嵌入式应用程序中调用的可用 HCI 和 HCI 扩展命令的描述,请参阅 |
- | 当需要满足以下条件时,应考虑将PTM用于直接测试模式(DTM),以代替完整的网络处理器配置(host_test): | + | BLE5-Stack 支持纯网络处理器配置( host_test ),即允许应用程序在外部 MCU 上运行以连接到 BLE5-Stack 。网络处理器可以通过外部传输协议( UART、 SPI 等)接受所有 LE HCI 命令。由于 BLE Controller 和 Host 都驻留在无线 MCU 上,一些 HCI 命令会使对应的事件被 TI BLE 主机消耗。因此,不可能使用标准 HCI LE 命令将外部的蓝牙主机与 CC2640 无线 MCU 进行接口连接。网络处理器配置应使用 HCI 和 TI 供应商特定的 HCI 命令来实现外部蓝牙应用。 |
- | - 设备只会烧写一次FLASH在生产过程中。并且固件镜像无法再更改 | + | 类似于网络处理器配置( host_test ),BLE5-Stack 可以被配置为使用子集 HCI 命令,可用的 HCI 命令的子集是执行蓝牙 RF 认证的子集。HCI 命令通过 UASRT、SPI传递给控制器,从而能够切换到完整的嵌入式应用,此配置称为生产测试模式( PTM )。有关如何在嵌入式应用程序上启用 PTM 的信息,请参阅使用生产测试模式( PTM )。 |
- | - HCI传输层FLASH可用,PTM需要FLASH在应用程序,因此减少应用程序FLASH | + | 当需要满足以下条件时,应考虑将 PTM 用于直接测试模式( DTM ),以代替完整的网络处理器配置( host_test ): |
- | 注意 | + | - 在生产过程中设备只会烧写一次 FLASH ,并且固件镜像无法再更改 |
- | BLE5-Stack也支持直接测试模式(DTM)。DTM在蓝牙核心规范版本5.0的直接测试模式部分([第6卷,第F部分))中有详细描述。Host_test支持所有DTM命令以及供应商特定的调制解调器测试命令。有关如何设置用于定制产品和芯片包类型的host_test应用程序二进制文件的信息,请参阅配置CC2640的蓝牙直接测试模式(SWRA530)。 | + | |
+ | - HCI 传输层 FLASH 可用,在应用程序中 PTM 需要 FLASH ,因此减少应用程序 FLASH | ||
+ | |||
+ | < | ||
+ | |||
+ | ## 在应用程序中使用 HCI 和 HCI 供应商特定的命令 ## | ||
- | ## 在应用程序中使用HCI和HCI供应商特定的命令 ## | ||
按照以下步骤使用这些命令并在应用程序中接收各自的事件: | 按照以下步骤使用这些命令并在应用程序中接收各自的事件: | ||
- | 1. 包括HCI传输层头文件。 | + | |
+ | 1. 包括 HCI 传输层头文件。 | ||
````C | ````C | ||
`# | `# | ||
```` | ```` | ||
- | 2. 注册用于HCI/ | + | |
+ | 2. 注册用于 HCI/Host 消息的 GAP,以便从控制器接收事件。这应该在应用程序初始化函数中完成。 | ||
````C | ````C | ||
- | // | + | //注册 GAP 用于 HCI / |
GAP_RegisterForMsgs (selfEntity ); | GAP_RegisterForMsgs (selfEntity ); | ||
```` | ```` | ||
- | 3. 应用程序能调用HCI或HCI特定于供应商的命令。请参阅BLE Stack API Reference,HCI部分具体介绍可以发送哪些命令。 | ||
- | 4. 作为HCI_GAP_EVENT_EVENT的任务间消息返回HCI事件 | + | 3. 应用程序能调用 |
- | 以下部分讨论接收HCI事件和HCI供应商特定的事件。 | + | 4. 作为 HCI_GAP_EVENT_EVENT 的任务间消息返回 |
- | ## 标准LE | + | 以下部分讨论接收 |
- | 这些命令在“ 蓝牙核心规范版本5.0”的“HCI命令和事件”一章(第2卷,第E部分,第7节)中有记录。使用这些命令的机制与蓝牙核心规范版本5.0中的任何命令相同,包括HCI LE命令。下面的示例演示了如何使用 蓝牙核心规范版本5.0在应用程序中实现HCI命令。使用的命令是读RSSI命令。 | + | |
- | ### 发送HCI命令 ### | + | ## 标准 LE HCI 命令和事件 ## |
- | 1. 在蓝牙核心规范版本5.0中查找命令: | + | |
+ | 这些命令在“ 蓝牙核心规范版本 5.0 ”的“ HCI 命令和事件”一章(第 2 卷,第 E 部分,第 7 节)中有记录。使用这些命令的机制与蓝牙核心规范版本 5.0 中的任何命令相同,包括 HCI LE 命令。 | ||
+ | |||
+ | 下面的示例演示了如何使用蓝牙核心规范版本 5.0 在应用程序中实现 HCI 命令,使用的命令是读 RSSI 命令。 | ||
+ | |||
+ | ### 发送 HCI 命令 ### | ||
+ | |||
+ | 1. 如图 1 在蓝牙核心规范版本 5.0 中查找命令: | ||
![](http:// | ![](http:// | ||
- | 2. 查找映射到BLE堆栈命令。使用BLE Stack API参考(HCI部分 -> HCI功能映射),显示此命令映射到HCI_ReadRssiCmd()。 | + | 图1. 蓝牙核心规范中查找命令 |
+ | |||
+ | 2. 查找映射到 BLE 堆栈命令。使用 BLE Stack API 参考( HCI 部分 -> HCI 功能映射),显示此命令映射到 HCI_ReadRssiCmd()。 | ||
+ | |||
+ | 3. 使用步骤 1 中的 API ,填写参数并从应用程序的某处调用命令。在形成连接后,应该调用此特定命令。这里只有一个参数:一个 2 字节的连接句柄。本例连接句柄是 0x0000: | ||
- | 3. 使用步骤1中的API,填写参数并从应用程序的某处调用命令。在形成连接后,应该调用此特定命令。这里只有一个参数:一个2字节的连接句柄。在这个例子的情况下,连接句柄是0x0000: | ||
````C | ````C | ||
`HCI_ReadRssiCmd (0x0000); | `HCI_ReadRssiCmd (0x0000); | ||
```` | ```` | ||
- | ### 接收HCI event ### | ||
- | 注意: | ||
- | 1.查看蓝牙核心规范版本5.0以查看返回事件的格式: | + | ### 接收 HCI event ### |
+ | |||
+ | < 注意: | ||
+ | |||
+ | 1.如图 2 ,查看蓝牙核心规范版本 5.0 以查看返回事件的格式: | ||
![](http:// | ![](http:// | ||
- | 2. 此命令返回一个Command complete事件(hciEvt_CmdComplete_t),因此在处理HCI_GAP_EVENT_EVENT时将其添加。这在下面进一步详细说明。 | + | 图2. 返回事件的格式 |
+ | |||
+ | 2. 此命令返回一个 Command complete 事件( hciEvt_CmdComplete_t ),在处理 HCI_GAP_EVENT_EVENT 时需要将其添加。这在下面进一步详细说明。 | ||
````C | ````C | ||
static | static | ||
行 67: | 行 86: | ||
case HCI_GAP_EVENT_EVENT : | case HCI_GAP_EVENT_EVENT : | ||
{ | { | ||
- | // | + | // |
{ | { | ||
- | // | + | //处理 HCI 命令完成事件情况 |
HCI_COMMAND_COMPLETE_EVENT_CODE : | HCI_COMMAND_COMPLETE_EVENT_CODE : | ||
{ | { | ||
行 89: | 行 108: | ||
if (handle | if (handle | ||
{ | { | ||
- | // | + | // |
| | ||
```` | ```` | ||
- | 首先,检查堆栈消息的状态以查看它是什么类型的HCI事件。在这种情况下,它是一个 HCI_COMMAND_COMPLETE_EVENT_CODE。然后,将作为消息(pMsg)从堆栈返回的事件转换为hciEvt_CmdComplete_t,其定义为: | + | |
+ | 首先,检查堆栈消息的状态以查看它是什么类型的 HCI 事件。本例是一个 HCI_COMMAND_COMPLETE_EVENT_CODE。然后,将作为消息( pMsg )从堆栈返回的事件转换为 hciEvt_CmdComplete_t,其定义为: | ||
````C | ````C | ||
// Command Complete Event typedef struct | // Command Complete Event typedef struct | ||
行 103: | 行 124: | ||
} hciEvt_CmdComplete_t ; | } hciEvt_CmdComplete_t ; | ||
```` | ```` | ||
- | 接下来,检查cmdOpcode,并发现它与HCI_READ_RSSI匹配 。然后检查事件的状态。现在事件已知,可以使用蓝牙核心规范版本5.0中的信息来解析pReturnParmam 。上述蓝牙核心规范版本5.0 API声明pReturnParam的第一个字节为状态。的蓝牙核心规范5.0版 API指出pReturnParam的第二和第三个字节是句柄。然后检查RSSI以查看它是否对应于所需的连接手柄。继续解析使用蓝牙核心规范版本5.0 API,RSSI值可以通过读取pReturnParam的第四个字节来找到。最后,存储RSSI值。 | ||
- | ## HCI供应商特定的命令 ## | + | 首先检查 cmdOpcode,发现它与 HCI_READ_RSSI 匹配 。然后检查事件的状态,现在事件已知,可以使用蓝牙核心规范版本 5.0 中的信息来解析 pReturnParmam 。蓝牙核心规范版本 5.0 API 声明 pReturnParam 的第一个字节为状态,第二和第三个字节是句柄。之后检查 RSSI 以查看它是否对应于所需的连接手柄,RSSI 值可以通过读取 pReturnParam 的第四个字节来找到。最后存储 RSSI 值。 |
- | 这些命令在“ TI供应商特定HCI指南”中有说明。对于所有特定于供应商的命令,使用这些命令的机制是相同的。下面的示例演示了如何使用“ TI供应商特定HCI指南” 在应用程序中实现HCI命令。使用的命令是HCI扩展包错误率。 | + | |
+ | ## HCI 供应商特定的命令 ## | ||
+ | |||
+ | 这些命令在“ TI 供应商特定 HCI 指南”中有说明。对于所有特定于供应商的命令,使用这些命令的机制是相同的。下面的示例演示了如何使用“ TI 供应商特定 HCI 指南” 在应用程序中实现 HCI 命令。使用的命令是 HCI 扩展包错误率。 | ||
- | ### 发送HCI供应商特定的命令 ### | + | ### 发送 HCI 供应商特定的命令 ### |
- | 1. 在TI BLE供应商特定指南中查找命令: | + | 1. 如图 4 ,在 TI BLE 供应商特定指南中查找命令: |
![](http:// | ![](http:// | ||
+ | 图4. 供应商特定指南中查找指令 | ||
- | 2. 使用BLE Stack API Reference中的HCI部分找到实现此命令的BLE Stack函数:HCI_EXT_PacketErrorRateCmd()。 | + | |
- | 3. 使用步骤1中的API,填写参数并从应用程序调用命令。在这种特定情况下,在连接形成后应该调用此命令。第一个参数是一个2字节的connHandle,这个例子是0x0000。第二个参数是读取计数器的1字节命令(HCI_EXT_PER_READ)。因此,使用: | + | 2. 使用 BLE Stack API Reference 中的 HCI 部分找到实现此命令的 BLE Stack 函数:HCI_EXT_PacketErrorRateCmd()。 |
+ | |||
+ | 3. 使用步骤 1 中的 API,填写参数并从应用程序调用命令。在这种特定情况下,连接形成后应该调用此命令。第一个参数是一个 2 字节的 connHandle,本例是等于 | ||
`HCI_EXT_PacketErrorRateCmd ( 0 , HCI_EXT_PER_READ | `HCI_EXT_PacketErrorRateCmd ( 0 , HCI_EXT_PER_READ | ||
- | ### 接收HCI供应商特定事件 ### | + | ### 接收 HCI 供应商特定事件 ### |
- | 1. 在“ TI供应商特定HCI指南”中查找相应的事件 | + | 1. 如图 5 ,在“ TI 供应商特定 HCI 指南”中查找相应的事件 |
![](http:// | ![](http:// | ||
![](http:// | ![](http:// | ||
- | 2. 如命令API的“对应事件”部分所述,此命令返回“供应商特定命令完成事件”(hciEvt_VSCmdComplete_t),因此在处理HCI_GAP_EVENT_EVENT处理时添加此事件。这在下面进一步详细说明。 | + | 图5. 供应商特定指南中查找事件 |
+ | |||
+ | 2. 如命令 API 的“对应事件”部分所述,命令返回的是“供应商特定命令完成事件”( hciEvt_VSCmdComplete_t ),在处理 HCI_GAP_EVENT_EVENT 处理时需要添加该事件。这在下面进一步详细说明。 | ||
````C | ````C | ||
static uint8_t SimpleBLEPeripheral_processStackMsg(ICall_Hdr* pMsg) | static uint8_t SimpleBLEPeripheral_processStackMsg(ICall_Hdr* pMsg) | ||
行 163: | 行 192: | ||
```` | ```` | ||
- | 首先,检查堆栈消息的状态以查看它是什么类型的HCI事件。在这种情况下,它是一个HCI_VE_EVENT_CODE。接下来,将作为消息(pMsg)从堆栈返回的事件转换为hciEvt_VSCmdComplete_t,其定义为: | + | |
+ | 首先,检查堆栈消息的状态以查看它是什么类型的 HCI 事件,本例是一个 HCI_VE_EVENT_CODE。接下来,把它作为消息( pMsg)从堆栈返回的事件转换为 hciEvt_VSCmdComplete_t ,其定义为: | ||
````C | ````C | ||
typedef struct | typedef struct | ||
行 171: | 行 202: | ||
} hciEvt_VSCmdComplete_t; | } hciEvt_VSCmdComplete_t; | ||
```` | ```` | ||
- | 通过读取command_complete-> | ||
- | 接下来,解析* pEventParam来提取事件API中定义的参数。前两个字节(图67中以红色显示)是事件操作码(0x1404)。第三个字节是状态。所有供应商特定事件都是这种情况。 | + | 通过读取 command_complete -> cmdOpcode |
- | 从pEventParam的第四个字节开始,从第三个参数开始,使用“TI BLE供应商指南”中的事件API进行解析。所有供应商特定事件都是这种情况。对于此示例,pEventParam的第四个字节对应于cmdVal参数。这在存储器中显示并在下面进一步解释。 | + | 接下来,解析* pEventParam 并提取事件 API 中定义的参数。前两个字节(图 6 中以红色显示)是事件操作码( 0x1404 ),第三个字节是状态。所有供应商特定事件都是这种情况。 |
+ | |||
+ | 从 pEventParam 的第四个字节,第三个参数开始,使用“ TI BLE 供应商指南”中的事件 API 进行解析。所有供应商特定事件都是这种情况。对于此示例, pEventParam 的第四个字节对应于 cmdVal 参数。pEventParam | ||
![](http:// | ![](http:// | ||
- | 通过读取事件参数的第三个字节(command_complete-> | + | 图6. 存储器中的字节参数 |
- | 从事件参数(command_complete-> | + | 通过读取事件参数的第三个字节( command_complete -> pEventParam [2])来检查状态。图 6 中以黄色显示。 |
- | 使用事件API继续解析,下一个参数是两个字节的numPkts。这是通过在事件参数的第五和第六个字节中构建一个uint16_t来找到的。这显示为蓝色。以类似的方式,从第七和八个字节的事件参数(绿色显示)中找到numCrcErr。 | + | 从事件参数( command_complete -> pEventParam [3])的第四个字节开始,事件 API 指出下一个参数是一个字节的 |
- | 接下来,从事件参数的第九和第十个字节找到numEvents(以橙色显示)。最后,从事件参数的第十一和第十二个字节找到numMissedEvents(以紫色显示)。 | + | 使用事件 API 继续解析,下一个参数是两个字节的 numPkts 。这是通过在事件参数的第五和第六个字节中构建一个 uint16_t 来找到的,显示为蓝色。以类似的方式,从第七和八个字节的事件参数(绿色显示)中找到 numCrcErr。 |
+ | |||
+ | 接下来,从事件参数的第九和第十个字节找到 numEvents(以橙色显示)。最后,从事件参数的第十一和第十二个字节找到 numMissedEvents(以紫色显示)。 | ||
## 加入我们 ## | ## 加入我们 ## | ||
+ | |||
文章所有代码、工具、文档开源。加入我们[**QQ群 591679055**](http:// | 文章所有代码、工具、文档开源。加入我们[**QQ群 591679055**](http:// | ||
<div> | <div> | ||
行 197: | 行 232: | ||
</ | </ | ||
- |