?? codectest.c
字號:
#include "type.h"
#include "board.h"
#include "stdio.h"
#include "timer.h"
#include "mcbsp54.h"
#include "codec.h"
//Tms320vc5402 have two timer--TIM0:timer0 TIM1:timer1
#define TIM0 0
#define TIM1 1
//define clkmd register initialize value
#define PLL15 0x0e007
#define PLL10 0x9007
#define PLL5 0x4007
#define PLL2 0x1007
#define PLL1 0x0f007
#define DIV2 0x0000
#define DIV4 0xf000
void set_clock(u16 plldiv); //set system clock mode
void set_wait_states(void); //set wait state register
void init_io_reg(void); //initialize CPLD I/O control register
void board_led_toggle(BrdLed led); //led toggle
void board_led_enable(BrdLed led); //led enable
void board_led_disable(BrdLed led); //led disable
void delay(int period);
u16 count=2;
u8 xf_flag=0;
HANDLE hdevice;
s16 data;
u16 CR1=0; //AD50的控制寄存器1
u16 CR2=0; //AD50的控制寄存器2
u16 CR3=0; //AD50的控制寄存器3
u16 CR4=0; //AD50的控制寄存器4
void main()
{
asm(" SSBX INTM "); //disable all interrupt
set_clock(PLL10); //clkout=10*10=100Mhz
set_wait_states();
init_io_reg();
while(count--)
{
board_led_enable(BRD_LED0);
delay(2000);
board_led_disable(BRD_LED0);
board_led_enable(BRD_LED1);
delay(2000);
board_led_disable(BRD_LED1);
board_led_enable(BRD_LED2);
delay(2000);
board_led_disable(BRD_LED2);
}
hdevice = codec_open(HANDSET_CODEC); //create instance of codec
//codec initialize
codec_adc_mode(hdevice, CODEC_ADC_15BIT);
codec_dac_mode(hdevice, CODEC_DAC_15BIT);
codec_ain_gain(hdevice, CODEC_AIN_6dB);
codec_aout_gain(hdevice, CODEC_AOUT_MINUS_6dB);
codec_sample_rate(hdevice,SR_16000);
for(;;)
{
while(!MCBSP_RRDY(HANDSET_CODEC));
data = *(volatile u16*)DRR11_ADDR;
*(volatile u16*)DXR11_ADDR = data;
//data = DRR11;
//DXR11 = data;
}
}
//set clock generator mode
void set_clock(u16 plldiv)
{
if (CLKMD&0x0001) //if clock generator is PLL mode
{
if ((plldiv==DIV2)||(plldiv==DIV4)) //PLL mode to DIV mode
{
CLKMD=plldiv;
}
else //PLL mode to PLL mode
{
CLKMD=DIV2; //turn to DIV mode
while (CLKMD&0x0001); //check CLKMD PLL status bit
CLKMD=plldiv|0x07f8;
while (!(CLKMD&0x0001)); //check CLKMD PLL status bit
}
}
else //else clock generator is DIV mode
{
if ((plldiv==DIV2)||(plldiv==DIV4)) //DIV mode to DIV mode
{
CLKMD=PLL1|0x07f8; //turn to PLL mode
while(!(CLKMD&0x0001)); //check CLKMD PLL status bit
CLKMD=plldiv;
}
else
{
CLKMD=plldiv|0x07f8; //DIV mode to PLL mode
while (!(CLKMD&0x0001)); //check CLKMD PLL status bit
}
}
}
void set_wait_states(void)
{
SWWSR=0x0d844;
}
void init_io_reg(void)
{
port0=0x10;
port4=0x03;
port2=0x00;
port3=0x30;
port5=0x00;
port6=0x00;
}
void board_led_enable(BrdLed led)
{
port0|=0x01<<led;
}
void board_led_disable(BrdLed led)
{
port0&=~(0x01<<led);
}
void board_led_toggle(BrdLed led)
{
port0^=(0x01<<led);
}
void delay(int period)
{
int i, j;
for(i=0; i<period; i++)
{
for(j=0; j<period>>1; j++);
}
}
//多通道緩沖串行口初始化程序,0--串口0 1--串口1
void init_mcbsp(u16 mcbsp)
{
MCBSP_TX_RESET(mcbsp); //發(fā)送復位
MCBSP_RX_RESET(mcbsp); //接收復位
MCBSP_SUBREG_WRITE(mcbsp,SPCR1_SUBADDR,0x4000); //設置SPCR1寄存器。禁止數(shù)字環(huán)回模式;DRR左對齊;禁止SPI模式;非SPI模式下的時鐘停止模式;DX延遲使能禁止;由RRDY產生接收中斷RINT。
MCBSP_SUBREG_WRITE(mcbsp,SPCR2_SUBADDR,0x0100); //設置SPCR2寄存器。軟件模式允許;幀同步邏輯復位;采樣率發(fā)生器復位;XRDY產生發(fā)送中斷XINT。
MCBSP_SUBREG_WRITE(mcbsp,RCR1_SUBADDR,0x0040); //設置RCR1寄存器。每幀1個字,接收數(shù)據長度為16位。
MCBSP_SUBREG_WRITE(mcbsp,RCR2_SUBADDR,0); //設置RCR2寄存器。單數(shù)據相;無壓擴,數(shù)據傳輸從MSB開始;每次傳輸都需要幀同步;0比特數(shù)據延時。
MCBSP_SUBREG_WRITE(mcbsp,XCR1_SUBADDR,0x0040); //設置XCR1寄存器。每幀1個字;發(fā)送數(shù)據長度為16位。
MCBSP_SUBREG_WRITE(mcbsp,XCR2_SUBADDR,0); //設置XCR2寄存器。單數(shù)據相;無壓擴,數(shù)據傳輸從MSB開始;每次傳輸都需要幀同步;0比特數(shù)據延時。
MCBSP_SUBREG_WRITE(mcbsp,SRGR1_SUBADDR,0); //設置SRGR1寄存器。幀同步脈沖的寬度為1CLKG周期;采樣率發(fā)生器時鐘分頻系數(shù)為1。
MCBSP_SUBREG_WRITE(mcbsp,SRGR2_SUBADDR,0); //設置SRGR2寄存器。采樣率發(fā)生器時鐘自由運行;CLKS的上升沿產生CLKG和FSG;采樣率發(fā)生器時鐘由CLKS管腳輸入;當DXR[12]拷貝到XSR[12]時產生幀同步信號FSX.
/*等待兩個CLKG時鐘周期*/
asm(" nop ");
asm(" nop ");
MCBSP_SUBREG_WRITE(mcbsp,PCR_SUBADDR,0x000c); //設置PCR寄存器。DX、FSX、CLKX、DR、FSR、CLKR配置為串口管腳;FSX、FSR、CLKX、CLKR作為輸入管腳,由外部驅動;FSX、FSR低電平有效;在CLKX的上升沿發(fā)送數(shù)據,在CLKR的下降沿接收數(shù)據。
MCBSP_ENABLE(mcbsp,3); //使能串口接收和發(fā)送操作
/*等待兩個CLKG時鐘周期*/
asm(" nop ");
asm(" nop ");
}
//二次通訊請求引腳FC1置1
void set_fc1(void)
{
port4|=0x08;
}
//二次通訊請求引腳FC1清零
void clr_fc1(void)
{
port4&=0xf7;
}
/*
codec_read_reg(ANDLE hDevice,CodecReg reg)--讀AD50 CODEC的控制寄存器
參數(shù):
hDevice--控制codec的句柄
reg--控制寄存器的地址
*/
u16 codec_read_reg(HANDLE hDevice,CodecReg reg)
{
u16 temp;
temp=((u16)reg<<0x08)+0x2000; //控制字
//清空接收緩沖區(qū)及RRDY標志
REG_READ(DRR1_ADDR((unsigned int*)hDevice));
while(!MCBSP_RRDY((unsigned int*)hDevice));
REG_READ(DRR1_ADDR((unsigned int*)hDevice));
/*等待數(shù)據發(fā)送準備好*/
while(!MCBSP_XRDY((unsigned int*)hDevice));
set_fc1();
asm(" nop ");
asm(" nop ");
asm(" nop ");
asm(" nop ");
REG_WRITE(DXR1_ADDR((unsigned int*)hDevice), temp);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -