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

📄 main.c

📁 基于zlg SmartARM2300平台的源码
💻 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 
**
**------------------------------------------------------------------------------------------------------
** Created by:			Litiantian
** Created date:		2006-01-04
** Version:				1.0
** Descriptions:		使用LPC2300系列ARM的SSP DMA,操作SST25VF016B。
**
**------------------------------------------------------------------------------------------------------
** Modified by:			liuyanlong
** Modified date:		2007-09-03
** Descriptions:		对代码风格和注释进行了规范、校对
********************************************************************************************************/
#include  	"config.h" 

/* 宏定义 */
#define		GPDMA_INT			25			// GPDMA中断通道号

#define 	FIRSTSEC    		0
#define	    LASTSEC	   	 		499

#define		ADDR				0x2007
#define	    WRBYTES_N			8

#define 	SRC_RAMBUF			0x7FD00000	// DMA发送操作中源存储区起始地址
#define 	DST_RAMBUF			0x7FD01000	// DMA接收操作中目标存储区起始地址
#define 	SSP0DR_ADDR			0xE0068008	// SSP0的FIFO存储器之地址
								
								/*  等待发送FIFO为空                  等SSP控制器空闲      */	
#define		WaitSSPSndEnd()		while ((SSP0SR & 0x01) == 0);	while ((SSP0SR & 0x10) == 0x10)								

								/* 等待SSP接收FIFO满 */
#define		WaitRcvFIFOFUL()	while ((SSP0SR & 0x08) != 0x08)

/* 全局变量定义 */
uint8	InitDatas[8] 			= {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};

uint8	RdCmdBuf[5] 			= {0x0B, 0x0, 0x20, 0x07, 0xFF}; 			 		// 该数组用于存放对FLASH的读操作初始化信息,仅由SSPDMA_Snd函数访问,发送完这组数据后,Flash进入读数据状态
uint8	WaitCmdbuf[8]   		= {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};	// 每发送一个0xff到Flash,Flash会返回一个数据

/*******************************************************************************************
** 函数名称:SSPDMA_SndInit
** 功能说明:初始化LPC2300系列ARM SSP DMA发送
** 入口参数:无
** 出口参数:无
*******************************************************************************************/
void SSPDMA_SndInit(void)
{
	/* 初始化DMA传输流 */
	DMACC1LLI	   		 = 0;					// 下一个链表项无效,本次DMA传输流使用连续存储空间
	DMACC1Configuration |= (0x01 << 11);		// 初始化流的源和目标为从存储器到外设,以及流控制器为DMA控制器
	DMACC1Control   	|= (0x02 << 12)			// 指定源突发传输大小为8位
						|  (0x00 << 18);		// 指定源传输数据宽度为8位
	DMACC1Control   	|= 0x80000000;			// 配置传输流的中断,使能通道1的终端计数中断
	DMACC1Configuration |= 0x00008000;			// 不对通道1的终端计数中断进行屏蔽

	/* 初始化源和目标 */
	DMACC1SrcAddr   	 = SRC_RAMBUF;			// 设置DMA的源为USB的RAM区
	DMACC1DestAddr  	 = SSP0DR_ADDR;			// 设置DMA传输目标为SSP0的FIFO
	DMACC1Control  		|= (1 << 26)			// 指定源地址自动增加
				   		|  (0 << 27);			// 指定目标地址不自动增加

	/* 初始化结束,使能GPDMA */
	DMACConfiguration   |= 0x01;	
	
	/* 使能SSP 发送DMA */
   	SSP0DMACR = 0x02;					
}

/*******************************************************************************************
** 函数名称:SSPDMA_Snd														
** 功能说明:LPC2300系列ARMSSP DMA发送功能。				
** 入口参数:uint8  burstsndN	用户在此处设定要以DMA方式传输的字节数目
**			 uint8* snddatpt	发送数据缓存
** 出口参数:无																
*******************************************************************************************/
void SSPDMA_Snd(uint8 burstsndN, uint8* snddatpt)
{
   	uint32	i = 0;   	
   	
    /* DMA传输启动前,将数据送入DMA发送操作中的源存储区 */ 	
   	for (i = 0; i < burstsndN; i++)
   	{
   		(*(uint8*)(SRC_RAMBUF + i)) = snddatpt[i];
	}
   	DMACC1Control   	|= burstsndN;			// 指定突发传输次数

   	/* DMA传输启动 */
	DMACC1Configuration |= 0x01;	 			// 使能DMA通道1
}

