在本章中,我们首先解释蓝牙芯片组如何物理连接,然后提供有关流行的蓝牙芯片组及其与BTstack一起使用的信息。
HCI接口
主机(计算机或MCU)与主机控制器(实际蓝牙芯片组)之间的通信遵循主机控制器接口(HCI),如下所示。HCI定义了如何交换命令,事件,异步和同步数据包。异步数据包(ACL)用于数据传输,而同步数据包(SCO)用于带有耳机和免提配置文件的语音。
HCI H2
在桌面级计算机上 笔记本电脑,USB主要用作HCI传输层。对于USB蓝牙芯片组,几乎没有变化:市场上的大多数USB硬件锁目前包含Broadcom BCM20702或CSR 851x芯片组。它也被称为H2。
在嵌入式系统中,使用UART连接,尽管也可以使用USB。
对于UART连接,存在不同的传输层变体。
HCI H4
最常见的是官方的“UART Transport”,也称为H4。它需要通过CTS / RTS线路进行硬件流量控制,并假设UART线路没有错误。
HCI H5
“三线UART传输”,也称为H5,利用SLIP协议传输数据包,并通过重传处理数据包丢失和比特错误。虽然可以在没有硬件握手的情况下将H5真正用于“三线”,但我们建议使用带有硬件握手的完整UART。如果您的设计缺乏硬件握手,H5是您唯一的选择。
BCSP
H5的前身。与H5的主要区别在于,偶数奇偶校验用于BCSP。要将BCSP与BTstack一起使用,可以使用H5传输并调用hci_transport_h5_enable_bcsp_mode
eHCILL
最后,德州仪器(TI)扩展了H4以创建“eHCILL传输”层,允许双方进入睡眠模式而不会失去同步。虽然它比H5更容易实现,但它仅受TI芯片组支持,无法处理数据包丢失或误码。
H4通过SPI
来自Dialog Semiconductor和EM Marin的芯片组允许通过SPI发送H4格式的HCI数据包。SPI具有主机控制器和主机更简单实现的优点,因为它不需要精确的时钟。SPI主设备(这里是主机)提供SPI时钟,SPI从设备(主机控制器)只需在时钟线改变时读取和更新数据线。EM9304支持高达8 Mhz的SPI时钟。但是,需要一个附加协议让主机知道主机控制器何时有HCI数据包。通常,使用额外的GPIO来发出信号。
HCI的缺点
不幸的是,人机交互标准错过了一些相关的细节:
-
对于基于UART的连接,未定义初始波特率,但大多数蓝牙芯片组使用115200波特。为了获得更好的吞吐量,需要更高的波特率,但是没有标准的HCI命令来更改它。相反,每个供应商都必须提出他们自己的一组特定于供应商的命令。有时,还需要额外的步骤,例如进行热复位,以激活波特率变化。
-
某些蓝牙芯片组没有唯一的MAC地址。一开始,需要设置MAC地址,但没有标准的HCI命令来设置它。
-
语音的SCO数据既可以通过HCI接口传输,也可以通过芯片组上的显式PCM / I2S接口传输。大多数芯片组默认使用PCM / I2S接口。要通过USB或免提配置文件中的宽带语音使用它,需要将数据传送到主机MCU。较新的蓝牙标准定义了用于配置SCO路由的HCI命令,但是到目前为止我们测试的芯片组中没有实现它。相反,这也是以特定于供应商的方式配置的。
-
此外,大多数供应商允许通过向芯片组发送自定义命令来在运行时修补或配置其芯片组。显然,这也取决于供应商。
文档和支持
各种蓝牙芯片组提供商之间的开发人员文档和支持水平差异很大。
根据我们的经验,只有德州仪器和EM Microelectronics直接在其网站上提供所有相关信息。Nordic Semiconductor没有正式使用带有HCI接口的蓝牙芯片组,但是他们的nRF5系列文档是完整的,信息非常丰富。TI和Nordic还通过各自的网络论坛提供出色的支持。
Broadcom的蓝牙+ Wifi部门已被赛普拉斯半导体公司收购,据我们所知,它仅向大客户提供开发人员文档。可以加入他们的社区论坛并下载WICED SDK。WICED SDK针对Wifi +蓝牙组合芯片组,包含必要的芯片组补丁文件。
已被高通公司收购的CSR在签署保密协议后在其支持网站上提供所有相关信息。
芯片组概述
芯片组 |
类型 |
人体交通运输 |
BD_ADDR(1) |
SCO over HCI(2) |
LE DLE |
多个LE角色 |
BTstack文件夹 |
评论 |
Atmel ATWILC3000 |
LE |
H4 |
是 |
不知道 |
没有 |
没有 |
atwilc3000 |
BLE固件大小:60 kB |
Broadcom UART |
双模式 |
H4,H5 |
很少 |
部分(2) |
没有 |
也许(3) |
BCM |
最大UART波特率为2 mbps |
Broadcom USB Dongles |
双模式 |
USB |
是 |
是 |
没有 |
没有 |
BCM |
|
CSR UART |
双模式 |
H4,H5,BCSP |
很少 |
部分(2) |
没有 |
没有 |
企业社会责任 |
|
CSR USB加密狗 |
双模式 |
USB |
大多 |
是 |
没有 |
没有 |
企业社会责任 |
|
赛普拉斯CYW20704 / 7 |
双模式 |
H4,H5,USB |
不知道 |
部分(2) |
是 |
是 |
BCM |
|
赛普拉斯CYW20819 |
双模式 |
H4,H5,USB |
不知道 |
部分(2) |
是 |
是 |
BCM |
在电源循环期间保持CTS为高电平 |
赛普拉斯PSoC 4 |
LE |
H4 |
不知道 |
呐 |
是 |
不知道 |
|
HCI固件是PSoC Creator套件示例的一部分 |
对话DA14581 |
LE |
H4,SPI |
没有 |
呐 |
没有 |
没有 |
da14581 |
BTstack中包含官方HCI固件 |
Dialog DA14585 |
LE |
H4,SPI |
没有 |
呐 |
是 |
是 |
da14581 |
BTstack中包含官方HCI固件 |
Dialog DA1469x |
LE |
H4,SPI |
没有 |
呐 |
是 |
是 |
da14581 |
DA14固件是DA1469x SDK的一部分 |
Espressif ESP32 |
双模式 |
VHCI |
是 |
还没 |
是 |
是 |
|
SoC具有蓝牙和Wifi |
EM 9301 |
LE |
SPI,H4 |
没有 |
呐 |
没有 |
没有 |
em9301 |
自定义HCI SPI实现 |
EM 9304 |
LE |
SPI,H4 |
是 |
呐 |
是 |
是 |
em9301 |
自定义HCI SPI实现 |
英特尔双无线8260,8265 |
双模式 |
USB |
是 |
大概 |
不知道 |
不知道 |
英特尔 |
固件大小:400 kB |
北欧nRF |
LE |
H4 |
固定随机 |
呐 |
是 |
是 |
|
需要HCI固件 |
STM STLC2500D |
经典 |
H4 |
没有 |
不知道 |
呐 |
呐 |
stlc2500d |
不支持自定义深度睡眠管理 |
东芝TC35661 |
双模式 |
H4 |
没有 |
没有 |
没有 |
没有 |
tc3566 |
仅-007/009型号提供完整的HCI。见下文 |
TI CC256x,WL183x |
双模式 |
H4,H5,eHCILL |
是 |
是 |
没有 |
适用于CC256XC |
cc256x |
还有WL185x,WL187x和WL189x |
备注:
-
BD_ADDR:如果蓝牙芯片组符合其自己的有效MAC Addess,则表示存在。更好的Broadcom和CSR加密狗通常带有加密狗制造商的MAC地址,但更便宜的加密狗可能带有相同的地址。
-
SCO over HCI:所有Bluetooth Classic芯片组通常支持SCO over HCI。BTstack可以毫无问题地接收SCO数据包。但是,只有TI CC256x支持在Controller中使用SCO缓冲区和有用的流控制。在CSR / Broadcom /赛普拉斯控制器上,BTstack无法在Controller中排队多个SCO数据包。相反,必须在正确的时间定期发送SCO数据包 – 没有明确指示何时。当前实现观察所接收的SCO分组的时间戳以调度发送分组。由于可以完全控制系统而没有其他蓝牙数据,因此可以完美无缺,但总的来说它非常脆弱。对于这些,必须使用I2S / PCM接口以稳定运行。,对于标有“否”的人,我们要么没有尝试,要么没有'
-
多个LE角色:Apple在其iOS设备中使用Broadcom蓝牙+ Wifi,较新的iOS版本支持多个并发LE角色,因此至少有一些Broadcom模型支持多个并发LE角色。
爱特梅尔/ Microchip的
ATILC3000蓝牙/ Wifi组合控制器已在Atmel / Microchip的嵌入式设备上与Linux一起使用。可以从GitHub存储库获得驱动程序和文档。ATWILC3000具有存储在ROM中的基本HCI实现,并且需要在可以使用之前上载固件映像。BLE控制器符合QDID 99659标准。请注意:BLE固件大约为60 kB。它可能还需要一个单独的Wifi固件。
虽然所有芯片组都存储了官方地址,但可以使用特定于供应商的命令设置BD Addr。BD_ADDR查找结果为“Newport Media Inc.” 该公司于2014年被Atmel收购。
可以使用自定义命令设置波特率。
BTstack集成:btstack_chipset_atwilc3000.c包含将蓝牙固件映像下载到ATWILC3000的RAM中的代码。之后,BTstack通常可以使用它。
Broadcom / Cypress Semiconductor
在赛普拉斯半导体接管Broadcom Wifi +蓝牙部门之前,无法以低数量购买Broadcom芯片组。然而,像Ampak这样的模块制造商创建了包含Broadcom BCM芯片组(蓝牙以及蓝牙+ Wifi组合)的模块,这些模块可能已经过FCC和类似认证的预测试。
一个流行的例子是Ampak AP6212A模块,它包含一个BCM 43438A1,用于Raspberry Pi 3,RedBear Duo和RedBear IoT pHAT,用于较旧的Raspberry Pi模型。
CYW20704 A2控制器同时支持DLE和多个LE角色,例如可从LairdTech获得UART模块(BT860),USB模块(BT850)和USB加密狗。
有趣的是,CYW20704表现出与CC2564相同的UART流量控制错误。您可以添加ENABLE_CYPRESS_BAUDRATE_CHANGE_FLOWCONTROL_BUG_WORKAROUND以激活变通方法和/或阅读下面TI部分中的错误和工作表描述。
到目前为止,关于供应商特定命令的文档的最佳来源是来自Android的blueZ和Bluedroid蓝牙堆栈的源代码,但是随着赛普拉斯的接管,可以直接获得文档。
Broadcom USB加密狗不需要特殊配置,但默认情况下SCO数据不通过USB路由。
可以使用PSoC Creator Kit示例中的“BLE DTM”HCI固件对PSoC 4 SoC进行编程。UART波特率设置为115200.对于更高的波特率,时钟可能需要以不同方式配置,因为IDE会对此发出警告。
CYW20819可用作赛普拉斯蓝牙堆栈的SoC。要将其用作HCI H4上的常规蓝牙控制器,必须在上电/复位期间置位CTS。
Init脚本:对于UART连接的芯片组,必须在上电后上载init脚本。对于在Broadcom Wifi +蓝牙组合中使用的蓝牙芯片组,此文件通常可以在Linux发行版中找到,其结尾为“.hcd”,或者作为包含init脚本的C源文件的WICED SDK的一部分。没有文件系统的数据阵列。
要查找正确的文件,Broadcom芯片组会在询问其本地名称时返回其型号。
BTstack支持以两种变体上传init脚本:使用在posix-h4端口中按名称查找的.hcd文件,以及通过链接到WICED端口中的init脚本。在处理init脚本时,芯片组RTS线变高,但是在发送init脚本的最后一个命令的命令完成事件后仅2 ms。在收到最后一条命令的命令完成事件后,BTstack等待10 ms,以避免在RTS变为高电平且命令失败之前发送。
可以使用自定义命令设置BD Addr。某些模块(例如AP6212A)提供固定地址,但其他模块则不提供。
可以使用bluez源中的自定义命令配置SCO数据。它适用于USB芯片组。芯片组不实现BTstack用于UART连接设备的SCO流控制。一个论坛建议尽可能快地发送SCO数据包,因为两个方向具有相同的恒定速度。
可以使用自定义命令设置波特率。上传init脚本后,在热启动期间波特率会重置。因此,整体方案是这样的:从默认波特率开始,获取本地版本信息,发送自定义Broadcom波特率更改命令,等待响应,将本地UART设置为高波特率,然后发送init脚本。从init脚本发送最后一个命令后,重置本地UART。最后,发送自定义波特率更改命令,等待响应,并将本地UART设置为高波特率。
BTstack集成:所有Broadcom芯片组的通用代码由btstack_chipset_bcm.c提供。在设置过程中,btstack_chipset_bcm_instance函数用于获取btstack_chipset_t实例并传递给hci_init函数。
对于USB加密狗和UART连接,SCO数据可以通过HCI路由,但BTstack不支持UART连接的流量控制。通过I2C / PCM引脚支持HSP和HFP窄带语音。
CSR / Qualcomm Incorporated
CSR plc已于2015年8月被高通公司收购。
与Broadcom类似,文档的最佳来源是blueZ的源代码。
CSR USB加密狗不需要特殊配置,默认情况下SCO数据通过USB路由。
CSR芯片组通常不需要实际的init脚本,但它们允许通过所谓的PSKEY配置芯片组。设置一个或多个PSKEY后,热重置会激活新设置。
BD Addr可以通过PSKEY设置。如果芯片组具有某种持久存储器来存储它,则可以提供固定地址。大多数USB蓝牙适配器都有固定的BD ADDR。
可以通过一组PSKEY配置SCO数据。我们还无法通过HCI为SCO数据路由UART连接。
波特率可以设置为初始配置的一部分,并通过热复位激活。
BTstack集成:所有Broadcom芯片组的通用代码由btstack_chipset_csr.c提供。在设置过程中,btstack_chipset_csr_instance函数用于获取btstack_chipset_t实例并传递给hci_init函数。波特率在常规配置期间设置。
SCO数据通过HCI路由到USB加密狗,但不用于UART连接。通过I2C / PCM引脚支持HSP和HFP窄带语音。
Dialog Semiconductor
Dialog Semiconductor提供DA14581,这是一款仅支持LE的SoC,可以使用HCI固件进行编程。HCI固件可以在启动时上载到SRAM中,也可以存储在OTP(一次性可编程)存储器中,也可以存储在外部SPI中。
它不实现数据长度扩展或支持多个并发角色。
较新的DA14585使用与581型号相同的固件上载机制。此外,它还支持数据长度扩展以及多个并发角色。
更新的DA1469x使用外置闪光灯。DA 1469x SDK包含一个HCI固件,可以使用SmartSnippets Studio编译并下载到闪存中。
BD Addr固定为80:EA:CA:00:00:01。HCI固件中没有命令以不同方式设置它。可以使用随机地址。
波特率:使用提供的固件将波特率固定为115200。通过重新编译HCI固件可以实现更高的波特率。
BTstack集成:btstack_chipset_da14581.c包含将提供的HCI固件下载到DA1458x的SRAM中的代码。之后,它可以用作任何其他HCI芯片组。DA1469x无需特殊支持。
Espressif ESP32
ESP32是一款SoC,内置双模蓝牙和Wifi收音机。HCI控制器以软件实现,并通过所谓的虚拟HCI(VHCI)接口访问。它支持LE数据长度扩展(DLE)以及多个LE角色。目前不支持SCO,但Espressif正在研究它。
蓝牙/ Wifi共存直到最近才起作用,似乎已经修复
EM Microelectronic Marin
长期以来,EM9301一直是唯一具有HCI接口的蓝牙单模LE芯片组。EM9301可通过SPI或UART连接。UART接口不支持硬件流控制,不建议与BTstack一起使用。如果EM9301有数据要发送,SPI模式使用专有但有记录的扩展来实现流量控制和信号。
2016年12月,EM发布了新的EM9304,它还具有HCI模式,并增加了对可选蓝牙4.2的支持。特征。它支持数据长度扩展和最多8个LE角色。EM9304是一个更大的MCU,允许在其上运行自定义代码。为此,支持将配置和固件上载到RAM或128 kB的一次性可编程区域的高级机制。它支持EM9301的供应商特定命令的超集。
EM9304由BTstack中的'stm32-l053r8-em9304'端口使用。port.c文件还包含数据表中指定的SPI H4协议的IRQ + DMA驱动实现。
必须在启动期间为EM9301设置BD Addr,因为它没有存储的修复地址。EM9304带有存储在OTP中的有效地址。
不支持SCO数据,因为它仅限LE。
可以为UART模式设置波特率。对于SPI,主器件通过SPI时钟线控制速度。3.3V,支持16 Mhz。
虽然可以将小型固件补丁上传到RAM或OTP内存(仅限EM9304),但不需要Init脚本。
BTstack集成:EM9304的通用代码由btstack_chipset_em9301.c提供。在设置过程中,btstack_chipset_em9301_instance函数用于获取btstack_chipset_t实例并传递给hci_init函数。它可以在启动期间设置BD Addr。
英特尔双无线8260,8265
Wifi /蓝牙组合卡主要用于移动计算机。蓝牙部分需要上载固件文件和配置文件。SCO,DLE,未测试多个角色。
北欧nRF5系列
Nordic nRF5系列芯片组的单模LE芯片组通常没有HCI接口。相反,它们提供LE蓝牙堆栈作为二进制库,即所谓的SoftDevices。开发人员可以在此库上编写蓝牙应用程序。由于芯片组可以编程,因此它还可以加载固件,为主机提供常规的HCI H4接口。
nRF5芯片组的一个有趣特性是它们可以同时支持多个LE角色,例如,在一个连接中为中心,在另一个连接中为外设。此外,nRF52 SoftDevice实现支持蓝牙4.2数据长度扩展。
nRF5系列,nRF51和nRF52都可以与HCI固件一起使用。nRF51目前(2016年11月18日)不支持加密连接,尽管这也可能得到支持。
BD ADDR未自动设置。但是,在生产期间,每个芯片中存储一个64位随机数。Nordic在其SoftDevice实现中将此随机数用作随机静态地址。
不支持SCO数据,因为它仅限LE。
虽然可以扩展固件以支持波特率更改,但是通过补丁将波特率固定为115200。
不需要Init脚本。
BTstack集成:支持与西风控制器nRF5芯片组提供btstack_chipset_zephyr.c。它在init期间查询静态随机地址。
要在BTstack中使用这些芯片组,您需要安装arm-none-eabi gcc工具链和nRF5x命令行工具。J-Link驱动程序,检查Zephyr项目,应用最小补丁来帮助使用随机静态地址,并将其闪存到芯片组上:
-
安装J-Link软件和文档包。
-
将nrfjprog作为nRFx-Command-Line-Tools的一部分。单击顶部的“下载”选项卡,查找您的操作系统。
-
Checkout Zephyr并安装工具链。我们建议使用arm-non-eabi gcc二进制文件,而不是自己编译它。至少在OS X上,这对我们来说是失败的。
-
在samples / bluetooth / hci_uart中编译nRF52 Dev Kit的固件
$ make BOARD=nrf52_pca10040
-
上传固件
$ ./flash_nrf52_pca10040.sh
-
对于nRF51开发套件,使用make BOARD=nrf51_pca10028和./flash_nrf51_10028.sh与nRF51套件。
-
nRF5开发套件用作带H4接口的LE HCI控制器。
意法半导体
意法半导体提供支持SPI和UART H4连接的蓝牙V2.1 + EDR芯片组STLC2500D。
尽管所有芯片组都存储了官方地址,但可以使用自定义命令设置BD Addr。
SCO数据可能有用。我们没试过。
可以使用自定义命令设置波特率。芯片组的波特率变化发生在0.5秒内。至少在BTstack上,确切知道命令何时通过UART完全发送是非常重要的,因此BTstack在100 ms后切换到新的波特率,以期望命令响应新的速度。
尽管可以上载固件补丁,但不需要Init脚本。
BTstack集成:支持的STLC2500C通过提供btstack_chipset_stlc.c。在设置过程中,btstack_chipset_stlc2500d_instance函数用于获取btstack_chipset_t实例并传递给hci_init函数。它可以实现更高的UART波特率,并在启动期间设置BD Addr。
德州仪器CC256x系列
德州仪器CC256x系列目前处于第四次迭代,提供仅经典(CC2560),双模(CC2564)和经典+ ANT(CC2567)型号。双模式芯片组的一种变体也集成在WL183x,WL185x,WL187x和WL189x系列的TI WiLink 8 Wifi +蓝牙组合模块中。后者中的一些也支持ANT。
CC256x芯片组通过UART连接进行连接,支持H4,H5(自第三次迭代)和eHCILL。
最新一代CC256xC芯片组并行支持多种LE角色。
可以通过hci_read_local_version_information命令返回的LMP Subversion识别不同的CC256x芯片组。TI还使用数字方式(AKA)来识别其芯片组。该表显示了CC256x和WL18xx系列的LMP Subversion和AKA编号。
芯片组 |
LMP Subversion |
AKA |
CC2560 |
0x191f |
31年2月6日 |
CC2560A,CC2564,CC2567 |
0x1B0F |
6.6.15 |
CC256xB |
0x1B90 |
6.7.16 |
CC256xC |
0x9a1a |
26年6月12日 |
WL18xx |
0xac20 |
32年8月11日 |
SCO数据路由到I2S / PCM接口,但可以使用HCI_VS_Write_SCO_Configuration命令进行配置。
可以使用HCI_VS_Update_UART_HCI_Baudrate设置波特率。芯片组通过命令完成事件确认更改,然后将本地UART设置为新速度。奇怪的是,CC256x芯片组在此特定命令完成响应期间忽略了传入的CTS线路。
如果您已经实现了hal_uart_dma.h而没有额外的环形缓冲区(如建议的那样!)并且您有一点延迟,例如由于RTOS上的线程切换,这可能会导致UART溢出。如果发生这种情况,BTstack通过在您的btstack_config.h中添加#define ENABLE_CC256X_BAUDRATE_CHANGE_FLOWCONTROL_BUG_WORKAROUND,在HCI H4传输实现中提供了一种解决方法。如果启用此选项,H4传输层将采用“深度数据包检查”来首先检查其是否为TI控制器,然后等待HCI_VS_Update_UART_HCI_Baudrate。检测到后,它将调整下一个UART读取以期望HCI命令完成事件。
尽管所有芯片组都存储了官方地址,但可以使用HCI_VS_Write_BD_Addr设置BD Addr。
Init脚本。为了使用CC256x芯片组,必须获取初始化脚本并将其转换为C文件以与BTstack一起使用。对于较新的版本,TI提供了需要组合的main.bts和ble_add_on.bts。
在Makefile 芯片组/ cc256x / Makefile.inc能够自动下载和转换请求的文件。它通过以下方式实现:
-
下载芯片组的一个或多个BTS文件。
-
运行Python脚本:
./convert_bts_init_scripts.py main.bts [ble_add_on.bts] output_file.c
BTstack集成:所有CC256x芯片组的通用代码由btstack_chipset_cc256x.c提供。在设置过程中,btstack_chipset_cc256x_instance函数用于获取btstack_chipset_t实例并传递给hci_init函数。btstack_chipset_cc256x_lmp_subversion为所选的init脚本提供LMP Subversion。
SCO数据可以通过HCI路由,因此支持HFP宽带语音。
东芝
东芝TC35661双模芯片组有三种型号可供选择:独立式。二进制蓝牙堆栈,作为具有嵌入式堆栈或常规HCI接口的模块。对于较新的硅,HCI变体具有型号TC35661-007和TC35561-009。
我们首先尝试了包含USB-to-UART适配器的USB评估棒和包含TC35661 -501的PAN1026模块。虽然它支持HCI接口并且Bluetooth Classic操作按预期工作,但不支持LE HCI命令。使用-007和-009型号,一切都按预期工作。
似乎不支持SCO数据。
可以使用自定义命令设置波特率。
必须使用自定义命令设置BD Addr。它没有存储的有效公共BD Addr。
不需要Init脚本。可能会上载补丁文件。
BTstack整合:为TC35661系列支持由提供btstack_chipset_tc3566x.c。在设置过程中,btstack_chipset_tc3566x_instance函数用于获取btstack_chipset_t实例并传递给hci_init函数。它可以实现更高的UART波特率,并在启动期间设置BD Addr。