当前位置: 首页 > news >正文

【Bluetooth】【Transport层篇】第四章 基于基础UART的蓝牙硬件发送协议 UART H4 Transport详解

一、UART H4 Transport 简介

       蓝牙 Transport 是主机(Host,蓝牙协议栈)与控制器(Controller,蓝牙芯片)之间的硬件层通信协议,负责承载 HCI(Host Controller Interface)数据。

       蓝牙 Transport 就是蓝牙的硬件发送协议,硬件的传输介质有:UART/USB/SDIO,如果有读者有一些嵌入式知识基础的话,这些通信方式就没有那么陌生了,那么Transport 就是在特定的硬件传输介质上增加了一些协议。

        比如:H4就是在UART上增加了一个小协议,H4算是最简单的一个协议,只是在数据前面加一个Type(类型标识),了解过蓝牙HCI一般都会知道蓝牙协议栈(Host)芯片(Controller)一般是通过硬件传输介质传输HCI数据来沟通,那么H4就是在HCI数据前面加上一个TYPE。

       简而言之,H4 是 UART 介质上的轻量实现:仅在 HCI 原始数据前附加 1 字节类型标识,用于区分 HCI 数据包的类别,是连接 “协议逻辑” 与 “硬件传输” 的桥梁。

二、H4 协议格式与数据包类型

H4 的传输格式为 “类型前缀 + HCI 原始数据”,结构如下:

plaintext

| 1 Byte (H4 Type) | N Bytes (HCI Raw Data) |

根据蓝牙 Core 规范,H4 定义了 5 种类型(对应不同 HCI 数据包):

HCI 数据包类型Type 值方向与用途
HCI Command0x01主机→控制器,由蓝牙协议栈发送给芯片的命令,发送控制命令(如 HCI_RESET)
HCI ACL Data0x02双向,蓝牙协议栈跟蓝牙芯片双向交互的普通数据,传输普通数据(如 BLE 连接数据)
HCI Synchronous Data (SCO)0x03双向,蓝牙芯片跟蓝牙协议栈双向交互的通话/语音识别等音频数据,传输实时音频(如传统语音通话)
HCI Event0x04控制器→主机,由蓝牙芯片上报给蓝牙协议栈的事件,上报事件(如命令完成、状态变化)
HCI ISO Data(Core 5.2+)0x05双向,用于发送LE audio,传输 LE Audio 的 ISO 同步数据(这部分是在core5.2才添加)

三、代码实现:H4 数据发送流程(以 HCI_RESET 为例)

以下通过HCI_RESET 命令发送,解析 H4 的核心逻辑:

3.1 缓冲区分配

H4 需要额外 1 字节存储 Type,因此缓冲区长度 = HCI 原始数据长度 + 1

// BT_TRANSPORT_TYPE=0x02 表示H4模式
struct bt_pbuf_t *p = bt_pbuf_alloc(BT_TRANSPORT_TYPE, HCI_RESET_PLEN + 1, BT_PBUF_RAM);

3.2 组装 HCI 原始数据

       通过hci_cmd_ass函数构建 HCI 命令的 opcode、参数(如 HCI_RESET 的原始数据为0x03 0x0c 0x00)。

3.3 插入 H4 Type

  • 先通过bt_pbuf_header将缓冲区头部后移 1 字节,预留 Type 空间;
  • 再填充类型(命令类型对应0x01):
bt_pbuf_header(p, 1); // 头部后移1字节,腾出Type位置  
((uint8_t *)p->payload)[0] = PHYBUSIF_PACKET_TYPE_CMD; // 写入Type=0x01  

3.4 UART 发送

       将 “Type + HCI 数据” 拷贝到 UART 发送缓冲区,最终通过uart_bt_send发送:

uint8_t *tx_buffer = bt_get_tx_buffer();  
bt_pbuf_copy_partial(p, tx_buffer, p->tot_len, 0); // 拷贝完整数据包  
uart_bt_send(tx_buffer, p->tot_len); // UART发送  

四、UART 硬件配置要求

为保证 H4 通信稳定,UART 需严格配置:

配置项参数值说明
数据位8 bit标准 HCI 数据宽度
奇偶校验无(No Parity)避免校验位干扰
停止位1 bit最简同步方式
流控硬件流控(RTS/CTS)防止数据溢出(必选)

STM32 配置示例:

USART_InitStructure.USART_WordLength = USART_WordLength_8b;  
USART_InitStructure.USART_StopBits = USART_StopBits_1;  
USART_InitStructure.USART_Parity = USART_Parity_No;  
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_RTS_CTS;  

Linux 配置示例(termios):

toptions.c_cflag &= ~CSTOPB; // 1停止位  
toptions.c_cflag |= CS8;     // 8数据位  
toptions.c_cflag &= ~PARENB; // 无校验  
toptions.c_cflag |= CRTSCTS; // 使能硬件流控  

五、同步与纠错机制

       UART 通信可能因噪声、波特率偏差等失步(如检测到无效 Type,或数据包长度异常),处理规则:

  1. 控制器→主机 失步
    控制器会上报 HCI Hardware Error 事件,主机需发送 HCI_RESET 命令 复位控制器,通过 “HCI Reset 命令完成事件” 重新同步。

  2. 主机→控制器 失步
    主机检测到失步后,发送 HCI_RESET 命令,控制器执行复位并恢复同步。

       H4 通过 “1 字节 Type” 的极简设计,在 UART 上高效承载 HCI 数据;结合硬件流控和复位机制,保障了通信的可靠性。这种设计让 H4 成为资源受限场景(如嵌入式设备)的首选传输方案。

http://www.xdnf.cn/news/1238023.html

相关文章:

  • Docker 国内可用镜像
  • 关于 xrdp远程桌面报错“Error connecting to sesman on 127.0.0.1:3350“的解决方法
  • [自动化Adapt] 录制引擎
  • 计算机视觉CS231n学习(2)
  • 第六章第三节 TIM 输出比较
  • Java 大视界 -- Java 大数据在智能教育学习资源个性化推荐与学习路径动态调整中的深度应用(378)
  • ARPO:让LLM智能体更高效探索
  • 三角洲行动ACE反作弊VT-d报错?CPU虚拟化如何开启!
  • 嵌入式学习-(李宏毅)机器学习(5)-day32
  • 苍穹外卖项目学习——day1(项目概述、环境搭建)
  • 音视频学习(五十):音频无损压缩
  • 力扣-437.路径总和III
  • 深度学习中的模型知识蒸馏
  • 关于Web前端安全之XSS攻击防御增强方法
  • 广东省省考备考(第六十五天8.3)——判断推理:图形推理(数量规律题目总结)
  • C的运算符与表达式
  • C的数据类型与变量
  • lumerical——锥形波导偏振转换
  • 《前端无障碍设计的深层逻辑与实践路径》
  • JavaWeb学习------SpringCloud入门
  • Web 开发 11
  • JavaScript:编程世界中的“语盲”现象
  • CCF-GESP 等级考试 2025年6月认证C++一级真题解析
  • 推荐系统学习笔记(九)曝光过滤 Bloom Filter
  • 从传热学基础到有限元弱形式推导:拆解热传导问题Matlab有限元离散核心
  • Jupyter Notebook 中高效处理和实时展示来自 OpenCV 和 Pillow 的图像数据探究
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | TodoList(代办事项组件)
  • Android 之 MVC架构
  • JVM学习日记(十五)Day15——性能监控与调优(二)
  • IO流-对象流