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

一. 声明

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

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

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

    // 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 指令完成事件,进行重新同步

BLU232 无线蓝牙/串口(RS-232/RS-485)转换器 型 蓝牙/串口转换器----带RS-232/RS-485口! BLU232型蓝牙/串口转换器只有DB-9/DB-9转接头大小,将计算机或智能手机的蓝牙信号转换出RS-232/RS-485口,可以虚拟成为本地串口。 BLU232 蓝牙/串口转换器 RS-232/RS-485通用、5V供电、1200-115200bps 10米 波仕BLU232蓝牙/串口转换器将计算机或者智能手机的蓝牙信号转换出RS-232或RS-485串口。BLU232采用高性能低功耗蓝牙无线通信芯片,内置高性能微处理器实现串口数据的传输,可广泛应用于各种场合的短距离无线通信、工业控制领域。产品本身可将自己的串口接到计算机后用串口调试助手程序进行通信速率、格式等的设定。BLU232可以作为蓝牙信号扩展出的虚拟串口,无需修改已有的串口软件。 1、硬件安装 BLU232的硬件安装非常简单:接上5V电源即可。在电源端子旁边有一个小LED(发光二极管),当产品通电后,LED闪烁表示正在连接蓝牙,如果连接成功后LED会一直亮着。BLU232可以连接到计算机或者智能手机的蓝牙信号,此时BLU232就相当于是计算机扩展出来的一个无线RS-232/485口。串口默认为波特率为9600,配对密码:1234,默认名称:BOLUTEK。BLU232的RS-232/485串口有2个用处:1、在传输模式下作为蓝牙转换出来的串口,2、在设置模式下用于对BLU232产品进行设置。注意BLU232有DB-9孔和DB-9针的RS-232口,它们实质上是同一个口,仅仅是为了方便用户的使用。BLU232的DB-9孔可以自己外插计算机的RS-232针座,同时BLU232的DB-9针座与计算机的RS-232针座的引脚分配完全一样,所以可以直接插RS-232设备。BLU232的RS-232口只有RXD、TXD、GND三线信号。RS-485信号的参考地线与RS-232的GND是一样的、与外接5V电源的GND也是一样的。RS-485口带600W浪涌保护。 2、性能指标 无线通信方式 蓝牙2.1 载频 2.412~2.484GHz 天线 内置 尺寸 57*36*17mm 最远通信距离 10米 * 重量 30克 电气接口 RS-232/RS-485 供电电压 5V (±0.5V) DC 波特率 1200bps~115200bps 功耗 <50mA * 实际通信距离与环境、障碍物、位置等有关。 3、软件安装以及使用 3.1 为计算机蓝牙扩展无线串口BLU232可以为带蓝牙的计算机扩展出一个无线串口。1、将BLU232接上电源。 2、计算机蓝牙——“添加蓝牙设备”,无线扫描找到蓝牙BOLUTEK,输入配对密码:1234,灯闪烁。 3、BLU232默认波特率等格式为(9600,n,8,1),扩展出的串口号在windows XP/7下默认为COM4。用户可以查看“控制面板”的“系统设备管理器端口”,就会发现增加了一个新的“蓝牙通信端口(COM4)”,这就是虚拟串口号。在WINDOWS下可以使用“串口调试助手”等软件打开COM4进行通信,此时灯连续亮。注意串口通信软件的波特率必须与BLU232的波特率一致。3.2 为智能手机蓝牙扩展无线串口BLU232可以为带蓝牙的智能手机扩展出一个无线串口。1、将BLU232接上电源,灯闪烁。 2、蓝牙——“添加蓝牙设备”,无线扫描找到蓝牙BOLUTEK,输入配对密码:1234,灯闪烁。 3、BLU232默认为从机状态、波特率等格式为(9600,n,8,1)。 在ANDROID下可以使用“蓝牙串口.apk”等软件进行智能手机的串口通信,此时灯连续亮。 4、BLU232的设置指令 BLU232可以使用“串口调试助手”等软件进行波特率等参数的设置。1、将BLU232接上电源。 2、计算机蓝牙——“添加蓝牙设备”,无线扫描找到蓝牙BOLUTEK,输入配对密码:1234,灯闪烁。(如果已经配对成功就不必再配对了)3、现在先不要打开蓝牙串口COM4;使用DB-9孔端的串口接到计算机的RS-232口(比如COM1号口)来进行设置;4、运行“串口调试助手”软件,在发送栏键入指令,每一个指令都必须以Enter 结尾,就是必须在指令的最后再多敲一个回车键。5、默认波特率为9600,但是如果更改了波特率,那么以后发送指令的波特率必须是新设置的波特率,当然也可以改回来。6、指令不区分大写和小写,效果一样。7、设置完毕后就可以打开蓝牙串口COM4并且通信了! 在“串口调试助手”的发送栏填写 AT+HELP 再敲回车换行,此时光标停留在第2行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wireless_Link

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值