📄 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 I2S_INT 31
#define DST_RAMBUF 0x7FD00000 // DMA接收操作中源存储区起始地址
#define I2SRCVFIFO 0xE008800C // I2S的发送FIFO寄存器之地址
uint32 I2SRXDone = 0; // 在I2S接收中断里置位,用以指示I2S接收中断是否发生
/*********************************************************************************************************
** 函数名称 :I2SIRQISR
** 函数功能 :接收中断
** 入口参数 :无
** 出口参数 :无
**********************************************************************************************************/
void __irq I2SIRQISR(void)
{
if ((I2SSTATE & 0x01) == 0x01) // 接收中断标志位置位
{
I2SIRQ &= ~(0x01 << 0); // 禁止接收中断,以返回断点
I2SRXDone = 1;
}
VICVectAddr = 0;
}
/*********************************************************************************************************
** 函数名称 :I2SInit
** 函数功能 :初始化I2S接口的发送和接收通道
** 入口参数 :无
** 出口参数 :无
**********************************************************************************************************/
void I2SInit(void)
{
uint32 DAIValue, 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接口的发送位速率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,不使用静音模式
/* 配置中断 */
VICIntEnClr |= ((uint32)1 << I2S_INT);
VICVectPri31 = 0x05;
VICVectAddr31 = (uint32)I2SIRQISR;
VICIntEnable |= ((uint32)1 << I2S_INT);
IRQEnable();
/* RX FIFO 触发深度为4,使能接收中断 */
I2SIRQ = (4 << 8) | (0x01 << 0);
}
/*******************************************************************************************
** 函数名称:I2SDMA_RcvInit
** 功能说明:初始化LPC2300系列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 |= (0 << 26) // 指定源地址不自动增加
| (1 << 27); // 指定目标地址自动增加
I2SDMA1 = (0x01 << 0) | (0x0 << 8); // 使能I2S DMA接收。设置I2S DMA请求的触发深度
/* 初始化结束,使能GPDMA */
DMACConfiguration |= 0x01;
}
/*******************************************************************************************
** 函数名称:I2SDMA_Rcv
** 功能说明:LPC2300系列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)
{
/* I2S接口初始化,I2S DMA接收的相关初始化 */
I2SInit();
I2SDMA_RcvInit();
I2STXFIFO = 0xff00f00f;
while (1)
{
if (1 == I2SRXDone) // 该标志在中断里置位,一旦置位,则表明数据接收完毕
{
I2SDMA_Rcv(1);
break; // 启动DMA接收后则不再查询,直接退出
}
}
while (1);
return (0);
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -