返回列表 发新帖我要提问本帖赏金: 20.00元(功能说明)

[应用方案] 【原创】N76E003+CM108B+TLV320AIC23B的I2S USB耳放(连载)

[复制链接]
10879|59
 楼主| tianxj01 发表于 2018-8-12 09:35 | 显示全部楼层
本帖最后由 tianxj01 于 2018-8-12 09:43 编辑

下面就说一下调试过程:
IIS波形、上位机程序都正常。
N76E003程序只做了最简单的,就是官方IIC MASTER 范例直接改改就用。
控制单元也是很简单,就0x00-0x09  和0x0F 共10个单元,其中好几个还可以用上电缺省值。
IIC地址对了,ACK正确了,IIC通信正常。。
按照官方数据表,初始化完成,对不起,耳机完全无声。
检查输出直流电压,0V,说明完全不能工作,仔细回头检查线路,发现自己大意了。本身因为不需要LINE输入和MIC输入。所以画图纸时候,把TLV320AIC23B的20、19、18直接给接地了。但是芯片内部可都是直流耦合,直接接地造成的结果就是连中位滤波16脚VMID电压=0.直流电位问题肯定就在这,
仔细的挑起20-18脚,直接掰断或者悬空都成。再测量VMID,上电慢慢上升到1.6V,耳放电压也正常=1.6V,到这里直流状态完全正常,可耳放就是不开声。
继续折腾,对Analog Audio Path Control (Address: 0000100)单元修改,开启MIC单元和LINE的模拟通路,用镊子钳触碰LINE端子和MIC端子,欢乐的咔咔嗡嗡声在耳机里面清晰发声。说明整个模拟通道已经正确工作了。可为什么DAC就是没声音呢?
裁剪.gif
官方文档里面,Digital Audio Path Control (Address: 0000101)单元的D3位,功能叫DACM DAC soft mute 0 = Disabled 1 = Enabled。
因为音量控制寄存器里面,D6-D0 为音量数值,=0是MUTE。这里有MUTE了,那么101寄存器这里的soft mute  我就理解为软静音,也就是静音不是突然没声,而是慢慢的静音。这个功能应该是不错,当然要使能,所以D3单元没有修改,就用的缺省值1.它哪怕这里1=MUTE,那么我肯定不会这么理解了。
因为耳放就是不开声,没办法,说不定这个soft mute  是一个画蛇添足的独立软件静音位呢,关闭试试看马上修改该位=0,重启单片机...............................
哈...耳边传来甘雅丹的爱情海....................。
天蓝了,一片明亮。
甘雅丹那毫无杂质的声音,在ZST双动铁耳机表现出来,咋感觉有点甜呢?
接着当然就是一系列试听,插着耳机,插拔USB,耳机里面有非常轻微的1-2声咔嚓,完全听不见冲击。
关闭foobar输出。增益开到最大,耳机完全无声,反正我是听不出来,AMS1117-3.3的 0.003%输出噪音加上TLV320AIC23B的50dB 电源抑制比的威力就体现出来了。完全感觉不到电源就是由USB直接供电的。太干净了。
配器、声像、定位那是相当满意,人声有点毒,完全离场独立成像。
顺便吐槽一下这个网购的ZST耳机,音质什么的都非常对得起价格,可声场实在有点太小了,所有东西貌似都只在脑袋那么大的地方发声。


 楼主| tianxj01 发表于 2018-8-12 10:10 | 显示全部楼层

出来了,效果自己看后面的吧。
 楼主| tianxj01 发表于 2018-8-12 15:12 | 显示全部楼层
现在上测试波形
输入是三个0dB 的 正弦波、三角波、方波测试用WAV。这个网上可以找到,不用再做了哈。44100采样率,播放器foobar2000.关闭任何滤镜。
sjb.jpg
1KHz 0dB 三角波,可以说至少肉眼看不见任何畸变,线性度良好,线条有点粗是可以理解的,人家可是没有任何高频去加重环节的哈。

zxb.jpg
1KHz正弦波,测试条件增益调整到约±1Vp-p,过采样=44.1K,我只能说好漂亮的正弦波哈。

fb.jpg
1KHz方便,测试条件增益调整到约±1Vp-p,过采样=441000.
非常典型的44.1K采样的 1KHz方波,(你也可以理解为抽掉了44.1K谐波分量的1KHz方波)波形对称,上下沿对称。
到这里,主观听音和波形测试就全部完成了。剩下的就是做好外壳了。
 楼主| tianxj01 发表于 2018-8-13 10:20 | 显示全部楼层
外壳是原来手上就有的,某宝上面弄的,记得得5-6元一个呢。
前几天打样时候,忘记了盒子里面的槽高度只有1.2,板子做的是1.6的,皇帝他妈--太厚。2边锉斜边,才顺利塞进去。
划线、钻孔、锉刀伺候,面板后板到位,完全进去了,是不是有点怪,对了,LED没装,等不及了先装起来欣赏音乐吧。等下再焊LED,这个不急了哈。
前面是这样的哈..........
前面.jpg

后面是这样的,这个机器决定不开MIC孔,就这样用了。
后面.jpg

现在,耳机听着楼兰的西海情歌,发着帖子,感觉好极了......................................
好了,整个小东西算是做好了,连载到这里也暂告段落,有感兴趣的,可以详细询问和交流............................
xuanhuanzi 发表于 2018-8-13 10:35 | 显示全部楼层
给力,顺便跟楼主学个歇后语,哈哈。
xuanhuanzi 发表于 2018-8-13 10:36 | 显示全部楼层
太厚,哈哈。。西海情歌老好听了,我也赶紧去听听。
yiyigirl2014 发表于 2018-8-13 11:14 | 显示全部楼层
这听起来给力。
zhuomuniao110 发表于 2018-8-14 07:29 | 显示全部楼层
看起来很666
 楼主| tianxj01 发表于 2018-8-14 10:05 | 显示全部楼层
哈哈,看见编辑推荐了,怎么说也得回应一下,现在放出MCU控制代码
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2017 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/

  6. //***********************************************************************************************************
  7. //  Nuvoton Technoledge Corp.
  8. //  Website: http://www.nuvoton.com
  9. //  E-Mail : MicroC-8bit@nuvoton.com
  10. //  Date   : Apr/29/2017
  11. //***********************************************************************************************************

  12. //***********************************************************************************************************
  13. //  File Function: N76E003 I2C master mode demo code, the Slave address = 0xA4
  14. //
  15. //   ____________            _____________
  16. //  |            |   SDA    |             |
  17. //  |            |<-------->|             |
  18. //  |            |          |             |
  19. //  |N76E003(M) |          | N76E003(S) |
  20. //  |(I2C_Master)|          | (I2C_Slave) |
  21. //  |            |   SCL    |             |
  22. //  |            |--------->|             |
  23. //  |____________|          |_____________|
  24. //
  25. //  The protocol of I2C is same the "24LC64"
  26. //***********************************************************************************************************


  27. #include "N76E003.h"
  28. #include "Common.h"
  29. #include "Delay.h"
  30. #include "SFR_Macro.h"
  31. #include "Function_define.h"

  32. #define u8              unsigned char
  33. #define u16                    unsigned int
  34. #define u32             unsigned long
  35. #define V_Up            P17
  36. #define V_Down          P00
  37. #define I2C_CLOCK       13
  38. #define TLV320_ADD      0x34
  39. #define Vol             120//0-127的一个数字,=0为静音
  40. #define VOL_ADJ_CON     40000


  41. u8  volume = Vol;
  42. u8  MUTE=1;
  43. //========================================================================================================
  44. void Init_I2C(void)
  45. {
  46.     /* Set I2C clock rate */
  47.     I2CLK = I2C_CLOCK;
  48.     /* Enable I2C */
  49.     set_I2CEN;                                   
  50. }
  51. //========================================================================================================
  52. void I2C_Error(void)
  53. {
  54. //    P3 = I2STAT;
  55. //    P3 = ERROR_CODE;
  56.     while (1);   
  57. }
  58. //========================================================================================================
  59. void I2C_W_DATA(UINT8 REG_ADD , UINT8 u8DAT)
  60. {
  61.     /* Step1 */
  62.     set_STA;                                    /* 发送Start位信号  */
  63.     clr_SI;
  64.     while (!SI);                                //检测总线,这里是主控单从芯片,单发送,其实可以不需要这个检测,
  65.     if (I2STAT != 0x08)  I2C_Error();           //不过原官方代码有这个,也不影响,就留着了。
  66.         
  67.    
  68.     /* Step2 */
  69.     clr_STA;                                    //STA=0
  70.     I2DAT = TLV320_ADD;                         //发送芯片IIC地址
  71.     clr_SI;
  72.     while (!SI);                                //检测ACK
  73.     if (I2STAT != 0x18)  I2C_Error();            
  74.         

  75.     /* Step3 */
  76.     REG_ADD<<=1;                                //TLV320AC23寄存器地址用的是D15-D9,因此,官方文档地址在这里必须左移一位。
  77.     I2DAT = REG_ADD;                            //发送寄存器地址
  78.     clr_SI;
  79.     while (!SI);                                //检查ACK
  80.     if (I2STAT != 0x28)  I2C_Error();            
  81.                     
  82.     /* Step4 */
  83.     I2DAT = u8DAT;                              //发送目的数据
  84.     clr_SI;
  85.     while (!SI);                                //检查ACK
  86.     if (I2STAT != 0x28)  I2C_Error();            

  87.     /* Step5 */
  88.     set_STO;
  89.     clr_SI;
  90.     while (STO);                                /* 等待总线拉高*/
  91. }

  92. void MUTE_ISR (void) interrupt 0
  93. {
  94.     u8 i;
  95.     IE0=0;   
  96.     for(i=0;i<1000;i++){if(P30!=0)return;}       //加个电容抗抖的话,这里软件抗抖可以不要
  97.     MUTE++;
  98.     MUTE&=0x01;
  99.     I2C_W_DATA(0x02,(0X80+volume*MUTE));        //MUTE=0 or 1 volume*MUTE=volume or 0,等于0就直接实现静音.
  100.     I2C_W_DATA(0x03,(0X80+volume*MUTE));
  101. }
  102. /*音量下降按钮中断,软件抗抖,抗抖完成后是一个瞬动(下降一个dB),
  103. 然后检测按钮是不是继续按着,如果是,进入循环连续调整(俗称连发)*/
  104. void Volume_Down_ISR (void) interrupt 7
  105. {
  106.     u8 ADJ;
  107.     u16 i;
  108.     PIF=0;   
  109.     for(i=0;i<1000;i++){if(V_Down!=0)return;}           //软件抗抖
  110.     if(volume>0)volume--;                               //瞬动一次,立刻调整输出
  111.     I2C_W_DATA(0x02,(0X80+volume));     
  112.     I2C_W_DATA(0x03,(0X80+volume));     
  113.     while(V_Down==0)                                    //连发扳机检测,VOL_ADJ_CON是连发时间间隔计数。
  114.         {
  115.             ADJ=0;
  116.             for(i=0;i<VOL_ADJ_CON;i++)
  117.                 {
  118.                     if(V_Down!=0){ADJ=1;return;}
  119.                 }
  120.             if(ADJ==0)
  121.                 {
  122.                     if(volume>0)volume--;
  123.                     I2C_W_DATA(0x02,(0X80+volume));     //连发控制输出   
  124.                     I2C_W_DATA(0x03,(0X80+volume));     
  125.                 }
  126.         }
  127. }


  128. void Volume_Up_ISR (void) interrupt 2
  129. {
  130.    
  131.     u8 ADJ;
  132.     u16 i;
  133.     IE1=0;   
  134.     for(i=0;i<500;i++){if(V_Up!=0)return;}              //软件抗抖
  135.     if(volume<127)volume++;                             //瞬动一次,立刻调整输出
  136.     I2C_W_DATA(0x02,(0X80+volume));     
  137.     I2C_W_DATA(0x03,(0X80+volume));     
  138.     while(V_Up==0)                                      //连发扳机检测,VOL_ADJ_CON是连发时间间隔计数。
  139.         {
  140.             ADJ=0;
  141.             for(i=0;i<VOL_ADJ_CON;i++)
  142.                 {
  143.                     if(V_Up!=0){ADJ=1;return;}
  144.                 }
  145.             if(ADJ==0)
  146.                 {
  147.                     if(volume<127)volume++;
  148.                     I2C_W_DATA(0x02,(0X80+volume));     //连发控制输出         
  149.                     I2C_W_DATA(0x03,(0X80+volume));   
  150.                 }
  151.         }
  152. }
  153.   
  154. //========================================================================================================
  155. void main(void)
  156. {
  157.     Set_All_GPIO_Quasi_Mode;          //全部用弱上拉模式,这样,可以节省3个按钮上拉电阻,IIC总线也可以用就简单点偷懒了。
  158.     //P00_Quasi_Mode;
  159.     //Enable_INT_Port0;           //管脚切换到00组,这里是P00
  160.         PINEN=0X01;
  161.     PICON=0X04;
  162.     //Enable_BIT0_FallEdge_Trig;  //管脚中断边沿中断,下降沿
  163.     while(P30==0);
  164.     set_EPI;
  165.     TCON=0X05;
  166.     set_EX0;
  167.     set_EX1;
  168.     EA =1;
  169.     Init_I2C();                                 

  170.     //I2C_Process(0x0F,0x00);           //寄存器复位控制
  171.     I2C_W_DATA(0x00,0x17);              //线路L 音量、静音
  172.     I2C_W_DATA(0x01,0x17);              //线路R 音量、静音
  173.     /*这里没做断电音量自动保存,要实现也很简单,每次音量改变中断完成后,用FLASH单元,代替EEPROM数据,用SPI自编程实现,
  174.     考虑到片内FLASH擦写寿命(10W)还可以用连续单元,顺序检测第一个FF单元,并进行编程,一个一个的写下去,直到一页全部写满,
  175.     到该页内没有FF单元,才进行一次页擦除,然后就又可以继续保存音量数据了。*/
  176.     I2C_W_DATA(0x02,(0X80+volume));     //耳机L音量同时更新、零电压更新、音量控制
  177.     I2C_W_DATA(0x03,(0X80+volume));     //耳机L音量同时更新、零电压更新、音量控制
  178.     I2C_W_DATA(0x04,0x18);              //音频路径控制
  179.     I2C_W_DATA(0x05,0x00);              //DAC 控制 软静音、过采样、高通   
  180.     I2C_W_DATA(0x06,0x07);              //电源控制,ADC、line输入 MIC关闭,其余全部开启
  181.     I2C_W_DATA(0x07,0x3E);              //主从、数据格式控制 88.2
  182.     I2C_W_DATA(0x08,0x20);              //过采样控制  44.1
  183.     I2C_W_DATA(0x09,0x01);              //数字界面激活控制
  184.    
  185.     while (1)
  186.         {
  187.             UINT16 tmp;
  188.             
  189.             for (tmp=0;tmp<2000;tmp++){;}
  190.         }
  191. /* =================== */
  192. }

740071911 发表于 2018-8-14 10:10 | 显示全部楼层
啥意思没懂,,,我公司的电脑没有声卡,,然后通过usb接这个,再连上耳机就能听音乐的意思吗
 楼主| tianxj01 发表于 2018-8-14 10:14 | 显示全部楼层
本帖最后由 tianxj01 于 2018-8-14 10:16 编辑
740071911 发表于 2018-8-14 10:10
啥意思没懂,,,我公司的电脑没有声卡,,然后通过usb接这个,再连上耳机就能听音乐的意思吗 ...


对,原来电脑不需要声卡,只需要一条常见的手机数据线那种扁头USB线接上这个,电脑会出现一个声卡设备,这个声卡是盒子里面带的,然后插上耳机,你可以可以享受音乐了。
还是高保真的哈!!!...........

740071911 发表于 2018-8-14 10:22 | 显示全部楼层
这样的话,就是说,是电脑驱动盒子里的声卡,然后应该有声音了,那单片机起什么作用,请教下
 楼主| tianxj01 发表于 2018-8-14 10:29 | 显示全部楼层
740071911 发表于 2018-8-14 10:22
这样的话,就是说,是电脑驱动盒子里的声卡,然后应该有声音了,那单片机起什么作用,请教下 ...

声卡芯片的板子上面带的,而且只是用了它的USB数据---IIS音频数字部分功能。所以这部分基本上不会有损失。
后面是IIS驱动的TLV320AIC23B,这个芯片担任IIS数字音频---模拟音频--耳机的功能。
单片机这里就是专门控制TLV320AIC23B,实现芯片初始化、音量控制、静音、断电等功能的。
740071911 发表于 2018-8-14 10:36 | 显示全部楼层
原来如此,涨姿势了,话说就算是高保真没有好的耳机也不行啊
 楼主| tianxj01 发表于 2018-8-14 11:04 | 显示全部楼层
740071911 发表于 2018-8-14 10:36
原来如此,涨姿势了,话说就算是高保真没有好的耳机也不行啊

按照高保真的定义,和系统前后关系,首先得必须有好的驱动再加上好的喇叭,但是同样喇叭,音源越好听觉肯定越好,而反过来,差的音源,在好的喇叭上面听起来,会更加糟糕。所以,一个同样差不多而不是非常牛的耳塞,换一个好的音源推动,也许可以提升不少听音档次。
zhuomuniao110 发表于 2018-8-14 11:58 | 显示全部楼层
非常给力,不知道这个成本下来大概多少钱
 楼主| tianxj01 发表于 2018-8-15 08:16 | 显示全部楼层
zhuomuniao110 发表于 2018-8-14 11:58
非常给力,不知道这个成本下来大概多少钱

看图纸有点复杂,其实没几个东西,3个芯片(N76E003、CM108B、TLV320AIC23B),3个LDO(AMS1117-3.3*2+XC6206),5个47/16V钽电容(小黄豆),5个100uF/16V钽电容(黑色)一个12MHz有源振荡器。还有几个小电阻小电容,贴片元件总共33个(包括USB坐)。一块85*55双面板(有合适盒子,至少还可以缩小一半)。
740071911 发表于 2018-8-15 14:39 | 显示全部楼层
不错,我准备照着搞一个放办公室里用
 楼主| tianxj01 发表于 2018-8-17 09:39 | 显示全部楼层
下面附上修正后的BOM表:
10R
BD1, BD2
1206
2
100R
BD3
0805
1
104
C1, C2, C5, C8, C9, C10, C14, C18
0805
8
1u
C3
0805
1
3u3
C4, C6
0805
2
47u/10v
C7, C11, C12, C15, C17
TA-A
5
100uF/16V
C20, C21, C22, C23, C24
TA-B
5
3mm
D1
LED3-d
1
JK3.5
JK1, JK2
3F07
2
V-
K1
BUT6*6*11.5-H
1
V+
K2
BUT6*6*11.5-H
1
POWER
K3
BUT6*6*11.5-H
1
USB
P2
micro_USB1
1
10K
R1, R3, R10
0805
3
470R
R2, R4
0805
2
33R
R5, R6
0805
2
1K5
R7
0805
1
2K
R8, R9
0805
2
3K3
R11, R14
0805
2
N76E003
U1
TSSOP20
1
CM108B
U2
LQFP48
1
AMS1117
U3, U6
SOT-89
2
XC6206
U4
SOT-23
1
TLV320AIC23B
U5
TSSOP-28
1
12MHz
X1
SCO7X5
1
 楼主| tianxj01 发表于 2018-8-22 18:11 | 显示全部楼层
本帖最后由 tianxj01 于 2018-8-22 18:13 编辑

有坛友问,推大耳机可能会有问题。
特意从老家吧拉下的AKG快递过来测试。
AKG.jpg
听的是TDS 把耳朵叫醒专辑
听到06 爱情的秋天-孙露,声场、均衡、音色无可挑剔,孙露那如泣如诉的演绎,毫无音染。
关键是这个曲子原来也听过几次,可这次听的不知道怎么形容了,反正从来没有过这么强烈的走心的感觉,幸亏我有老婆还没失恋,否则我都担心是不是会被流泪。
秋天来了...落叶黄了...现在的你还好吗.吗.吗.吗.吗.吗....................

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部