找回密码
 立即注册

使用微信账号登录

只需一步,快速开始

QCC3005 控制AMP_Mute的管脚配置问题

2020-5-18 21:34| 发布者: csdn| 查看: 1620| 评论: 1|来自: CSDN

摘要: 最近在调试QCC3005 蓝牙耳机方案。 考虑低功耗的问题,由于系统的音频输出接了一颗功放,而此功放有一个Shutdown管脚(低电平有效),可以平时不用功放的时候来拉低此管脚使功放工作在shutdown模式来降低静态功耗

最近在调试QCC3005 蓝牙耳机方案。

考虑低功耗的问题,由于系统的音频输出接了一颗功放,而此功放有一个Shutdown管脚(低电平有效),可以平时不用功放的时候来拉低此管脚使功放工作在shutdown模式来降低静态功耗。

而我在QCC的管脚配置原理图上,通过 PIO18管脚接到此shutdown脚上,然后在ADK里通过系统的Audio Active事件来驱动它。

想要实现的功能就是:当系统出于Audio Active状态时,会控制PIO18输出高电平,然后功放被使能,而当没有在Audio Active状态时,系统输出PIO18为低电平,进而关闭了功放,依此来实现降低功耗的效果。

但是我们在实际调试时候发现一个问题:

正常情况下, 我们蓝牙连接了手机,播放音乐时,PIO输出高,停止播放时,PIO输出低;来电话时,PIO输出高,挂断电话时PIO输出低,好像一切都是和预想的结果一样。但是测试到一种情况:

当耳机连接了手机,正在通话中的时候,如果此时又有另外一个电话打进来,此时PIO18莫名奇妙变低电平了!!!导致耳机里没了声音,蓝牙连接之类的都是正常,如果此时挂断其中一个电话,然后调节一下音量,PIO18又变高电平,问题就出在这里。

我们参考了开发板,发现开发板的 SKP_Mute是接在PIO16,我们是接在PIO18。从官方datasheet里可以看到,这两个IO的情况不一样。

开发板用的PIO 16,就不会有这样的问题,

2019-03-28问题补充:

当时测试开发板没有问题的情况,后来验证开发板没有用PIO16去控制功放的shutdown,所以说,开发板也有同样问题,只是管脚没有控制,问题没有当场反应出来,后来通过测量,发现当打电话时,PIO16同样是输出低电平。

后来通过sink源码里,找到指定的判断条件,把电话state加入到条件列表,才解决此问题。

2019-07-26 继续补充:

接上面问题描述,如果控制音频功放的使能脚没用和开发板上一样的话,需要修改一下系统代码的判断条件。

第一步:在sink_statemanager.c文件里自定义一个判断在打电话状态的函数,如下:

bool isSinkInCallMode (void)
{
    if ((gTheSinkState == deviceOutgoingCallEstablish ) || 
        (gTheSinkState == deviceIncomingCallEstablish ) || 
        (gTheSinkState == deviceActiveCallSCO ) || 
        (gTheSinkState == deviceActiveCallNoSCO )||
        (gTheSinkState == deviceThreeWayCallWaiting)||
        (gTheSinkState == deviceThreeWayCallOnHold)||
        (gTheSinkState == deviceIncomingCallOnHold)||
        (gTheSinkState == deviceActiveCallSCO))
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

注意函数创建之后要在sink_statemanager.h中声明一下:

bool isSinkInCallMode(void);

然后,回到主函数里,查找关键词:PIO_AUDIO_ACTIVE

这个就是用来控制音频功放的IO。找到如下代码片段:

if((!IsAudioBusy()) && (!sinkAudioIsAudioRouted()))
            {
                MAIN_DEBUG (( "HS : EventSysCheckAudioAmpDrive turn off amp\n" ));
                PioDrivePio(PIO_AUDIO_ACTIVE, FALSE);
            }

这个就是当音频不在有效的时候,将音频功放关掉。我们重点修改这段代码,加上一个判断条件(当不在通话模式的时候),如下:

if((!IsAudioBusy()) && (!sinkAudioIsAudioRouted()) && (!isSinkInCallMode()))
            {
                MAIN_DEBUG (( "HS : EventSysCheckAudioAmpDrive turn off amp\n" ));
                PioDrivePio(PIO_AUDIO_ACTIVE, FALSE);
            }
            /* audio is still busy, check again later */
            else
            {
                MAIN_DEBUG (( "HS : EventSysCheckAudioAmpDrive still busy, reschedule\n" ));
                PioDrivePio(PIO_AUDIO_ACTIVE, TRUE);
                MessageSendLater(&theSink.task , EventSysCheckAudioAmpDrive, 0, CHECK_AUDIO_AMP_PIO_DRIVE_DELAY);
            }

注意上面加入了前面创建的 isSinkInCallMode()函数,然后编译通过。


来源:https://blog.csdn.net/mzcry/article/details/88694386
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
1

路过

雷人

握手

鲜花

鸡蛋

刚表态过的朋友 (1 人)

发表评论

最新评论

引用 炜炜&时光机 2020-5-20 19:24
资料没有什么用途

查看全部评论(1)

小黑屋|手机版|我爱蓝牙网 - 52Bluetooth

GMT+8, 2024-5-6 02:51 , Processed in 0.155249 second(s), 15 queries , Gzip On, MemCached On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

返回顶部