发新帖本帖赏金 20.00元(功能说明)我要提问
返回列表
打印
[应用方案]

【原创】N76E003+CM108B+TLV320AIC23B的I2S USB耳放(连载)

[复制链接]
楼主: tianxj01
手机看帖
扫描二维码
随时随地手机跟帖
21
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就是没声音呢?

官方文档里面,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耳机,音质什么的都非常对得起价格,可声场实在有点太小了,所有东西貌似都只在脑袋那么大的地方发声。


使用特权

评论回复
22
tianxj01|  楼主 | 2018-8-12 10:10 | 只看该作者

出来了,效果自己看后面的吧。

使用特权

评论回复
23
tianxj01|  楼主 | 2018-8-12 15:12 | 只看该作者
现在上测试波形
输入是三个0dB 的 正弦波、三角波、方波测试用WAV。这个网上可以找到,不用再做了哈。44100采样率,播放器foobar2000.关闭任何滤镜。

1KHz 0dB 三角波,可以说至少肉眼看不见任何畸变,线性度良好,线条有点粗是可以理解的,人家可是没有任何高频去加重环节的哈。


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


1KHz方便,测试条件增益调整到约±1Vp-p,过采样=441000.
非常典型的44.1K采样的 1KHz方波,(你也可以理解为抽掉了44.1K谐波分量的1KHz方波)波形对称,上下沿对称。
到这里,主观听音和波形测试就全部完成了。剩下的就是做好外壳了。

使用特权

评论回复
24
tianxj01|  楼主 | 2018-8-13 10:20 | 只看该作者
外壳是原来手上就有的,某宝上面弄的,记得得5-6元一个呢。
前几天打样时候,忘记了盒子里面的槽高度只有1.2,板子做的是1.6的,皇帝他妈--太厚。2边锉斜边,才顺利塞进去。
划线、钻孔、锉刀伺候,面板后板到位,完全进去了,是不是有点怪,对了,LED没装,等不及了先装起来欣赏音乐吧。等下再焊LED,这个不急了哈。
前面是这样的哈..........


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


现在,耳机听着楼兰的西海情歌,发着帖子,感觉好极了......................................
好了,整个小东西算是做好了,连载到这里也暂告段落,有感兴趣的,可以详细询问和交流............................

使用特权

评论回复
25
xuanhuanzi| | 2018-8-13 10:35 | 只看该作者
给力,顺便跟楼主学个歇后语,哈哈。

使用特权

评论回复
26
xuanhuanzi| | 2018-8-13 10:36 | 只看该作者
太厚,哈哈。。西海情歌老好听了,我也赶紧去听听。

使用特权

评论回复
27
yiyigirl2014| | 2018-8-13 11:14 | 只看该作者
这听起来给力。

使用特权

评论回复
28
zhuomuniao110| | 2018-8-14 07:29 | 只看该作者
看起来很666

使用特权

评论回复
29
tianxj01|  楼主 | 2018-8-14 10:05 | 只看该作者
哈哈,看见编辑推荐了,怎么说也得回应一下,现在放出MCU控制代码
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2017 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

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

//***********************************************************************************************************
//  File Function: N76E003 I2C master mode demo code, the Slave address = 0xA4
//
//   ____________            _____________
//  |            |   SDA    |             |
//  |            |<-------->|             |
//  |            |          |             |
//  |N76E003(M) |          | N76E003(S) |
//  |(I2C_Master)|          | (I2C_Slave) |
//  |            |   SCL    |             |
//  |            |--------->|             |
//  |____________|          |_____________|
//
//  The protocol of I2C is same the "24LC64"
//***********************************************************************************************************


#include "N76E003.h"
#include "Common.h"
#include "Delay.h"
#include "SFR_Macro.h"
#include "Function_define.h"

#define u8              unsigned char
#define u16                    unsigned int
#define u32             unsigned long
#define V_Up            P17
#define V_Down          P00
#define I2C_CLOCK       13
#define TLV320_ADD      0x34
#define Vol             120//0-127的一个数字,=0为静音
#define VOL_ADJ_CON     40000


u8  volume = Vol;
u8  MUTE=1;
//========================================================================================================
void Init_I2C(void)
{
    /* Set I2C clock rate */
    I2CLK = I2C_CLOCK;
    /* Enable I2C */
    set_I2CEN;                                   
}
//========================================================================================================
void I2C_Error(void)
{
//    P3 = I2STAT;
//    P3 = ERROR_CODE;
    while (1);   
}
//========================================================================================================
void I2C_W_DATA(UINT8 REG_ADD , UINT8 u8DAT)
{
    /* Step1 */
    set_STA;                                    /* 发送Start位信号  */
    clr_SI;
    while (!SI);                                //检测总线,这里是主控单从芯片,单发送,其实可以不需要这个检测,
    if (I2STAT != 0x08)  I2C_Error();           //不过原官方代码有这个,也不影响,就留着了。
        
   
    /* Step2 */
    clr_STA;                                    //STA=0
    I2DAT = TLV320_ADD;                         //发送芯片IIC地址
    clr_SI;
    while (!SI);                                //检测ACK
    if (I2STAT != 0x18)  I2C_Error();            
        

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

    /* Step5 */
    set_STO;
    clr_SI;
    while (STO);                                /* 等待总线拉高*/
}

void MUTE_ISR (void) interrupt 0
{
    u8 i;
    IE0=0;   
    for(i=0;i<1000;i++){if(P30!=0)return;}       //加个电容抗抖的话,这里软件抗抖可以不要
    MUTE++;
    MUTE&=0x01;
    I2C_W_DATA(0x02,(0X80+volume*MUTE));        //MUTE=0 or 1 volume*MUTE=volume or 0,等于0就直接实现静音.
    I2C_W_DATA(0x03,(0X80+volume*MUTE));
}
/*音量下降按钮中断,软件抗抖,抗抖完成后是一个瞬动(下降一个dB),
然后检测按钮是不是继续按着,如果是,进入循环连续调整(俗称连发)*/
void Volume_Down_ISR (void) interrupt 7
{
    u8 ADJ;
    u16 i;
    PIF=0;   
    for(i=0;i<1000;i++){if(V_Down!=0)return;}           //软件抗抖
    if(volume>0)volume--;                               //瞬动一次,立刻调整输出
    I2C_W_DATA(0x02,(0X80+volume));     
    I2C_W_DATA(0x03,(0X80+volume));     
    while(V_Down==0)                                    //连发扳机检测,VOL_ADJ_CON是连发时间间隔计数。
        {
            ADJ=0;
            for(i=0;i<VOL_ADJ_CON;i++)
                {
                    if(V_Down!=0){ADJ=1;return;}
                }
            if(ADJ==0)
                {
                    if(volume>0)volume--;
                    I2C_W_DATA(0x02,(0X80+volume));     //连发控制输出   
                    I2C_W_DATA(0x03,(0X80+volume));     
                }
        }
}


void Volume_Up_ISR (void) interrupt 2
{
   
    u8 ADJ;
    u16 i;
    IE1=0;   
    for(i=0;i<500;i++){if(V_Up!=0)return;}              //软件抗抖
    if(volume<127)volume++;                             //瞬动一次,立刻调整输出
    I2C_W_DATA(0x02,(0X80+volume));     
    I2C_W_DATA(0x03,(0X80+volume));     
    while(V_Up==0)                                      //连发扳机检测,VOL_ADJ_CON是连发时间间隔计数。
        {
            ADJ=0;
            for(i=0;i<VOL_ADJ_CON;i++)
                {
                    if(V_Up!=0){ADJ=1;return;}
                }
            if(ADJ==0)
                {
                    if(volume<127)volume++;
                    I2C_W_DATA(0x02,(0X80+volume));     //连发控制输出         
                    I2C_W_DATA(0x03,(0X80+volume));   
                }
        }
}
  
//========================================================================================================
void main(void)
{
    Set_All_GPIO_Quasi_Mode;          //全部用弱上拉模式,这样,可以节省3个按钮上拉电阻,IIC总线也可以用就简单点偷懒了。
    //P00_Quasi_Mode;
    //Enable_INT_Port0;           //管脚切换到00组,这里是P00
        PINEN=0X01;
    PICON=0X04;
    //Enable_BIT0_FallEdge_Trig;  //管脚中断边沿中断,下降沿
    while(P30==0);
    set_EPI;
    TCON=0X05;
    set_EX0;
    set_EX1;
    EA =1;
    Init_I2C();                                 

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

使用特权

评论回复
30
740071911| | 2018-8-14 10:10 | 只看该作者
啥意思没懂,,,我公司的电脑没有声卡,,然后通过usb接这个,再连上耳机就能听音乐的意思吗

使用特权

评论回复
31
tianxj01|  楼主 | 2018-8-14 10:14 | 只看该作者
本帖最后由 tianxj01 于 2018-8-14 10:16 编辑
740071911 发表于 2018-8-14 10:10
啥意思没懂,,,我公司的电脑没有声卡,,然后通过usb接这个,再连上耳机就能听音乐的意思吗 ...


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

使用特权

评论回复
32
740071911| | 2018-8-14 10:22 | 只看该作者
这样的话,就是说,是电脑驱动盒子里的声卡,然后应该有声音了,那单片机起什么作用,请教下

使用特权

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

声卡芯片的板子上面带的,而且只是用了它的USB数据---IIS音频数字部分功能。所以这部分基本上不会有损失。
后面是IIS驱动的TLV320AIC23B,这个芯片担任IIS数字音频---模拟音频--耳机的功能。
单片机这里就是专门控制TLV320AIC23B,实现芯片初始化、音量控制、静音、断电等功能的。

使用特权

评论回复
34
740071911| | 2018-8-14 10:36 | 只看该作者
原来如此,涨姿势了,话说就算是高保真没有好的耳机也不行啊

使用特权

评论回复
35
tianxj01|  楼主 | 2018-8-14 11:04 | 只看该作者
740071911 发表于 2018-8-14 10:36
原来如此,涨姿势了,话说就算是高保真没有好的耳机也不行啊

按照高保真的定义,和系统前后关系,首先得必须有好的驱动再加上好的喇叭,但是同样喇叭,音源越好听觉肯定越好,而反过来,差的音源,在好的喇叭上面听起来,会更加糟糕。所以,一个同样差不多而不是非常牛的耳塞,换一个好的音源推动,也许可以提升不少听音档次。

使用特权

评论回复
36
zhuomuniao110| | 2018-8-14 11:58 | 只看该作者
非常给力,不知道这个成本下来大概多少钱

使用特权

评论回复
37
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双面板(有合适盒子,至少还可以缩小一半)。

使用特权

评论回复
38
740071911| | 2018-8-15 14:39 | 只看该作者
不错,我准备照着搞一个放办公室里用

使用特权

评论回复
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

使用特权

评论回复
40
tianxj01|  楼主 | 2018-8-22 18:11 | 只看该作者
本帖最后由 tianxj01 于 2018-8-22 18:13 编辑

有坛友问,推大耳机可能会有问题。
特意从老家吧拉下的AKG快递过来测试。

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

使用特权

评论回复
发新帖 本帖赏金 20.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则