[DAC] 求mcu控制cs8416电路图?

[复制链接] 查看: 31966|回复: 18

24

主题

2

好友

371

积分
     

业余侠客 当前离线

音响发疯友

Rank: 4

UID
504304
帖子
4101
精华
0
经验
371 点
金钱
364 ¥
注册时间
2012-6-16
发表于 2012-7-1 12:43 | 显示全部楼层
求mcu控制cs8416电路图?

12

主题

0

好友

574

积分

职业侠客 当前离线

Rank: 5Rank: 5

UID
34308
帖子
568
精华
0
经验
574 点
金钱
558 ¥
注册时间
2008-1-19
发表于 2012-7-1 12:52 | 显示全部楼层
我也想找
/****************************************************
* Code for headphone DAC
* 2005, gmarsh
*
* when programming, be sure to set chip flags
* for a 4MHz internal RC oscillator.
*
* PIN CONNECTIONS:
*
* PC0/ADC0 = volume control
* PC2 = PCM1792 reset
* PC3 = SRC419x/AD189x reset
* PC4/PC5 = TWI interface
* PD5 = CS8416 reset
*  
****************************************************/

// core frequency
#define        F_CPU        4000000

// includes
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <compat/twi.h>
#include <avr/delay.h>

// defines
#define        CS8416_ADDR                0x20
#define        PCM1792_ADDR        0x98
#define LOCKTIMEOUT                1202                // 250ms input timeout

// global variables
unsigned char        ATTEN;                                // PCM1792 attenuation value
unsigned char        last_atten;                        // last attenuation value
unsigned long        adc_average;                // filtered volume knob position
unsigned long        adc_upper_limit;        // upper hysteresis point
unsigned long        adc_lower_limit;        // lower hysteresis point
unsigned long        input_timeout;                // input-switch timeout

enum {COAX_LOCKED, COAX_UNLOCKED, TOSLINK_LOCKED, TOSLINK_UNLOCKED} lockstate;


// function prototypes
void send_1792(unsigned char address, unsigned char data);
void send_8416(unsigned char address, unsigned char data);


// code begins

int main(void) {

        // init globals
        ATTEN = 0;
        last_atten = 0;
        adc_average = 0;
        adc_upper_limit = 0;
        adc_lower_limit = 0;
        lockstate = TOSLINK_UNLOCKED;
        input_timeout = LOCKTIMEOUT;

        // init I/O ports
        PORTB = 0xFF;
        DDRB = 0x80;        // B7=test output
        PORTC = 0x72;
        DDRC = 0x0C;
        PORTD = 0xDB;        // PD2 should not have a pullup, or else 8416 gets angry
        DDRD = 0x20;

        // init ADC
        ADMUX = 0;        // select ADC0, external AREF
        ADCSRA = 0xAE;        // ADC enabled, free running mode, interrupt enabled, prescaler=64 (62.5KHz conv rate)
       
        // init TWI
        TWSR = 0x00;        // TWPS=0 (prescaler=1)
        //TWBR = 0x20;        // 50KHz SPI baud rate
        TWBR = 0x48;        // 25KHz baud rate
        TWCR = (1<<TWEN);        // enable TWI
       
        // reset devices
        _delay_ms(5);
        PORTC = 0x7B;        // enable SRC first
        _delay_ms(5);
        PORTC = 0x7F;        // enable DAC second
        _delay_ms(5);
        PORTD = 0xFB;        // enable CS8416 third
        _delay_ms(5);

        // init PCM1792
        send_1792(0x10,ATTEN);
        send_1792(0x11,ATTEN);
        send_1792(0x12,0xB1);        // attenuation load enable, LJ, no de-emph, muted for now
        send_1792(0x13,0x00);        // sharp DF rolloff

        // init CS8416
        send_8416(0x00,0x08);        // more wideband jitter, less inband
        send_8416(0x01,0x04);        // INT active high, zero SDOUT on Rx error, RMCK=128Fs
        send_8416(0x02,0x40);        // automatic de-emphasis enabled
        //send_8416(0x03,0x02);        // GPO2 = INT output
        send_8416(0x03,0x05);        // GPO2 = RERR output
        send_8416(0x04,0x18);        // RUN=0, optical selected
        send_8416(0x05,0x80);        // LJ master mode; SOJUST=0, SODEL=0, SOSPOL=0, SOLRPOL=0
        send_8416(0x06,0x10);        // UNLOCK unmasked in RERR register
        send_8416(0x07,0x04);        // RERR register unmasked for interrupt
        send_8416(0x08,0x7F);        // all interrupts level-active
        send_8416(0x09,0x00);        // all interrupts level-active
        send_8416(0x04,0x98);        // RUN=1 / optical
       
        // unmute PCM1792
        send_1792(0x12,0xB0);
       
        // enable SLEEP instruction
        MCUCR = 0x80;

        // enable interrupts
        sei();

        // start ADC conversion
        ADCSRA = 0xEE;
       

        // main loop
       
        while(1) {
               
                // update PCM1792 attenuation if volume pot moved

                if (last_atten != ATTEN) {
                        last_atten = ATTEN;
                        send_1792(0x10,last_atten);
                        send_1792(0x11,last_atten);
                }

                // handle input detection
               
                switch(lockstate) {
                        case COAX_LOCKED:
                                if (PIND & 0x04) {
                                        input_timeout = LOCKTIMEOUT;
                                        lockstate = COAX_UNLOCKED;
                                }
                                break;
                               
                        case TOSLINK_LOCKED:
                                if (PIND & 0x04) {
                                        input_timeout = LOCKTIMEOUT;
                                        lockstate = TOSLINK_UNLOCKED;
                                }
                                break;
                       
                        case COAX_UNLOCKED:
                                if (--input_timeout == 0) {
                                        send_8416(0x04,0x98);        // switch to toslink input
                                        input_timeout = LOCKTIMEOUT;
                                        lockstate = TOSLINK_UNLOCKED;
                                }
                               
                                if ((PIND & 0x04) == 0) {
                                        lockstate = COAX_LOCKED;
                                }
                                break;
                       
                        case TOSLINK_UNLOCKED:
                                if (--input_timeout == 0) {
                                        send_8416(0x04,0x90);        // switch to coax input
                                        input_timeout = LOCKTIMEOUT;
                                        lockstate = COAX_UNLOCKED;
                                }
                               
                                if ((PIND & 0x04) == 0) {
                                        lockstate = TOSLINK_LOCKED;
                                }
                                break;
                       
                }
               
                asm("sleep;");        // enter sleep mode, wait for next ADC interrupt
        }

}


// ADC (volume pot) handler

INTERRUPT(SIG_ADC) {

        signed long error;
       
        error = (signed long) (ADCW - (adc_average >> 6));
        adc_average += error;
       
        if ( (adc_average > adc_upper_limit) || (adc_average < adc_lower_limit) ) {
               
                ATTEN = ((adc_average & 0xFF00) >> 8);
               
                if ((adc_average & 0xFF00) == 0xFF00) {
                        adc_upper_limit = 0xFFFF;
                } else {
                        adc_upper_limit = (adc_average & 0xFF00) + 0x180;
                }
               
                if ((adc_average & 0xFF00) == 0x0000) {
                        adc_lower_limit = 0x0000;
                } else {
                        adc_lower_limit = (adc_average & 0xFF00) - 0x80;
                }
               
        }

}


// TWI routines

void send_8416(unsigned char address, unsigned char data) {
       
        // send start
        TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
        while(!(TWCR & (1<<TWINT)));

        // send slave address
        TWDR = CS8416_ADDR;
        TWCR = (1<<TWINT)|(1<<TWEN);
        while(!(TWCR & (1<<TWINT)));

        // send register address
        TWDR = address;
        TWCR = (1<<TWINT)|(1<<TWEN);
        while(!(TWCR & (1<<TWINT)));

        // send data
        TWDR = data;
        TWCR = (1<<TWINT)|(1<<TWEN);
        while(!(TWCR & (1<<TWINT)));
       
        // send stop condition
        TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
}

void send_1792(unsigned char address, unsigned char data) {
       
        // send start
        TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
        while(!(TWCR & (1<<TWINT)));

        // send slave address
        TWDR = PCM1792_ADDR;
        TWCR = (1<<TWINT)|(1<<TWEN);
        while(!(TWCR & (1<<TWINT)));

        // send register address
        TWDR = address;
        TWCR = (1<<TWINT)|(1<<TWEN);
        while(!(TWCR & (1<<TWINT)));

        // send data
        TWDR = data;
        TWCR = (1<<TWINT)|(1<<TWEN);
        while(!(TWCR & (1<<TWINT)));
       
        // send stop condition
        TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
}

12

主题

0

好友

574

积分

职业侠客 当前离线

Rank: 5Rank: 5

UID
34308
帖子
568
精华
0
经验
574 点
金钱
558 ¥
注册时间
2008-1-19
发表于 2012-7-1 13:12 | 显示全部楼层
上面这个C是升频带耳放的,CS8416,SRC419X,PCM1792
hpa.png

24

主题

2

好友

371

积分
     

业余侠客 当前离线

音响发疯友

Rank: 4

UID
504304
帖子
4101
精华
0
经验
371 点
金钱
364 ¥
注册时间
2012-6-16
 楼主| 发表于 2012-7-1 13:18 | 显示全部楼层
3q

12

主题

0

好友

574

积分

职业侠客 当前离线

Rank: 5Rank: 5

UID
34308
帖子
568
精华
0
经验
574 点
金钱
558 ¥
注册时间
2008-1-19
发表于 2012-7-1 13:25 | 显示全部楼层
3q
好一个萝卜 发表于 2012-7-1 13:18

NO 3Q,赶紧做出来,然后来报告一下情况

1

主题

0

好友

114

积分

论坛游民 当前离线

Rank: 3Rank: 3

UID
65848
帖子
145
精华
0
经验
114 点
金钱
114 ¥
注册时间
2008-11-29
发表于 2012-7-2 20:54 | 显示全部楼层
用了8416 还要加上419X呢?貌似多余

1

主题

0

好友

114

积分

论坛游民 当前离线

Rank: 3Rank: 3

UID
65848
帖子
145
精华
0
经验
114 点
金钱
114 ¥
注册时间
2008-11-29
发表于 2012-7-2 20:55 | 显示全部楼层
用了8416 还要加上419X呢?貌似多余。

24

主题

2

好友

371

积分
     

业余侠客 当前离线

音响发疯友

Rank: 4

UID
504304
帖子
4101
精华
0
经验
371 点
金钱
364 ¥
注册时间
2012-6-16
 楼主| 发表于 2012-7-3 17:11 | 显示全部楼层
回复 7# akai


    419X是什么

32

主题

0

好友

3558

积分

贵宾 当前离线

来自上海的

Rank: 3Rank: 3

UID
8411
帖子
3222
精华
3
经验
3558 点
金钱
1885 ¥
注册时间
2006-4-5

社区贡献

发表于 2012-7-3 19:09 | 显示全部楼层
升频芯片

48

主题

0

好友

1671

积分

侠之大者 当前离线

Rank: 6Rank: 6

UID
248009
帖子
1704
精华
0
经验
1671 点
金钱
1687 ¥
注册时间
2010-10-8
发表于 2012-7-3 21:07 | 显示全部楼层
8416程序都有了,很给力啊。呵呵,赶快弄出来点眉目吧

12

主题

0

好友

574

积分

职业侠客 当前离线

Rank: 5Rank: 5

UID
34308
帖子
568
精华
0
经验
574 点
金钱
558 ¥
注册时间
2008-1-19
发表于 2012-7-3 21:47 | 显示全部楼层
本帖最后由 tzya2 于 2012-7-3 21:52 编辑
用了8416 还要加上419X呢?貌似多余
akai 发表于 2012-7-2 20:54

这是鬼佬的电路,程序也是鬼佬的,鬼佬真多余
话说回来,外国人还挺大方的,能提供开源的程序已经很不错了

24

主题

2

好友

371

积分
     

业余侠客 当前离线

音响发疯友

Rank: 4

UID
504304
帖子
4101
精华
0
经验
371 点
金钱
364 ¥
注册时间
2012-6-16
 楼主| 发表于 2012-7-7 11:53 | 显示全部楼层
程序已经调试好了 不过还没实验
1.rar (1.21 KB, 下载次数: 17260)

12

主题

0

好友

574

积分

职业侠客 当前离线

Rank: 5Rank: 5

UID
34308
帖子
568
精华
0
经验
574 点
金钱
558 ¥
注册时间
2008-1-19
发表于 2012-7-7 23:42 | 显示全部楼层
本帖最后由 tzya2 于 2012-7-8 00:04 编辑

dac.rar (1.34 KB, 下载次数: 17135)

12

主题

0

好友

574

积分

职业侠客 当前离线

Rank: 5Rank: 5

UID
34308
帖子
568
精华
0
经验
574 点
金钱
558 ¥
注册时间
2008-1-19
发表于 2012-7-11 16:42 | 显示全部楼层
回复 13# tzya2
还有一个LCD显示版本
audiodac-input.rar (89.2 KB, 下载次数: 17572)

9

主题

0

好友

420

积分
     

业余侠客 当前离线

Rank: 4

UID
419905
帖子
681
精华
0
经验
420 点
金钱
620 ¥
注册时间
2011-10-22
发表于 2012-7-12 06:46 | 显示全部楼层
学习了

25

主题

2

好友

333

积分

业余侠客 当前离线

Rank: 4

UID
193147
帖子
7464
精华
0
经验
333 点
金钱
323 ¥
注册时间
2010-4-19
发表于 2012-7-12 06:56 | 显示全部楼层
,好人啊,可惜自己不会弄。。。。。。

24

主题

2

好友

371

积分
     

业余侠客 当前离线

音响发疯友

Rank: 4

UID
504304
帖子
4101
精华
0
经验
371 点
金钱
364 ¥
注册时间
2012-6-16
 楼主| 发表于 2012-8-5 17:06 | 显示全部楼层
有人做了么

98

主题

10

好友

878

积分
     

职业侠客 当前离线

DIY爱好者

Rank: 5Rank: 5

UID
264167
帖子
1779
精华
0
经验
878 点
金钱
755 ¥
注册时间
2010-11-22

认证会员

发表于 2015-10-25 17:45 | 显示全部楼层
谢谢分享!

38

主题

2

好友

571

积分

职业侠客 当前离线

Rank: 5Rank: 5

UID
43431
帖子
1028
精华
0
经验
571 点
金钱
535 ¥
注册时间
2008-5-18
发表于 2015-10-25 18:00 | 显示全部楼层
期待测试报告
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc.

返回顶部