完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
我们现在正在开发此芯片的耳机喇叭切换功能,通过读取耳机检测寄存器的值来打开或者关闭喇叭,但是有一个奇怪的问题是这颗芯片在上电的一段时间内不论是都带着耳机,如果不做拔插耳机的动作,该耳机寄存器内的值永远认为是有耳机存在的。这与我们使用逻辑出现相悖之处, void tlv320set(){// am_gpio_pin_cfg(PIO0_27,AM_GPIO_OUTPUT_INIT_LOW);// MyDelayMS(300);// am_gpio_set(PIO0_27,AM_GPIO_LEVEL_HIGH); uint8_t a = 0x80; am_i2c_write(&__i2c_tlv320,1,&a,1);//Èí¼þ¸´Î» GDelay(2000); a = 0x32; am_i2c_write(&__i2c_tlv320,102,&a,1);//CLKDIVIN use MCLK am_i2c_read(&__i2c_tlv320,102,&a,1); a = 0x18; am_i2c_write(&__i2c_tlv320,3,&a,1);//PLL disable and select Q value am_i2c_read(&__i2c_tlv320,3,&a,1); a = 1; am_i2c_write(&__i2c_tlv320,101,&a,1); //CLKIN use CLKDIV_OUT am_i2c_read(&__i2c_tlv320,101,&a,1); a = 0xa; am_i2c_write(&__i2c_tlv320,7,&a,1); //FSref = 48KHz am_i2c_read(&__i2c_tlv320,7,&a,1); a = 0x00; am_i2c_write(&__i2c_tlv320,2,&a,1); //sample am_i2c_read(&__i2c_tlv320,2,&a,1); a = 0x00; am_i2c_write(&__i2c_tlv320,8,&a,1); //SLAVE mode ? am_i2c_read(&__i2c_tlv320,8,&a,1); a = 0x20; am_i2c_write(&__i2c_tlv320,9,&a,1); // i2s mode 24bit ? am_i2c_read(&__i2c_tlv320,9,&a,1); a = 0x0f; am_i2c_write(&__i2c_tlv320,12,&a,1); //audio codec diital filter control register am_i2c_read(&__i2c_tlv320,12,&a,1); a = 0x80; am_i2c_write(&__i2c_tlv320,13,&a,1); a = 0xd8; am_i2c_write(&__i2c_tlv320,14,&a,1);//Headset Configuration Register OUT AC-COUPLED //¶ú»ú²åÈë¼ì²â a = 0xc0; am_i2c_write(&__i2c_tlv320,25,&a,1); am_i2c_read(&__i2c_tlv320,25,&a,1); //0xc2 a = 0xc0; am_i2c_write(&__i2c_tlv320,37,&a,1); //left and right DAC power on am_i2c_read(&__i2c_tlv320,37,&a,1); a = 0x6; am_i2c_write(&__i2c_tlv320,38,&a,1); a = 0x01; am_i2c_write(&__i2c_tlv320,41,&a,1); ///*out path select*/ am_i2c_read(&__i2c_tlv320,41,&a,1); a = 0x78; am_i2c_write(&__i2c_tlv320,42,&a,1);//*out path select DTS2014123002762 change delay time from 2s to 200ms* am_i2c_read(&__i2c_tlv320,42,&a,1); a = 0x0; am_i2c_write(&__i2c_tlv320,43,&a,1); /*left DAC not muted*/ am_i2c_read(&__i2c_tlv320,43,&a,1); a = 0x0; am_i2c_write(&__i2c_tlv320,44,&a,1); /*right DAC not muted*/ am_i2c_read(&__i2c_tlv320,44,&a,1); a = 0x80; am_i2c_write(&__i2c_tlv320,47,&a,1); //DAC_L1 to HPLOUT Volume Control Register am_i2c_read(&__i2c_tlv320,47,&a,1); a = 0xd; am_i2c_write(&__i2c_tlv320,51,&a,1); am_i2c_read(&__i2c_tlv320,51,&a,1);//0x0c a = 0x80; am_i2c_write(&__i2c_tlv320,64,&a,1);//DAC_R1 to HPROUT Volume Control Register am_i2c_read(&__i2c_tlv320,64,&a,1); a = 0xd; am_i2c_write(&__i2c_tlv320,65,&a,1); am_i2c_read(&__i2c_tlv320,65,&a,1);//0x0c}uint8_t headdetect = 0;void headsetdetect(){ uint8_t a = 0,b = 0; am_i2c_read(&__i2c_tlv320,14,&a,1); if (( a == 0xC8) && (headdetect != 2)) //À®°È¾²Òô { a = 0x91; am_i2c_write(&__i2c_tlv320,86,&a,1); headdetect = 2; } else if ((a == 0xD8) && (headdetect != 3)) //¿ªÆôÀ®°È { a = 0x80; am_i2c_write(&__i2c_tlv320,82,&a,1); a = 0x99; am_i2c_write(&__i2c_tlv320,86,&a,1); a = 0x0c; am_i2c_write(&__i2c_tlv320,73,&a,1); headdetect = 3; }// if ( a == 0xD8 ) //// {// am_i2c_read(&__i2c_tlv320,14,&a,1);// if ( a == 0xC8 )// { // a = 0x80;// am_i2c_write(&__i2c_tlv320,82,&a,1); // a = 0x99;// am_i2c_write(&__i2c_tlv320,86,&a,1); // a = 0x0c;// am_i2c_write(&__i2c_tlv320,73,&a,1);// }// }// else if ( a == 0xc8 ) //À®°È¾²Òô// {// am_i2c_read(&__i2c_tlv320,14,&a,1);// if ( a == 0xd8 )// {// a = 0x91;// am_i2c_write(&__i2c_tlv320,86,&a,1);// }// }} 还有一个问题是如果插入耳机,实际检测值是未插入耳机,与应用是个反逻辑。
|
|
相关推荐
3个回答
|
|
|
不使用的输入管脚建议通过电容接地以防止拾取周围的电磁干扰
|
|
|
|
|
|
如果是外接了3种耳机接口吗?
您是通过 Register 14检测的耳机状态吗?您是否查看了 Register 96和 Register 97 D2位值? 或者说您是怎样判断耳机的状态的? |
|
|
|
|
|
针对您提到的TLV320AIC3107耳机喇叭检测异常问题,我们可以从以下几个方面进行排查和解决:
1. 硬件连接检查: - 确保耳机检测引脚(HP_DET)与耳机插座正确连接。 - 检查耳机插座的接地和电源是否正确。 - 检查耳机插座的焊接和连接是否牢固。 2. 软件逻辑调整: - 在上电后,等待一段时间(例如500ms)再进行耳机检测,以确保芯片稳定。 - 在检测耳机状态时,可以增加一个延时(例如100ms)后再读取耳机检测寄存器的值,以避免误判。 3. 软件代码优化: - 在您的代码中,可以尝试在上电后立即读取耳机检测寄存器的值,然后等待一段时间(例如500ms)后再进行耳机检测。 - 在检测耳机状态时,可以增加一个标志位,用于记录耳机拔插状态,以便在下次检测时进行判断。 以下是优化后的代码示例: ```c void tlv320set() { // 设置GPIO引脚为输出 am_gpio_pin_cfg(PIO0_27, AM_GPIO_OUTPUT_INIT_LOW); // 等待300ms MyDelayMS(300); // 上电后立即读取耳机检测寄存器的值 uint8_t hp_det_initial = read_hp_det(); // 等待500ms,确保芯片稳定 MyDelayMS(500); // 增加一个延时100ms后再读取耳机检测寄存器的值 MyDelayMS(100); uint8_t hp_det_current = read_hp_det(); // 判断耳机拔插状态 if (hp_det_initial != hp_det_current) { // 耳机拔插动作,根据实际情况处理 } else { // 耳机未拔插,根据实际情况处理 } } uint8_t read_hp_det() { // 读取耳机检测寄存器的值 return some_function_to_read_hp_det(); } ``` 4. 检查芯片数据手册: - 查阅TLV320AIC3107的数据手册,了解耳机检测引脚的具体工作原理和注意事项。 5. 尝试使用其他耳机检测方案: - 如果问题依然存在,可以考虑使用其他耳机检测方案,例如电容检测、电阻检测等。 通过以上步骤,希望能帮助您解决TLV320AIC3107耳机喇叭检测异常问题。 |
|
|
|
|
只有小组成员才能发言,加入小组>>
553 浏览 0 评论
1616 浏览 0 评论
2049 浏览 0 评论
为啥BQ7693003DBTR芯片在和BQ769X0盒子通讯时收不到信号?
1516 浏览 0 评论
DSP 28027F 开发板 XDS100v2调试探针诊断日志显示了 Error -150 (SC_ERR_FTDI_FAIL)如何解决
1342 浏览 0 评论
AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?
1759浏览 29评论
2786浏览 23评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
1726浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
1637浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
1647浏览 13评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-3 01:25 , Processed in 2.763722 second(s), Total 82, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
521