/********************************************************************************************************
** 函数名称:SSPDMA_RcvInit
** 函数功能:初始化LPC2300系列ARM SSP DMA接收
** 入口参数:无
** 出口参数:无
********************************************************************************************************/
void  SSPDMA_RcvInit(void)
{  
	/* 初始化DMA传输流 */
	DMACC0LLI	   		 = 0;		
	DMACC0Configuration |= (0x01 << 12)			// 指定数据从外设传输到存储器,DMA为流控制器	
						|  (0x01 << 1);			// 指定DMA源请求外设为SSP0的接收FIFO
						
	DMACC0Control   	|= 0x08					// 指定突发传输次数为8
						| (0x02 << 12)			// 指定源突发的传输大小为8位
						| (0x00 << 18)			// 指定源传输数据宽度为8位
						| 0x80000000		
						| (0 << 26)				// 指定源地址不自动增加
						| (1 << 27);			// 指定目标地址自动增加	
   			   	
	DMACC0Configuration |= 0x00008000;	

	DMACC0SrcAddr  		 = SSP0DR_ADDR;	
	DMACC0DestAddr 		 = DST_RAMBUF;	

	DMACConfiguration   |= 0x01;	 			// 使能DMA
	
	SSP0DMACR 		    |= 0x01;				// 使能SSP接收DMA		
}

/********************************************************************************************************
** 函数名称:GPDMA_ISR
** 函数功能:GPDMA中断服务函数
** 入口参数:无
** 出口参数:无											
********************************************************************************************************/
void __irq  GPDMA_ISR(void)
{
	if ((DMACIntStatus & 0x01) != 0)			// 通道0,接收通道
	{
		if ((DMACIntTCStatus & 0x01) != 0)		// 计数中断
		{
			DMACC0DestAddr = DST_RAMBUF;		// 复位DMA目的地址计数器			
			DMACIntTCClear = 0x01;
		}

	}
	
	if ((DMACIntStatus & 0x02) != 0)			// 通道1,发送通道
	{
		if ((DMACIntTCStatus & 0x02) != 0)		// 计数中断
		{
			DMACC1SrcAddr  = SRC_RAMBUF;		// 复位DMA源地址计数器
			DMACIntTCClear = 0x02;
		}
	}
	VICVectAddr = 0x00;
}

/*********************************************************************************************************
** 函数名称: GPDMA_IRQIni
** 功能描述: 进行向量IRQ初始化操作
** 入口参数:无
** 出口参数:无															
********************************************************************************************************/
void GPDMA_IRQIni(void)
{	
	VICIntEnClr  |= (1 << GPDMA_INT);			
	VICVectPri25  = 0x06;					
	VICVectAddr25 = (uint32)GPDMA_ISR;		
	VICIntEnable |= (1 << GPDMA_INT);			
	IRQEnable();			
}

/*********************************************************************************************************
** 函数名称: Clr_RcvFIFO
** 功能描述: 清空SSP接收FIFO
** 入口参数:无
** 出口参数:无															
********************************************************************************************************/
void Clr_RcvFIFO(void)
{	
	volatile  uint8  tmp = 0;
	
	do
	{
		tmp = SSP0DR;
	}
	while ((SSP0SR & 0x04) == 0x04);				
}	
					
/********************************************************************************************************
** 函数名称:main
** 函数功能:调用软件包,演示使用SSP DMA操作SST25VF016B
** 入口参数:无
** 出口参数:返回0则表明出错	
** 调试说明:在Flash中运行														
********************************************************************************************************/
int main(void)
{  	
	PCONP |= 1 << 29;							// 在功率管理寄存器里启用GPDMA				

	/* 完成SSP和GPDMA的初始化 */
	SSP_Init();									// 初始化SSP管脚以及SSP的工作参数
	SSPDMA_SndInit();							// 通道1作发送通道	
	SSPDMA_RcvInit();							// 通道0作接收通道
	GPDMA_IRQIni();								// 在VIC里初始化DMA中断
	
	/* 准备好将从Flash读出的数据1~8 */
	SSTF016B_Erase(FIRSTSEC, LASTSEC);			// 全片擦除	
	SSTF016B_WR(ADDR, InitDatas, WRBYTES_N);	// 将1~8写入从地址0x2007开始的Flash存储单元里

	/* 						中断方式下DMA发送和接收 										*/
	SSTF016B_CELow();									
	
	/* 中断方式DMA发送 */
	SSPDMA_Snd(sizeof(RdCmdBuf), RdCmdBuf);		// DMA将读操作初始化信息传输至SSP 发送FIFO,在此处观察SRC_RAMBUF的内容

	WaitSSPSndEnd();							// 等待SSP发送结束,发送结束后,Flash进入读操作状态
	Clr_RcvFIFO();								// 清空SSP接收FIFO
				
	/* 中断方式DMA接收 */
	SSPDMA_Snd(sizeof(WaitCmdbuf), WaitCmdbuf);	// 发送等待信息,以读取Flash数据
	WaitRcvFIFOFUL();    						// 等待接收FIFO满,接收FIFO满了后即启动DMA接收
	
	DMACC0Configuration |= 0x01;				// 启动DMA通道0
	
	SSTF016B_CEHigh();	

	while (1);
    return (0);
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -