首页 > 其他分享 >蓝牙H4传输层协议

蓝牙H4传输层协议

时间:2024-07-22 15:51:01浏览次数:8  
标签:bt USART UART 蓝牙 H4 BT 传输层 HCI

蓝牙几种不同接口的传输协议:H2/H4/H5/BCSP/SDIO及区别

H2:基于USB的传输
H4:基于五线UART(RX/TX/CTS/RTS/GND带硬件流控)的传输,最简单的传输方式,只在HCI raw data前面加上一个type;
H5: 基于三线UART(RX/TX/GND)的传输,需要软件协议层加一个数据完整性校验机制;
BCSP: 基于UART的传输
SDIO :基于SDIO的传输

 

TRANSPORT层:在硬件接口(UART/USB/SDIO)实现HOST跟CONTROLLER的交互

H2: USB的transport

H4:UART的transport(是UART传输种最简的一个Transport,只是在HCI raw data的前面加一个type就行,如下HCI一共有五种HCI data)
        * HCI COMMAND:由蓝牙协议栈发送给芯片的命令
        * HCI EVENT:由蓝牙芯片上报给蓝牙协议栈的事件
        * HCI ACL:蓝牙协议栈跟蓝牙芯片双向交互的普通数据

        * HCI SCO:蓝牙芯片跟蓝牙协议栈双向交互的通话/语音识别等音频数据
        * HCI ISO(这部分是在core5.2才添加):LE audio用的数据包格式

 


蓝牙传输介质Transport UART H4(RS232)介绍

https://www.52bluetooth.com/portal.php?mod=view&aid=179&mobile=no

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

 

/** BT_PBUF_TRANSPORT_H2 = 0x01,BT_PBUF_TRANSPORT_H4 = 0x02,BT_PBUF_TRANSPORT_H5 = 0x03,BT_PBUF_TRANSPORT_BCSP = 0x04,*/
 
#define BT_TRANSPORT_TYPE 0x02

 

2)举例说明HCI reset发送(HCI raw data为0x03 0x0c 0x00)

err_t hci_reset(void)
{
    struct bt_pbuf_t *p;
    
    /* 申请Transport的buffer,比HCI数据多了一个byte */
    if((p = bt_pbuf_alloc(BT_TRANSPORT_TYPE, HCI_RESET_PLEN, BT_PBUF_RAM)) == NULL)
    {
        BT_HCI_TRACE_ERROR("ERROR:file[%s],function[%s],line[%d] bt_pbuf_alloc fail\n",__FILE__,__FUNCTION__,__LINE__);
 
        return BT_ERR_MEM;
    }
 
    /* Assembling command packet */
    p = hci_cmd_ass(p, HCI_RESET, HCI_HOST_C_N_BB, HCI_RESET_PLEN);
    pcb->timer = utimer_create(HCI_RESET_TIMEOUT, hci_reset_timeout, 0);
    /* Assembling cmd prameters */
 
    /* 发送HCI raw data在底层处理增加了1个byte */
    phybusif_output(p, p->tot_len,PHYBUSIF_PACKET_TYPE_CMD);
    bt_pbuf_free(p);
 
    return BT_ERR_OK;
}
3)到了Transport的处理
void phybusif_output(struct bt_pbuf_t *p, uint16_t len,uint8_t packet_type)
{
    /* 后退1个byte */
    bt_pbuf_header(p, 1);
 
    /* 填写上type */
    ((uint8_t *)p->payload)[0] = packet_type;
 
 
    uint8_t *tx_buffer = bt_get_tx_buffer();
    bt_pbuf_copy_partial(p, tx_buffer, p->tot_len, 0);
 
    BT_TRANSPORT_TRACE_DEBUG("BT TX LEN:%d\n",p->tot_len);
    bt_hex_dump(tx_buffer,p->tot_len);
 
    /* 通过UART发送出去 */
    uart_bt_send(tx_buffer,p->tot_len);
}

2. 硬件要求

UART硬件配置要求总结:

1)数据位8bit

2)无奇偶校验

3)停止位1bit

4)需要有硬件流控

所以MCU跟蓝牙芯片的接线需要:

我们来看下代码的实现:

1)在STM32的UART初始化(只贴出关键位置)

/******************************************************************************
 * func name   : hw_uart_bt_init
 * para        : baud_rate(IN)  --> Baud rate of uart1
 * return      : hw_uart_bt_init result
 * description : Initialization of USART2.PA0->CTS PA1->RTS PA2->TX PA3->RX
******************************************************************************/
uint8_t hw_uart_bt_init(uint32_t baud_rate,uint8_t reconfig)
{
    .............
 
    /* Data format :1:8:1, no parity check, hardware flow control */
    USART_InitStructure.USART_BaudRate = baud_rate;
    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;
    USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
 
    .........
 
    return BT_ERR_OK;
 
}

 

2)在Linux的UART初始化(只贴出关键位置)

uint8_t hw_uart_bt_init(uint32_t baud_rate,uint8_t reconfig)
{
    ......
 
    // 8N1
    toptions.c_cflag &= ~CSTOPB;
    toptions.c_cflag |= CS8;
 
    toptions.c_cflag |= CREAD | CLOCAL | CRTSCTS;
    toptions.c_iflag &= ~(IXON | IXOFF | IXANY);
    toptions.c_cflag &= ~PARENB;
 
    toptions.c_cc[VMIN]  = 1;
    toptions.c_cc[VTIME] = 0;
 
    .......
 
    return BT_ERR_OK;
 
}

 

