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

📄 main.c

📁 东南大学开发的ARM7芯片SEP4020的IIS测试代码
💻 C
字号:
#include	<stdio.h>
#include	"HA_typedef.h"
#include	"hardware.h"
#include	"hardware_reg.h"
#include	"intc.h"

#define 	TEST_SPI 	0
#define 	PLAY		0x01
#define		RECORD		0x00

////////////////////disable SSI///////////////////// 
void ssi_disable(void)
{
   write_reg(SSI_SSIENR,0x0);  
}

///////////////////enable SSI//////////////////////
void ssi_enable(void)
{
   write_reg(SSI_SSIENR,0x1);  
}

////////////////////写发送FIFO///////////////////////
void ssi_write_dr(U16 data)
{
  write_reg(SSI_DR,data);
}

///////////////////读接收FIFO////////////////////////
U32 ssi_read_reg(U32 reg)
{
 return read_reg(reg);
}



////////////////////SPI协议///////////////////////////              
//CS0传输初始化
void ssi_spi_cs0(void)   
{
   write_reg(SSI_CTRLR0,0xc7);    //SCPOL=1,SCPH=1,SPI协议,数据帧长度8 
   write_reg(SSI_BAUDR,4);        //设置波特率
  
   //设置FIFO阈值
   write_reg(SSI_TXFTLR,0);     
   write_reg(SSI_SER,0x2);        //使能从设备
  
   //设置DMA传输参数
   write_reg(SSI_DMACR,0x3);     
   write_reg(SSI_DMATDLR,0x3);

}


void set_codec(U8 addr,U8 data)
{
	int i;
	U8 source[3];
	
	source[0]= addr;
	source[1]= data;
	     
	*(RP)DMACC1SrcAddr = source ;
	*(RP)DMACC1DestAddr = SSI_DR;
	*(RP)DMACC1Control = 0x901b;  
	    
	//Channel enable:umask error interrupt and accomplishment
	*(RP)DMACC1Configuration = 0x281b;	
	*(RP)DMACC1Index = 0;
	     
	for(i=0xf;i>0;i--);

}

void init_codec()
{
	/*初始化SPI*/        
	ssi_disable();   
	ssi_spi_cs0(); 
	ssi_enable() ;
		 
	/*复位CODEC*/ 
	//地址0001111
	//数据000000000	     
	set_codec(0x1E,0x00);

#if TEST_SPI
	/*设置CODEC时钟,仅作测试用,观察CLKOUT=2.8224MHz,确认SPI配置正确*/ 
	//地址0001000
	//数据011100000:CLKIN=MCLK/2(D7=1),CLKOUT=CLKIN/2(D6=1),其它位不变
	set_codec(0x10,0xE0);
	    
	    while(1);
#endif
	    
	/*设置电源,打开全部模块*/ 
	//地址0000110
	//数据000000000:全开
	set_codec(0x0C,0x00);
	    
	/*设置数据格式*/ 
	//地址0000111
	//数据000000010
	set_codec(0x0E,0x02);
	   	   
	/*模拟音频通道控制*/ 
	//地址0000100
	//数据000011010
	set_codec(0x08,0x1A);
	   
	/*数字音频通道控制*/ 
	//地址0000101
	//数据000000000
	set_codec(0x0A,0x00);
	   
	/*采样率控制*/ 
	//地址0001000
	//数据000000000
	set_codec(0x10,0x00);
	   
	/*左线路输入*/ 
	//地址0000000
	//数据100010111
	set_codec(0x01,0x17);
	   
	/*右线路输入*/ 
	//地址0000001
	//数据100010111
	set_codec(0x03,0x17);
	   
	/*左耳机输出*/ 
	//地址0000010
	//数据111111001
	set_codec(0x05,0xF9);
	   
	/*右耳机输出*/ 
	//地址0000011
	//数据111111001
	set_codec(0x07,0xF9);
	   
	/*激活CODEC*/ 
	//地址0001001
	//数据000000001
	set_codec(0x12,0x01);
	   
	ssi_disable() ;
}

void init_iis(void)
{
	int i;
	write_reg(I2S_T_CR, MUTE(0) + RESET_1(0) + ALIGN(0) + WS(0) + WID(1) + DIR(0)+ MODE(0) + MONO(0) + STOP(1) + DIV(0Xd));
	write_reg(I2S_T_IR, 0x04); 
	for (i = 0; i < 10; i++);
 	*(RP)I2S_T_CR &= 0Xfffeffff;
}

void init_dma(void)
{
	write_reg(DMACC0SrcAddr, 0x30300024); //source addr
 	write_reg(DMACC0DestAddr, I2S_T_DR); //destination addr
  	write_reg(DMACC0Control, TRANSFERSIZE(16) + DI(0) + SI(1) + DESTSIZE(2) +SOURCESIZE(2) + DESTBURST(3) + SOURCEBURST(3)); //control, 16, SI, 32, Burst = 4
  	write_reg(DMACC0Configuration, 0X200B);
}

void init_datapath(char pr)
{
		
	*(RP)0x1000F004 &= ~(0x1<<2);
	
	*(RP)0x1000F008 |= 0x1<<2;
	
	if(pr == 1)
		*(RP)0x1000F018 |= 0x1<<2;
	else
		*(RP)0x1000F018 &= ~(0x1<<2);
}


int main()
{  
	*(RP)PMU_PSCR =0x1ffff;   //打开所有模块
		
	INT_INIT();

  	mask_all_irq();
  	
  	unmask_irq(INT_DMA);
	
	irq_enable(INT_DMA);
	
	init_datapath(PLAY);
	
	init_codec();
	
	init_dma();
		
	init_iis();
	
	while(1);
		   
}




void BufferHanderTr(void)
{

	U32 tmp=read_reg(DMACC0SrcAddr);
	
	tmp+=0x800;
	
	if (tmp>=0x30398000) tmp=0x30300024;
		 
	write_reg(DMACC0DestAddr, I2S_T_DR);
	 
	write_reg(DMACC0SrcAddr, tmp);
	
	write_reg(DMACC0Control, TRANSFERSIZE(0x800) + DI(0) + SI(1) + DESTSIZE(2) + SOURCESIZE(2)+DESTBURST(3)+SOURCEBURST(3) );//control, 16, SI, 32, Burst = 4
	
	write_reg(DMACC0Configuration,0X200B);
}



extern void DmaInt(void)
{
  *(RP)DMACIntTCClear = 0X01; 
 
  *(RP)DMACIntTCClear = 0X00;
 
  BufferHanderTr();
}

	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -