📄 main.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 SRC_RAMBUF 0x7FD00000 /* DMA发送操作中源存储区起始地址*/
#define I2SSNDFIFO 0xE0088008 /* I2S的发送FIFO寄存器之地址 */
/*********************************************************************************************************
** 函数名称 :I2SInit
** 函数功能 :初始化I2S接口的发送通道
** 入口参数 :无
** 出口参数 :无
**********************************************************************************************************/
void I2SInit(void)
{
unsigned long DAOValue;
PCONP |= 1 << 27; /* 在PCONP中使能I2S接口 */
PINSEL0 = 0x00055500; /* 初始化P0.4-P0.9为I2S接口引脚 */
/*
* 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
** 功能说明:初始化LPC2400系列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
** 功能说明:LPC2400系列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 FILE
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -