⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 SmartARM2400系列开发板全套资料
💻 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 + -