⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 codectest.c

📁 TMS320VC5402 合众达板子实现CODEC
💻 C
📖 第 1 页 / 共 2 页
字号:
#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);				//发送复位
	MCBSP_RX_RESET(mcbsp);				//接收复位
	MCBSP_SUBREG_WRITE(mcbsp,SPCR1_SUBADDR,0x4000);	//设置SPCR1寄存器。禁止数字环回模式;DRR左对齐;禁止SPI模式;非SPI模式下的时钟停止模式;DX延迟使能禁止;由RRDY产生接收中断RINT。
	MCBSP_SUBREG_WRITE(mcbsp,SPCR2_SUBADDR,0x0100);	//设置SPCR2寄存器。软件模式允许;帧同步逻辑复位;采样率发生器复位;XRDY产生发送中断XINT。
	MCBSP_SUBREG_WRITE(mcbsp,RCR1_SUBADDR,0x0040);	//设置RCR1寄存器。每帧1个字,接收数据长度为16位。
	MCBSP_SUBREG_WRITE(mcbsp,RCR2_SUBADDR,0);		//设置RCR2寄存器。单数据相;无压扩,数据传输从MSB开始;每次传输都需要帧同步;0比特数据延时。
	MCBSP_SUBREG_WRITE(mcbsp,XCR1_SUBADDR,0x0040);	//设置XCR1寄存器。每帧1个字;发送数据长度为16位。
	MCBSP_SUBREG_WRITE(mcbsp,XCR2_SUBADDR,0);	//设置XCR2寄存器。单数据相;无压扩,数据传输从MSB开始;每次传输都需要帧同步;0比特数据延时。
	MCBSP_SUBREG_WRITE(mcbsp,SRGR1_SUBADDR,0);	//设置SRGR1寄存器。帧同步脉冲的宽度为1CLKG周期;采样率发生器时钟分频系数为1。
	MCBSP_SUBREG_WRITE(mcbsp,SRGR2_SUBADDR,0);	//设置SRGR2寄存器。采样率发生器时钟自由运行;CLKS的上升沿产生CLKG和FSG;采样率发生器时钟由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的上升沿发送数据,在CLKR的下降沿接收数据。
	MCBSP_ENABLE(mcbsp,3);				//使能串口接收和发送操作
	/*等待两个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的控制寄存器
	参数:
	hDevice--控制codec的句柄
	reg--控制寄存器的地址
*/
u16 codec_read_reg(HANDLE hDevice,CodecReg reg)
{
	u16 temp;
	
	temp=((u16)reg<<0x08)+0x2000;	//控制字
	
	//清空接收缓冲区及RRDY标志
	
	REG_READ(DRR1_ADDR((unsigned int*)hDevice));
	while(!MCBSP_RRDY((unsigned int*)hDevice));
    REG_READ(DRR1_ADDR((unsigned int*)hDevice));
 
	/*等待数据发送准备好*/
	
	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 + -