Loading...
首页专栏正文

Android系统蓝牙模组调试说明

free-jdx 发布于 2020-10-15 18:05:36 浏览 1080 点赞 3 收藏 1

1.前言

这里主要描述android平台蓝牙模块打不开问题时,如何排查问题

2.概述

目前调试的蓝牙模组都是和wifi功能集成在一起的,即wifi和蓝牙二合一的模组,常见的蓝牙模组有正基的AP6210(目前已经停产)、AP6212、AP6330、AP6335等和realtek的rtl8723bs、rtl8703as等。这些模组在蓝牙功能的硬件上有8个IO引脚需要与主控连接,如图1所示,箭头表示方向,其中比较重要的两个引脚是BT_RST_N和LPO。此外蓝牙模组还有一个总的模组电压(VBAT)。

3. 模组调试方法

Android上蓝牙调不通,一般都是蓝牙打不开。看到此现象时,需要从两大方面来定位问题,一个是硬件和配置,第二是从log打印去分析。

(1)硬件和配置定位

a. 检查蓝牙模组电源 使用万用表量蓝牙模组的VBAT引脚,看电压是否为3.3V左右。如果不是,则需要从sys_config配置上来确定所使用的axp路是否正常,务必确保VBAT电源正确再往下进行排查。如果wifi可以打开,那么也可以说明VBAT电源是正确的。

b. check串口连接 主控的UART_TX、UART_RX、UART_CTS和UART_RTS和模组的这几个引脚是交叉连接的

c.check32K时钟 为了节约成本,绝大多数情况下都是使用主控的32k时钟作为蓝牙模组的低功耗时钟,正基的所有模组和realtek的COB模组都需要这个时钟。有两种方法检查,第一是用万用表量蓝牙模组的LPO引脚,看电压是否为1.5V左右,第二是用示波器量LPO引脚的信号是否为32KHz。 主控不输出32k时钟有可能是硬件问题,也有可能是软件问题,下面的方法可以排除软件上的问题,就是看寄存器,串口下执行如下命令:

cd /sys/class/sunxi_dump
echo 0x01F00060 > dump
cat dump

如果输出为0x00000001,则表示32k时钟已经打开,软件上配置没问题。

到了这里,很有可能就是硬件上出问题了,下面进一步定位

主控的32k时钟来源于外部的一个32k晶振,如果32k晶振本身有问题,那么主控肯定也是不能输出32k时钟的,因为需要从源头处排查。32k晶振与主控的连接原理图如图2所示,用示波器量X32KI和X32KO这两处,正常情况下至少有一处为32KHz,如果不是,则说明32k晶振没工作。

如果32k晶振没问题,接下来检查主控32k时钟引脚到模组之间的电路,确保32k时钟输出的上拉电阻已经焊接上。

经过以上这些排查,一定可以知道并确保32k时钟是正常工作。

d. 检查BT_RST_N引脚 在打开蓝牙时,用万用表量这个引脚一段时间,看电平是否会发生变化,正常情况下是会发生变化的。

(2)log打印定位

蓝牙打不开,从log来看,绝大多数情况下都会出现以下这句打印

...preload_wait_timeout (retried:%d/max-retry:%d)...

致这个问题出现一般有以上陈述的问题

  if (strcmp(module_info.mod_name, "ap6210") == 0)
    {
        usleep(100000);
        close(vnd_userial.fd);
        if ((vnd_userial.fd = open(vnd_userial.port_name, O_RDWR)) == -1)
        {
            ALOGE("userial vendor open: unable to open %s", vnd_userial.port_name);
            return -1;
        }
    }
    else if (strcmp(module_info.mod_name, "ap6335") == 0)
    {
        usleep(500000);
        close(vnd_userial.fd);
        if ((vnd_userial.fd = open(vnd_userial.port_name, O_RDWR)) == -1)
        {
            ALOGE("userial vendor open: unable to open %s", vnd_userial.port_name);
            return -1;
        }
}
    else if (strcmp(module_info.mod_name, "ap6212") == 0)
    {
        usleep(300000);
        close(vnd_userial.fd);
        if ((vnd_userial.fd = open(vnd_userial.port_name, O_RDWR)) == -1)
        {
            ALOGE("userial vendor open: unable to open %s", vnd_userial.port_name);
            return -1;
        }
    }

另外,Android的config.disable_bluetooth属性可以控制是否使用蓝牙,如果这个属性的值为true,那么蓝牙肯定是打不开的。因此需要确保此属性值为false或者没有这个属性。

*本文仅代表作者观点,不代表易百纳技术社区立场。系作者授权易百纳技术社区发表,未经许可不得转载。

打赏
打赏作者
free-jdx
您的支持将鼓励我继续创作!
金额:
¥1 ¥5 ¥10 ¥50 ¥100
支付方式:
微信支付
支付宝支付
微信支付
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

易百纳技术社区
确定要删除此文章、专栏、评论吗?
确定
取消
易百纳技术社区