3. 纠错

如果主机或主机控制器在 RS232 通信上失去同步,则需要复位。失去同步意味着已检测到错误的 HCI 分组指示器,或 HCI 分组的长度域超出范围。如果在主机到主机控制器的通信中丢失 UART 同步,那么主机控制器将发送硬件故障(HCI hardware error)事件,以将同步错误告诉主机。主机控制器将需要从主机接收一个HCI_RESET 指令以执行复位。主机控制器也将在从主机到主机控制器的字节流中使用 HCI-RESET 指令,以实现重新同步。

 

如果在从主机控制器到主机的通信中失去 UART 同步,主机将发送 HCL_RESET指令以复位主机控制器。主机也将通过在从主机控制器到主机的字节流中查找HCI_Reset 指令的 HCL 指令完成事件,进行重新同步

标签:bt,USART,UART,蓝牙,H4,BT,传输层,HCI
From: https://www.cnblogs.com/bluestorm/p/18316184

相关文章

  • 【蓝牙】蓝牙配对你需要知道这些
    蓝牙配对是指两个蓝牙设备之间建立安全连接的过程,确保数据传输的安全性和可靠性。以下是蓝牙配对流程的深入分析及其底层原理。一、蓝牙配对流程概述1.设备发现(Discovery)蓝牙设备首先进入发现模式,使其能被其他设备检测到。//开始设备扫描BluetoothAdapterbluetoothA......
  • 探索ESP32-A2DP:一个强大的蓝牙音频解决方案
    探索ESP32-A2DP:一个强大的蓝牙音频解决方案项目简介是一个基于EspressifSystemsESP32微控制器的开源项目,它实现了Bluetooth低能耗(BLE)和高级音频分布配置文件(A2DP)。这个项目允许你的ESP32设备作为高质量的蓝牙音频播放器,可以接收来自任何支持A2DP源的设备(如智能手机、电脑)的音频......
  • 蓝牙通信--STM32读取超声波传感器并在手机APP上显示
    1.实物接线本设计主要是用HC-SR04超声波传感器测量距离,通过串口3经过HC-05蓝牙芯片发送到蓝牙调试助手APP上显示。STM32管脚模块管脚3V3超声波VCCPB7超声波ECHOPB6超声波TRIGGND超声波GND3V3串口3VCCPB10串口3RXDPB11串口3TXDGND串口3GND2.涉及的知识点    本......
  • 【记录】stm32f103c8t6+hc05+TB6612FNG实现蓝牙app控制直流电机
    前言这周刚好做了一个小项目,需要用到单片机控制一个小车移动,在实验室搜刮了一些材料,进行了一些调试工作,感觉也是蛮有意思的。小车的底盘用的是之前电赛剩下的,单片机用的是最小系统板,蓝牙模块是hc05,直流电机也是最普通的小马达。软硬件调试软件:keil5主控板:stm32f103c8t6蓝......
  • 真无线蓝牙耳机有哪些推荐?四大热门主流机型盘点分享
    随着科技的不断进步和消费者需求的多样化,真无线蓝牙耳机市场迎来了前所未有的繁荣,那么在众多的蓝牙耳机里,真无线蓝牙耳机有哪些推荐?面对琳琅满目的产品选择,如何找到最适合自己的那一款成为了一个值得探讨的话题,今天作为耳机发烧党的我,今天就为大家带来四大热门主流机型盘点分享......
  • 【蓝牙】Android 13 蓝牙源码分析
    Android13在蓝牙模块中进行了多项改进和优化。本文将详细分析其核心组件及其工作原理,包括BluetoothManagerService、AdapterService、AdapterProperties、蓝牙连接管理和JNI接口。1.BluetoothManagerServiceBluetoothManagerService是蓝牙管理的核心类,负责启动和停止蓝......
  • 智能蓝牙卷尺方案pcba设计研发
    一、功能概述:3.0V供电,无显示,一个按键,一个指示灯,ST17H66蓝牙发送数据到APP,只有圆周测量模式二、详细参数:1、电源:DC3.0V(1*CR2032)2、测量范围:3~150cm3、分辨率:0.1cm4、接头加量:2cm5、单位设置:cm6、负值:测量负值马上清零7、开机:上电......
  • 蓝牙(Bluetooth)音频协议 & 音频编解码协议
    简短不看版:协议名称  特点HSP(手机协议,Head-Set-Profile)提供手机与耳机之间通信所需的基本功能。连接和配置好后,耳机可以作为远程设备的音频输入和输出接口HFP(免提协议,Hands-Free-Profile)在HSP协议的基础上增加了一些扩展功能A2DP(高级音频传送协议,Adva......
  • 2024开放式耳机品牌榜,小白可以直入的五款蓝牙耳机!
    在选择适合散步聊天和听歌的耳机时,开放式耳机确实是一个值得考虑的选项。与传统的入耳式耳机相比,开放式耳机最大的优势在于它们不会完全封闭耳道,因此用户在享受音乐的同时,仍能保持对周围环境的感知,这对于户外活动尤其重要,因为它可以提高安全性,让你在散步或跑步时能够听到交通声......
  • 51小车红外循迹及蓝牙代码
     main.c#include<REGX52.H>#include"time.h"#include"motordriver.h"#include"MoveState.h"#include"follow.h"#include"lanya.h"externunsignedintPWMR;externunsignedintPWML;unsignedi......