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

📄 main.c

📁 SmartARM2400系列开发板全套资料
💻 C
字号:
/****************************************Copyright (c)****************************************************
**                         Guangzhou ZHIYUAN electronics Co.,LTD.                               
**                                     
**                               http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2004-09-16
** Last Version:		1.0
** Descriptions:		The main() function example template
**
**--------------------------------------------------------------------------------------------------------
** Created by:			Chenmingji
** Created date:		2004-09-16
** Version:				1.0
** Descriptions:		The original version
**
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
*********************************************************************************************************/
#include "main.h"

#define  I2S_INT		31
#define  DST_RAMBUF		0x7FD00000	                                    /* DMA接收操作中源存储区起始地址*/
#define  I2SRCVFIFO		0xE008800C	                                    /* I2S的接收FIFO寄存器之地址    */

volatile uint32   I2SRXDone = 0;                                        /* 在I2S接收中断里置位          */
                                                                        /* 用以指示I2S接收中断是否发生  */

void I2SDMA_Rcv(uint8  burstsndN);

/*********************************************************************************************************
** 函数名称 :I2SIRQISR
** 函数功能 :接收中断
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void __irq I2SIRQISR(void) 
{
  	if ((I2SSTATE & 0x01) == 0x01){					                    /* 接收中断标志位置位            */
		I2SIRQ   &= ~(0x01 << 0);					                    /* 禁止接收中断,以返回断点      */
		I2SRXDone = 1;								
	}
    VICVectAddr = 0;										
}

/*********************************************************************************************************
** 函数名称 :I2SInit
** 函数功能 :初始化I2S接口的发送和接收通道
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void I2SInit(void) 
{
    unsigned long  DAIValue,DAOValue;
	PCONP  |= 1 << 27;	  								                /* 在PCONP中使能I2S接口          */
	

	
	PINSEL0 = 0x00055500;                                               /* 初始化P0.4-P0.9为I2S接口引脚  */
	
	/* 
	 *  I2S接口的位速率 = 采样率 * 声音的通道数 * 所产生声音数据的位数 
	 *  在本例中,设置I2S_BitRate = 48KHz * 1 * 32 = 1.536MHz 
	 */
	I2STXRATE = 0x13; 										            /* I2S接口的发送位速率           */
	                                                                    /* I2S_BitSndRate                */
	                                                                    /* = Fpclk / (TXRATE + 1)        */
	I2SRXRATE = 0x13;										            /* I2S接口的接收位速率           */
	                                                                    /* I2S_BitRcvRate                */
	                                                                    /* = Fpclk / (RXRATE + 1)        */

	/*      
	 *  设置音频输出通道的工作模式      
	 */
	DAOValue  = I2SDAO;								
	DAOValue &= ~((0x01 << 5) | (0x01 << 15));				            /* 设置输出通道为主模式,         */
	                                                                    /* 不使用静音模式                */
	I2SDAO    =  (0x01 << 4) | (0x01 << 3) | DAOValue;		            /* 异步复位音频输出通道和FIFO,   */
	                                                                    /* 禁止访问FIFO                  */
    I2SDAO   |= 0x01 << 2;                                              /* 单声道模式,                  */
                                                                        /* 采样周期默认为64个I2S_CLK     */
    I2SDAO   |= 0x03;                                                   /* 数据帧宽度为32位              */
  
    /*     
     *  设置音频输入通道的工作模式      
     */
   	DAIValue  = I2SDAI;								
	DAIValue |= 0x01 << 5;				                                /* 设置输入通道为从模式          */
	I2SDAI    = (0x01 << 4) | (0x01 << 3) | DAIValue;		            /* 异步复位音频输入通道和FIFO,   */
	                                                                    /* 禁止访问FIFO                  */
    I2SDAI   |= 0x01 << 2;                                              /* 单声道模式,                  */
                                                                        /* 采样周期默认为64个I2S_CLK     */
    I2SDAI   |= 0x03;                                                   /* 数据帧宽度为32位              */
    
   	/*  
   	 *  完成工作模式设置后,进行复位  
   	 */
	DAOValue = I2SDAO;
	DAIValue = I2SDAI;														
	I2SDAO 	 = DAOValue & (~((0x01 << 4) | (0x01 << 3)));	            /* 停止复位,使能发送FIFO,        */
	                                                                    /* 不使用静音模式                */
	I2SDAI   = DAIValue & (~((0x01 << 4) | (0x01 << 3)));	            /* 停止复位,使能接收FIFO,        */
	                                                                    /* 不使用静音模式                */
	
	/*             
	 *  配置中断             
	 */
	vicIrqFuncSet(I2S_INT, 0x05, (uint32)I2SIRQISR);			
	IRQEnable();	
	
	/* 
	 *  RX FIFO 触发深度为4,使能接收中断 
	 */
	I2SIRQ 	 = (4 << 8) | (0x01 << 0);
}


/*********************************************************************************************************
** 函数名称:I2SDMA_RcvInit															
** 功能说明:初始化LPC2400系列ARM I2S DMA接收				
** 入口参数:无
** 出口参数:无																
*********************************************************************************************************/
void I2SDMA_RcvInit(void)
{
   	PCONP |= 1 << 29;						                            /* 在功率管理寄存器里启用GPDMA   */
	DMACIntTCClear |= 0x03;                                             /* 清除终端计数中断的标志        */
	
	/* 
	 *  初始化DMA传输流 
	 */
	DMACC1LLI	   = 0;						                            /* 下一个链表项无效,本次DMA传   */
	                                                                    /* 输流使用连续存储空间          */
	DMACC1Configuration |= (0x02 << 11)	                                /* 初始化流的方向是为从外设到存  */
	                                                                    /* 储器,以及流控制器为DMA控制器  */
	                    |  (0x05 << 1)                                  /* 指定DMA传输的源是I2S          */
	                    |  (0x00 << 6);                                 /* 指定DMA传输的目标是存储器     */
	
	DMACC1Control   	|= (0x04 << 12)		                            /* 指定源突发传输大小为32位      */
						|  (0x04 << 15)                                 /* 指定目的突发传输大小为32位    */
						|  (0x02 << 18)                                 /* 指定源传输数据宽度为32位      */
	                    |  (0x02 << 21);                                /* 指定目标传输数据宽度为32位    */
	                    
	DMACC1Control   	|= 0x80000000;		                            /* 配置传输流的中断,             */
	                                                                    /* 使能通道1的终端计数中断       */
	DMACC1Configuration |= 0x00008000;		                            /* 不对通道1的终端计数中断进行   */
	                                                                    /* 屏蔽                          */

	/* 
	 *  初始化源和目标 
	 */
	DMACC1SrcAddr  		 = I2SRCVFIFO;		                            /* 设置DMA的源为I2S接收FIFO      */
	DMACC1DestAddr 		 = DST_RAMBUF;		                            /* 设置DMA传输目标为I2S USB RAM区*/
	DMACC1Control  		|= (1 << 26)		                            /* 指定源地址不自动增加          */
				   		|  (1 << 27);		                            /* 指定目标地址自动增加          */

    I2SDMA1 = (0x01 << 0) | (0x0 << 8);                                 /* 使能I2S DMA接收。             */
                                                                        /* 设置I2S DMA请求的触发深度     */

	DMACConfiguration   |= 0x01;		                                /* 初始化结束,使能GPDMA          */	
	
}

/*********************************************************************************************************
** 函数名称:I2SDMA_Rcv													
** 功能说明:LPC2400系列ARM I2S DMA接收功能。				
** 入口参数:burstsndN	用户在此处设定要以DMA方式传输的字节数目
** 出口参数:无																
*********************************************************************************************************/
void I2SDMA_Rcv(uint8  burstsndN)
{

   	DMACC1Control   	|= burstsndN;		                            /* 指定突发传输次数              */

   	/* 
   	 * DMA传输启动 
   	 */
	DMACC1Configuration |= 0x01;	 		                            /* 使能DMA通道1                  */
    
    /* 
     *  DMA数据传输中 
     */
    while ((DMACIntTCStatus & 0x02) == 0);	                            /* 等待通道1传输完毕             */
    
	/* 
	 *  DMA传输结束
	 */
   	DMACC1DestAddr  = DST_RAMBUF;			                            /* 复位DMA源地址计数器           */
}

/*********************************************************************************************************
** 函数名称:main
** 函数功能:演示I2S查询方式DMA接收数据。
** 入口参数:无
** 出口参数:返回0则表明出错
** 说    明:在AXD里观察0x7FD00000,对比DMA传输启动前后该地址的数据
*********************************************************************************************************/
int main(void)
{  	
    
	
	I2SInit();						                                    /* I2S接口初始化                 */                              
    I2SDMA_RcvInit();                                                   /* I2S DMA接收的相关初始化       */
   
    I2STXFIFO = 0xff00f00f;
   	while (1){
   	    if (I2SRXDone == 1) {                                           /* 该标志在中断里置位,一旦置位  */
   	                                                                    /* 则表明数据接收完毕            */
   	        I2SDMA_Rcv(1);
   	        break;                                                      /* 启动DMA接收后则不再查询       */
   	                                                                    /* 直接退出                      */
   	    }
   	}
   	
   	while (1);
    return (0);
}

/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

⌨️ 快捷键说明

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