📄 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 BUFSIZE 0x20
#define RXFIFO_EMPTY 0
#define TXFIFO_FULL 8
#define I2SIN_STOP() (I2SDAI |= (0x01 << 3))
#define I2SIN_EN() (I2SDAI &= (~((0x01 << 4) | (0x01 << 3))))
volatile uint8 I2STXBuffer[BUFSIZE];
volatile uint8 I2SRXBuffer[BUFSIZE];
volatile uint32 I2SReadLength = 0; /* 已读入内存的FIFO数据个数 */
volatile uint32 I2SWriteLength = 0;
volatile uint32 I2SRXDone = 0, I2STXDone = 0; /* I2SRXDone为1时表明接收处理完 */
/* 毕,I2STXDone为1时表明发送处 */
/* 理完毕 */
/**********************************************************************************************************
** 函数名称 :I2SIRQISR
** 函数功能 :接收中断
** 入口参数 :无
** 出口参数 :无
***********************************************************************************************************/
void __irq I2SIRQISR(void)
{
unsigned long RxCount = 0; /* 计数RX_FIFO里还需接收的数据个数*/
if ((I2SSTATE & 0x01) == 0x01) /* 接收中断标志位置位 */
{
RxCount = (I2SSTATE >> 8) & 0xFF; /* I2SSTATE的15:8位段为接收FIFO所 */
/* 接收到的字符数 */
while (1)
{
if ((RxCount != RXFIFO_EMPTY) && (I2SRXDone == 0))
{
if (I2SReadLength == BUFSIZE)
{
I2SDAI |= ((0x01 << 3) | (0x01 << 4)); /* 音频输入通道停止 */
I2SIRQ &= ~(0x01 << 0); /* 禁止接收中断 */
I2SRXDone = 1;
}
else
{
I2SRXBuffer[I2SReadLength++] = (unsigned char)I2SRXFIFO;
RxCount--;
}
}
else
{
break;
}
}
}
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 = 采样率Sample rate * 声音的通道数 CHn * 所产生声音数据的位数BITn
* 在本例中,设置I2S_BitRate = 48kHz * 2 * 16 =1.536Mhz
*/
I2STXRATE = 0x13; /* I2S接口的发送位速率 */
I2SRXRATE = 0x13; /* I2S接口的接收位速率 */
/*
* 设置音频通道的工作模式
*/
DAOValue = I2SDAO;
DAOValue &= ~((0x01 << 5) | (0x01 << 15)); /* 设置输出通道为主模式,不使用静*/
/* 音模式,发送数据宽度、数据格式*/
/* WS周期皆为上电复位时的默认值 */
I2SDAO = (0x01 << 4) | (0x01 << 3) | DAOValue; /* 异步复位音频输出通道和FIFO,禁 */
/* 止访问FIFO,同时将输出通道置于 */
/* 静音模式 */
DAIValue = I2SDAI; /* 设置输入通道为从模式,发送数据*/
/* 宽度、数据格式、WS周期皆为上电*/
/* 复位时的默认值 */
/*
* 完成工作模式设置的同时进行复位
*/
I2SDAI = (0x01 << 4) | (0x01 << 3) | DAIValue; /* 异步复位音频输入通道和FIFO */
/*
* 配置中断
*/
/* RX FIFO 触发深度为8, */
/* 使能接收中断 */
/*
* 设置音频通道的工作模式后,复位
*/
DAOValue = I2SDAO;
DAIValue = I2SDAI;
I2SDAO = DAOValue & (~((0x01 << 4) | (0x01 << 3))); /* 停止复位,使能发送FIFO, */
I2SDAI = DAIValue & (~((0x01 << 4) | (0x01 << 3))); /* 停止复位,使能接收FIFO */
/* 不使用静音模式 */
I2SIN_STOP();
VICIntEnClr |= ((uint32)1 << I2S_INT);
VICVectPri31 = 0x05;
VICVectAddr31 = (uint32)I2SIRQISR;
VICIntEnable |= ((uint32)1 << I2S_INT);
IRQEnable();
I2SIRQ = (8 << 8) | (0x01 << 0);
}
/*********************************************************************************************************
** 函数名称 :I2S_BufInit
** 函数功能 :初始化I2S的发送和接收Buffer
** 入口参数 :无
** 出口参数 :无
**********************************************************************************************************/
void I2S_BufInit(void)
{
uint32 i = 0;
for (i = 0; i < BUFSIZE; i++) /* 初始化缓存 */
{
I2STXBuffer[i] = (unsigned char)i;
I2SRXBuffer[i] = 0;
}
}
/*********************************************************************************************************
** 函数名称 :I2S_FIFOTX
** 函数功能 :将I2S的发送BUFFER里的数据通过FIFO发送出去
** 入口参数 :无
** 出口参数 :无
**********************************************************************************************************/
void I2S_FIFOTX(void)
{
uint32 i; /* 送FIFO现有的数据个数 */
I2STXFIFO = (uint32)I2STXBuffer[I2SWriteLength++]; /* 屏蔽掉静音的数据 */
for (i = 0;i < 5000;i++); /* 根据CPU频率调整延时参数 */
I2SIN_EN();
while (I2SWriteLength < BUFSIZE) /* 若数据尚未发送完,则继续发送 */
{
while (((I2SSTATE >> 16) & 0xFF) == TXFIFO_FULL); /* I2SSTATE里的23~16位段存储发 */
I2STXFIFO = (uint32)I2STXBuffer[I2SWriteLength++];
}
I2STXDone = 1;
}
/*********************************************************************************************************
** 函数名称 :I2S_TXRXCOMP
** 函数功能 :比较发送和接收的内容。若不相等则进入死循环
** 入口参数 :无
** 出口参数 :无
**********************************************************************************************************/
void I2S_TXRXCOMP(void)
{
uint32 i = 0;
for (i = 0; i < BUFSIZE; i++) { /* 开始比较 */
if (I2SRXBuffer[i] != I2STXBuffer[i]){
while (1); /* 一旦校验出错,则死循环 */
}
}
}
/*********************************************************************************************************
** 函数名称 :main
** 函数功能 :直接连接I2S的发送通道和接收通道,完成通讯实验
** 入口参数 :无
** 出口参数 :无
** 调试说明 :本实验是将TX通道和RX通道之间的CLK, WS, SDA线直接相连.DAO作为主机, DAI作为从机.由于同步的问题
** ,TX通道在RX通道尚未就绪时会发送一些MUTE数据0,所以在RX FIFO里可能存在一些无效的MUTE数据0,所以
** 在比较TX和RX FIFO里的数据之前,需要先将RX里的头一小部分数据丢弃
**********************************************************************************************************/
int main(void)
{
I2SReadLength = 0;
I2SWriteLength = 0;
I2SRXDone = 0;
I2STXDone = 0;
I2SSTATE = 0;
I2S_BufInit(); /* 初始化I2S发送缓存的初值, */
/* 清零I2S接收缓存 */
I2SInit();
I2S_FIFOTX(); /* I2STXBuffer内的数据发送完毕 */
while (!I2SRXDone || !I2STXDone); /* 等待发送和接收都处理完毕 */
I2S_TXRXCOMP(); /* 比较发送和接收的内容,若不相同*/
/* 则进入死循环 */
while (1);
return (0);
}
/*********************************************************************************************************
END FILE
**********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -