|
我的毕设的DA不慎ti的tl320ad50c,将近一周的时间都在调它 今天终于通了!除了一口恶气!! 有点感想,向曾经或正在被他还得也不能寐的朋友共享一下我的 经验吧,这样可以少走一些弯路。 1)使用da时间一最好还是用常用的并行的片子,变成时采用定时 器中断,这样的冬冬很多, 千万不要看5402dsk上很好用就以为 他很简单(这是血的教训阿) 2)他的外围电路虽不复杂,但是那个8.192MHz的有源晶振就足以让 我跑断了腿,大连没有卖的,我差点让mm帮我从北京及两个过来。 由一个弥补办法,就是可以采用8.192倍数的晶振,我用的是32.768 ,要使用ad50内部的dpll。 3)他的ad/da采样率不高,只有22.05khz,仅限于语音处理,如果要 处理数据就有点难度了。 4)建议使用硬件初始化,即FC。我一周的时间都花在软件初始化上 面了,现在想想真是心疼啊。软件初始化,da的输出频率不准。至少 我是这样的。硬件初始化,一次就通过了,爽! 以下是我的程序,用C语言编的。包括McBsp和AD50C的初始化 main() { ResetMcBsp(); InitMcBsp(); OutReset(); Init_AD50C(); // initad50c(); while(1) { for(i=0;i<8;i++) { DXR11_RDY(); DXR11=sin[i]; } } } void ResetMcBsp(void) { SPSA1 = 0x0000; SPSD1 = 0x0000; //rrst = 0; //串口控制寄存器1 清零 SPSA1 = 0x0001; //xrst = frst = 0; SPSD1 = 0x0000; //串口控制寄存器2 清零 } void InitMcBsp(void) { SPSA1 = 0x0002; //rcr //RCR1接收控制寄存器1 SPSD1 = 0x0040; //16bit //接收字长度16bit
SPSA1 = 0x0003; //RCR2接收控制寄存器2 SPSD1 = 0x0000; //single phase & 1 delay//接收长度8bit,无延时 SPSA1 = 0x0004; //xcr //XCR1发送控制寄存器1 SPSD1 = 0x0040; //发送字长度16bit
SPSA1 = 0x0005; //XCR2发送控制寄存器2 SPSD1 = 0x0000; //发送长度8bit,无延时
SPSA1 = 0x0006; //SPGR1采样率发生器寄存器1 SPSD1 = 0x0000; //值为0
SPSA1 = 0x0007; //SPGR2采样率发生器寄存器2 SPSD1 = 0xA000;
SPSA1 = 0x000E; //PCR1引脚控制寄存器 SPSD1 = 0x000C; //接收数据采样率在时钟CLKR的下降沿 //发送数据采用率在时钟CLKX的上升沿 //接收帧同步脉冲低电平有效 //发送帧同步脉冲低电平有效 //CLKR,CLKX,FSR 输入脚 asm (" nop"); asm (" nop"); asm (" nop"); asm (" nop"); } void OutReset(void) { // SPSA1 = 0x0000; //SPCR1串口控制寄存器1 // SPSD1 = 0x0001; //rrst = 1; //打开接收 SPSA1 = 0x0001; //xrst = frst = 1;//SPCR1串口控制器2 SPSD1 = 0x0007; // 打开发送,DXR XSR不空发送 asm (" nop"); asm (" nop"); asm (" nop asm (" nop"); } void Init_AD50C(void) { asm(" ssbx xf"); asm (" nop"); asm (" nop"); asm (" nop"); asm (" nop"); DXR11=0x0181; //寄存器1 软件复位 asm (" nop"); asm (" nop"); asm (" nop"); asm (" nop"); DXR11_RDY(); asm(" ssbx xf"); asm (" nop"); asm (" nop"); asm (" nop"); asm (" nop"); DXR11=0x0101; //TLC320AD50C脱离复位 //并且设置寄存器1,使INP,INM为输入 asm (" nop"); asm (" nop"); asm (" nop"); asm (" nop"); DXR11_RDY();
asm(" ssbx xf"); asm (" nop"); asm (" nop"); asm (" nop"); asm (" nop"); DXR11=0x0210; //16bitadc //寄存器2 16位ADC asm (" nop"); asm (" nop"); asm (" nop"); asm (" nop"); DXR11_RDY(); asm(" ssbx xf"); asm (" nop"); asm (" nop"); asm (" nop"); asm (" nop"); DXR11=0x04c0; //寄存器4 N=4 //因为晶振为32.768MHz //采样频率16kHz //所以32768/16=2048=512*4 //Bypass internal PLL,D7=1 asm (" nop"); asm (" nop"); asm (" nop"); asm (" nop"); DXR11_RDY(); DXR11=0x0300; asm (" nop"); asm (" nop"); asm (" nop"); asm (" nop"); DXR11_RDY(); asm (" nop"); asm (" nop"); asm (" nop"); asm (" nop"); //N=4 } void DXR11_RDY(void) { SPSA1=0x0001; while(!((SPSD1&0x02)==0x02)){}; //判断DXR发送寄存器是否准备好接收新数据 asm(" rsbx xf"); }
|