📄 main.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 + -