一. 声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: ![]() 第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。 第二篇:Transport层介绍,主要介绍蓝牙协议栈跟蓝牙芯片之前的硬件传输协议,比如基于UART的H4,H5,BCSP,基于USB的H2等 第三篇:传统蓝牙controller介绍,主要介绍传统蓝牙芯片的介绍,包括射频层(RF),基带层(baseband),链路管理层(LMP)等 第四篇:传统蓝牙host介绍,主要介绍传统蓝牙的协议栈,比如HCI,L2CAP,SDP,RFCOMM,HFP,SPP,HID,AVDTP,AVCTP,A2DP,AVRCP,OBEX,PBAP,MAP等等一系列的协议吧。 第五篇:低功耗蓝牙controller介绍,主要介绍低功耗蓝牙芯片,包括物理层(PHY),链路层(LL) 第六篇:低功耗蓝牙host介绍,低功耗蓝牙协议栈的介绍,包括HCI,L2CAP,ATT,GATT,SM等 第七篇:蓝牙芯片介绍,主要介绍一些蓝牙芯片的初始化流程,基于HCI vendor command的扩展 第八篇:附录,主要介绍以上常用名词的介绍以及一些特殊流程的介绍等。 另外,开发板如下所示,对于想学习蓝牙协议栈的最好人手一套。以便更好的学习蓝牙协议栈,相信我,学完这一套视频你将拥有修改任何协议栈的能力(比如Linux下的bluez,Android下的bluedroid)。 ![]() ------------------------------------------------------------------------------------------------------------------------------------------ CSDN学院链接(进入选择你想要学习的课程):https://edu.csdn.net/lecturer/5352?spm=1002.2001.3001.4144 蓝牙交流扣扣群:970324688 Github代码:https://github.com/sj15712795029/bluetooth_stack 入手开发板:https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-22329603896.18.5aeb41f973iStr&id=622836061708 ------------------------------------------------------------------------------------------------------------------------------------------ 二. 前言首先在介绍以下内容之前,我们先来介绍下我们的CSDN课程,以下介绍内容都会在 CSDN课程 手把手教你蓝牙协议栈入门(点击我)中第二小节介绍。 三. Transport H4介绍 1. 概念介绍 整个Transport在蓝牙架构中的位置如下图红框位置: 蓝牙Transport就是蓝牙的硬件发送协议,硬件的传输介质有:UART/USB/SDIO,那么Transport就是在特定的硬件传输介质上增加了一些协议,比如我们本节将的H4就是在UART上增加了一个小协议,H4算是最简单的一个协议,只是在数据前面加一个Type,了解过蓝牙HCI的一般都会知道蓝牙协议栈(Host)跟芯片(Controller)一般是通过HCI数据来沟通,那么H4就是在HCI数据前面加上一个TYPE。一共有5中type,如下: 1)HCI COMMAND:由蓝牙协议栈发送给芯片的命令 2)HCI EVENT:由蓝牙芯片上报给蓝牙协议栈的事件 3)HCI ACL:蓝牙协议栈跟蓝牙芯片双向交互的普通数据 4)HCI SCO:蓝牙芯片跟蓝牙协议栈双向交互的通话/语音识别等音频数据 5)HCI ISO(这部分是在core5.2才添加):用于发送LE audio 在Core文档截图如下: 交互数据格式为: 所以我们看下代码在这部分的实现: 1)通过宏配置协议栈的TRANSPORT type,可以看到以下代码是配置的H4
2)举例说明HCI reset发送(HCI raw data为0x03 0x0c 0x00)
3)到了Transport的处理
2. 硬件要求UART硬件配置要求总结: 1)数据位8bit 2)无奇偶校验 3)停止位1bit 4)需要有硬件流控 所以MCU跟蓝牙芯片的接线需要: 我们来看下代码的实现: 1)在STM32的UART初始化(只贴出关键位置)
2)在Linux的UART初始化(只贴出关键位置)
3. 纠错 如果主机或主机控制器在 RS232 通信上失去同步,则需要复位。失去同步意味着已检测到错误的 HCI 分组指示器,或 HCI 分组的长度域超出范围。如果在主机到主机控制器的通信中丢失 UART 同步,那么主机控制器将发送硬件故障(HCI hardware error)事件,以将同步错误告诉主机。主机控制器将需要从主机接收一个HCI_RESET 指令以执行复位。主机控制器也将在从主机到主机控制器的字节流中使用 HCI-RESET 指令,以实现重新同步。 如果在从主机控制器到主机的通信中失去 UART 同步,主机将发送 HCL_RESET指令以复位主机控制器。主机也将通过在从主机控制器到主机的字节流中查找HCI_Reset 指令的 HCL 指令完成事件,进行重新同步 |
GMT+8, 2025-4-30 22:13 , Processed in 0.338971 second(s), 32 queries , Gzip On, MemCached On.
Powered by Discuz! X3.5
© 2001-2025 Discuz! Team.