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

📄 main.c

📁 这是周立功开发板上的实验程序,这是周立功开发板上的实验程序
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.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:			Litiantian
** Created date:		2007-10-25
** Version:				1.0
** Descriptions:		I2S DMA发送操作演示
** Rechecked by:        Litiantian
**
********************************************************************************************************/
#include "config.h"

#define  SRC_RAMBUF		0x7FD00000	                        // DMA发送操作中源存储区起始地址
#define  I2SSNDFIFO		0xE0088008	                        // I2S的发送FIFO寄存器之地址


/*********************************************************************************************************
** 函数名称 :I2SInit
** 函数功能 :初始化I2S接口的发送通道
** 入口参数 :无
** 出口参数 :无
**********************************************************************************************************/
void I2SInit(void) 
{
	uint32 DAOValue;

	PCONP  |= 1 << 27;	  								    // 在PCONP中使能I2S接口

	/* 初始化P0.6-P0.9、P0.23、P0.24为I2S接口引脚 */
	PINSEL0 = 0x00055000;
	PINSEL1 = 0x00028000;

	/* I2S接口的位速率 = 采样率 * 声音的通道数 * 所产生声音数据的位数 */
	/* 在本例中,设置I2S_BitRate = 48KHz * 1 * 32 = 1.536MHz */
	I2STXRATE = 0x13; 										// I2S接口的发送位速率 = Fpclk / (TXRATE + 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位    
  
	/* 	 设置音频通道的工作模式后,复位 	*/
	DAOValue = I2SDAO;
	I2SDAO 	 = DAOValue & (~((0x01 << 4) | (0x01 << 3)));	// 停止复位,使能发送FIFO
}

/*******************************************************************************************
** 函数名称:I2SDMA_SndInit															
** 功能说明:初始化LPC2300系列ARM I2S DMA发送				
** 入口参数:无
** 出口参数:无																
*******************************************************************************************/
void I2SDMA_SndInit(void)
{
   	PCONP |= 1 << 29;						// 在功率管理寄存器里启用GPDMA				

	DMACIntTCClear |= 0x03;                 // 清除终端计数中断的标志
	
	/* 初始化DMA传输流 */
	DMACC1LLI	   = 0;						// 下一个链表项无效,本次DMA传输流使用连续存储空间
	DMACC1Configuration |= (0x01 << 11)	    // 初始化流的源和目标为从存储器到外设,以及流控制器为DMA控制器
	                    |  (0x05 << 6);     // 指定I2S的发送FIFO为DMA传输的目标
	
	
	DMACC1Control   	|= (0x04 << 12)		// 指定源突发传输大小为32位
						|  (0x04 << 15)     // 指定目的突发传输大小为32位
						|  (0x02 << 18)     // 指定源传输数据宽度为32位
	                    |  (0x02 << 21);    // 指定目标传输数据宽度为32位
	                    
	DMACC1Control   	|= 0x80000000;		// 配置传输流的中断,使能通道1的终端计数中断
	DMACC1Configuration |= 0x00008000;		// 不对通道1的终端计数中断进行屏蔽

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

    I2SDMA1 = (0x01 << 1) | (0x01 << 16);   // 使能I2S DMA发送。设置I2S DMA请求的触发深度    

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

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

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

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

	/* I2S数据发送 */
    while (((I2SSTATE >> 16) & 0xff) != 0);	// 等待I2S FIFO里的数据发送完毕
}

/********************************************************************************************************
** 函数名称:main
** 函数功能:演示I2S查询方式DMA发送数据。
** 入口参数:无
** 出口参数:返回0则表明出错
** 说    明:用逻辑分析仪观察I2S发送通道总线,看是否会出现0xffffffff、0xffff0000、0x0000ffff、0的数据
********************************************************************************************************/
int main(void)
{  	
    /* 初始化源存储区的内容。将有4个字通过DMA传输至I2S 发送FIFO */
    *(uint32*)(SRC_RAMBUF)      = 0xffffffff;
    *(uint32*)(SRC_RAMBUF + 4)  = 0xffff0000;
    *(uint32*)(SRC_RAMBUF + 8)  = 0x0000ffff;
    *(uint32*)(SRC_RAMBUF + 12) = 0x00000000;
    
	/* I2S接口初始化,I2S DMA发送的相关初始化 */
	I2SInit();						        // 初始化I2S的发送通道。包括工作模式及引脚等
    I2SDMA_SndInit();                       // 初始化I2S的DMA接口、GPDMA控制器,为DMA传输作准备

    I2SDMA_Snd(4);                          // DMA方式传输4个字到I2S 发送FIFO
    while (1);
      	
    return (0);
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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