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