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

📄 iis.c

📁 武汉创维特ARM7实验箱的全部源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************/
/*                                                                          */
/* FILE NAME                                      VERSION                   */
/*                                                                          */
/* IIS.C                                            1.0                     */
/*                                                                          */
/* DESCRIPTION                                                              */
/*                                                                          */
/*     JX44B0(S3C44B0X)触摸屏驱动实验                                       */
/*                                                                          */
/*                                                                          */
/* DATA STRUCTURES                                                          */
/*                                                                          */
/* FUNCTIONS :                                                              */
/*     在JX44B0教学实验箱进行语音录放的实验                                 */
/*                                                                          */
/* DEPENDENCIES                                                             */
/*     JX44B0-1                                                             */
/*     JX44B0-2                                                             */
/*     JX44B0-3                                                             */
/*                                                                          */
/*                                                                          */
/* NAME:                                                                    */
/* REMARKS:                                                                 */
/*                                                                          */
/*								Copyright (C) 2003 Wuhan CVTECH CO.,LTD     */
/****************************************************************************/

/****************************************************************************/
/* 学习JX44B0中录放音方法:                                                 */
/* 注意:                                                                   */
/*     1. 程序运行之前请将麦克风和耳机正确插入实验箱中,具体连接方法请      */
/*     阅读用户手册                                                         */
/*     2. 程序运行之前请检查JP2和JP4的跳线是否正确,具体跳线方法请阅读      */
/*     用户手册                                                             */
/*     3. 请确保您所使用的耳机和麦克风能正常使用且其上音量旋钮正常          */
/****************************************************************************/

/* 包含文件 */
#include "def.h"
#include "44b.h"
#include "44blib.h"
#include "iis.h"

/* functions */
void _WrL3Addr(U8 data);
void _WrL3Data(U8 data,int halt);
void BDMA0_Done(void);
void TR_Done(void);

/* defines */
#define L3D			(0x20)				/*GPG5*/
#define L3C			(0x40)				/*GPG6*/
#define L3M			(0x80)				/*GPG7*/

#define TESTSIZE	700000

/* globals */
int intcount = 0;
volatile int Tx_Done;
volatile int Rx_Done;
typedef (*ISR_ROUTINE_ENTRY)(void);
void IsrIRQ() __attribute__ ((interrupt("IRQ")));	/* 声明为中断服务里例程 */

/*****************************************************************************
// Function name	: IsrIRQ
// Description	    : 非矢量方式下中断的查表处理
//					  中断地址表位于0x0c7fff00开始的256字节
// Return type		: void
// Argument         : void
*****************************************************************************/
void IsrIRQ()
{
	int count = 0;
	unsigned int isr_pending;
	unsigned int isr_mask = 0x00000001;
	
	unsigned int isr_mask_set = rINTMSK;
	
	ISR_ROUTINE_ENTRY isr_routine_entry = (ISR_ROUTINE_ENTRY)0x0;
	
	__asm__	(
		"STMFD  	SP!, {r1,r4-r8}	@ SAVE r1,r4-r10 \n"
		"nop \n");
	
	isr_pending = (rINTPND & ~isr_mask_set);
	
	while(isr_mask)
	{
		if(isr_pending&isr_mask)
		{
			isr_routine_entry = (ISR_ROUTINE_ENTRY)(*(int*)(HandleADC+count));
			break;
		}
		
		count+=4;
		isr_mask <<= 1;
	}
	
	if(isr_routine_entry) (*isr_routine_entry)();
	
	__asm__ (
		"LDMFD  	SP!, {r1,r4-r8}	@ RESTORE r1,r4-r10 \n"
		"nop \n");
}

/*****************************************************************************
// Function name	: init_interrupt_handler
// Description	    : 非矢量方式下中断向量表初始化处理
// Return type		: void
// Argument         : irq_handler
//					  中断处理函数入口
*****************************************************************************/
void init_interrupt_handler(unsigned int irq_handler) 
{
	int i;
	
	rINTPND = 0x00000000;							/* 清除所有未决的中断*/
	rI_ISPC = 0x03FFFFFF; 
	
	for( i = 0; i < 256; i+=4)						/* 清除中断表*/
	{
		*(unsigned int*)(_ISR_STARTADDRESS+i) = 0;
	}
	
	*(unsigned int*)(HandleIRQ) = irq_handler;		/* 设置IRQ模式处理函数	*/
}

/*****************************************************************************
// Function name	: install_isr_handler
// Description	    : 非矢量方式下中断向量的安装
// Return type		: void
// Argument         : irq_no, 中断号
//					  irq_routine, 中断处理函数地址
*****************************************************************************/
void install_isr_handler(int irq_no, void* irq_routine)
{
	*(unsigned int*)(irq_no) = (unsigned int)irq_routine;
}

/*****************************************************************************
// Function name	: uda1341_init
// Description	    : UDA1341 初始化函数
// Return type		: void
// Argument         : void
*****************************************************************************/
void uda1341_init(void)
{
    rPDATG = L3M|L3C;					/*L3M=H(start condition)			*/
    									/*L3C=H(start condition)			*/

    /****** L3 Interface ******/
    _WrL3Addr(0x14+2);					/*status (000101xx+10)				*/
    _WrL3Data(0x60,0);					/*0,1,10,000,0 reset,256fs,			*/
										/*no DCfilter,iis					*/
    _WrL3Addr(0x14+2);					/*status (000101xx+10)				*/
    _WrL3Data(0x20,0);					/*0,0,10,000,0 no reset,256fs,		*/
										/*no DCfilter,iis					*/
	_WrL3Addr(0x14+2);					/*status (000101xx+10)				*/
    _WrL3Data(0xe3,0);					/*1,1,1,0,0,0,11 OGS=1,IGS=1,ADC_NI	*/
										/*DAC_NI,sngl speed,AonDon			*/
}

/*****************************************************************************
// Function name	: _WrL3Addr
// Description	    : UDA1341 L3模式地址
// Return type		: void
// Argument         : U8 data
*****************************************************************************/
void _WrL3Addr(U8 data)
{	
    S32 i,j;

    rPDATG &= 0x1F;						/*L3D=L/L3M=L(in address mode)/L3C=L*/
    rPDATG |= L3C;						/*L3C=H								*/

    for(j=0;j<4;j++);					/*tsu(L3) > 190ns					*/

    for(i=0;i<8;i++)					/*LSB first							*/
    {
		if(data&0x1)					/*if data's LSB is 'H'				*/
		{
		    rPDATG &= ~L3C;				/*L3C=L								*/
	    	rPDATG |= L3D;				/*L3D=H								*/
	    	for(j=0;j<4;j++);			/*tcy(L3) > 500ns					*/	
	    	rPDATG |= L3C;				/*L3C=H								*/
	    	rPDATG |= L3D;				/*L3D=H								*/
	    	for(j=0;j<4;j++);			/*tcy(L3) > 500ns					*/
		}
		else							/*if data's LSB is 'L'				*/
		{
		    rPDATG &= ~L3C;				/*L3C=L								*/
		    rPDATG &= ~L3D;				/*L3D=L								*/
	    	for(j=0;j<4;j++);			/*tcy(L3) > 500ns					*/
	    	rPDATG |= L3C;				/*L3C=H								*/
	    	rPDATG &= ~L3D;				/*L3D=L								*/
	    	for(j=0;j<4;j++);			/*tcy(L3) > 500ns					*/
		}
		data >>=1;
    }
    rPDATG=L3C|L3M;						/*L3M=H,L3C=H						*/
}

/*****************************************************************************
// Function name	: _WrL3Data
// Description	    : UDA1341 L3模式数据
// Return type		: void
// Argument         : U8 data
// Argument         : int halt
*****************************************************************************/
void _WrL3Data(U8 data,int halt)
{
    S32 i,j;

    if(halt)
    {
        rPDATG=L3C;						/*L3C=H,while tstp,L3 halt condition*/
        for(j=0;j<4;j++);				/*tstp(L3) > 190ns					*/
    }

    rPDATG=L3C|L3M;						/*L3C,L3M=H(in data transfer mode)	*/
    for(j=0;j<4;j++);					/*tsu(L3)D > 190ns					*/

    for(i=0;i<8;i++)
    {
        if(data&0x1)					/*if data's LSB is 'H'				*/
        {
	    	rPDATG &= ~L3C;				/*L3C=L								*/
            rPDATG |= L3D;				/*L3D=H								*/
            for(j=0;j<4;j++);			/*tcy(L3) > 500ns					*/
            rPDATG |= (L3C|L3D);		/*L3C=H,L3D=H						*/
            for(j=0;j<4;j++);			/*tcy(L3) > 500ns					*/
        }
        else							/*if data's LSB is 'L'				*/
        {
	    	rPDATG &= ~L3C;				/*L3C=L								*/
	    	rPDATG &= ~L3D;				/*L3D=L								*/
            for(j=0;j<4;j++);			/*tcy(L3) > 500ns					*/
            rPDATG |= L3C;				/*L3C=H								*/
	    	rPDATG &= ~L3D;				/*L3D=L								*/
            for(j=0;j<4;j++);			/*tcy(L3) > 500ns					*/
        }
        data>>=1;						/*for check next bit				*/
    }
    rPDATG=L3C|L3M;						/*L3M=H,L3C=H						*/
}

/*****************************************************************************
// Function name	: BDMA0_Done
// Description	    : bdma0 isr
// Return type		: void
// Argument         : void
*****************************************************************************/
void BDMA0_Done(void)
{
    rI_ISPC=BIT_BDMA0;					/*clear pending bit					*/
    intcount++;
}

/*****************************************************************************
// Function name	: TR_Done
// Description	    : TR_Done isr
// Return type		: void
// Argument         : void
*****************************************************************************/
void TR_Done(void)
{
	rI_ISPC=BIT_BDMA0;					/*clear pending bit					*/
	Rx_Done=1;
	Tx_Done=1;
}

/*****************************************************************************
// Function name	: dma_init
// Description	    : DMA 初始化
// Return type		: void
// Argument         : Buf,	 DMA的起始地址
//                    size,  DMA的大小
//					  bplay, 1=放音,0=录音
*****************************************************************************/
void dma_init(unsigned char *Buf, int size, int bplay)
{

⌨️ 快捷键说明

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