一. 声明

本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下:

第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。

第二篇: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

/** 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)
{......// 8N1toptions.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 指令完成事件,进行重新同步

蓝牙传输介质Transport UART H4(RS232)介绍相关推荐

  1. 对UART、RS232、485通信的理解

    实际上这一篇博文想表达的就是想说清楚什么是串口通信. 先普及一下通信的基本知识点: 数据通信的种类:串行通信.并行通信.不管是什么类型的通信,再怎么复杂的,也是在这两种上面衍生出来的. 许多传输线或者 ...

  2. 搭建机器人电控系统——通信协议——串口通信USART/UART、RS232、RS485及其实例

    通信协议 串口通信详解 IIC通信详解 SPI通信详解 CAN通信详解 文章目录 通信协议 什么是串口? 串口分类 USART/UART.RS232.RS485的区别 串口协议原理 传输协议 需要定义 ...

  3. UART和RS232/RS485的关系是什么?

    串口通讯是电子工程师和嵌入式开发工程师面对的最基本问题,RS232则是其中最简单最常用的通讯方式.但是初学者往往搞不清有关的名词如UART和RS232或RS485之间是什么关系,因为它们经常被放到语句 ...

  4. UART和RS232/RS485的关系是什么?RS485在linux下的调试 ubuntu串口调试工具

    串口通讯是电子工程师和嵌入式开发工程师面对的最基本问题,RS232则是其中最简单最常用的通讯方式.但是初学者往往搞不清有关的名词如UART和RS232或RS485之间是什么关系,因为它们经常被放到语句 ...

  5. 调试血泪经验之uart/ttl/rs232电平转换问题

    发现已经有前辈总结,感谢!http://blog.sina.com.cn/s/blog_6330c39b0102vrqm.html 芯片tx直接输入的是ttl电平 现象 我用usb转rs232的连接线 ...

  6. UART和RS232、RS485的基础知识

    一.UART和RS232.RS485的关系: 通讯问题,和交通是一样的.串口通信,我们这里可以用公交来类比.        公交运行可以简单分成两个部分: 1.车站 2.公路 其中车站决定了车上装什么 ...

  7. 工业机器人(8)-- UART和RS-232、RS-422、RS-485通信接口

    目录 一.UART是什么 二.RS-232标准 三.RS-485/ RS-422标准 四.RS-232与RS-485对比 五.RS-422与RS-485对比 六.影响RS-485总线通讯速度和通信可靠 ...

  8. UART,RS232,RS485

    uart.IIC.SPI都是一种具有协议特征的收发器.接口.总线,它规定数据按照什么的时序传输,rs232,.rs485是传输时候的电平标准,规定了按照上述协议传输的高电平与低电平的电压都应该是多少: ...

  9. UART、RS-232、RS-422、RS-485的区别

    v3学院带你一次性认清UART.RS-232.RS-422.RS-485的区别 https://www.cnblogs.com/laokai/p/6488910.html 通讯问题,和交通问题一样,也 ...

最新文章

  1. linux日志管理命令详解
  2. jquery中offset和position的区别
  3. 2010年厦门商报报导《监控》小说
  4. Mysql+MHA高可用集群
  5. linux kill命令使用
  6. C++Kosaraju找有向图的强连通分量算法(附完整源码)
  7. java类的讲解_【java 基础】java类的权限讲解
  8. 2PC到3PC到Paxos到Raft到ISR
  9. P5091-[模板]欧拉定理
  10. 给开源项目贡献代码_您可以为开源做出6种非代码贡献
  11. Cocos2d之Ref类与内存管理使用详解
  12. 快速ping_PING你真的会用么?
  13. centos7安装便捷小工具命令
  14. Jquery Highcharts 选项配置 说明文档
  15. Java、python实现啊哈算法 —— chapter3 枚举 炸弹人
  16. ue怎么转换html格式,UE编辑器UltraEdit怎么格式化代码
  17. 数学分析高等代数考研试题考研真题汇总目录2020-01-10更新
  18. java webp 图片处理_Java处理Webp图片格式转换的示例代码
  19. 从聚合数据请求菜谱大全接口数据,解析显示到ListView
  20. Android 源码编译生成framework.jar

热门文章

  1. 利用Visual C++ 实现QQ消息群发
  2. web前端开发都用什么软件?
  3. 基于redis的短信验证码服务开发
  4. 【深度学习系列】用Tensorflow进行图像分类
  5. bim在建筑工程中的应用有哪些?
  6. Android lowmemkiller配置(Android7.1实践)
  7. 课代表笔记之redis 大量连接超时排查
  8. 【步态识别】GQAN步态质量感知网络 算法学习《Gait Quality Aware Network: Toward the Interpretability of Silhouette-Based》
  9. 【Android】自定义theme解决进入app闪黑屏问题
  10. 视频中的物理要素——提取人们产生共情的元素