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

📄 main.c

📁 这是LPC2300的例程 ZLG的ARM2300开发板带的
💻 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:			Chenmingji
** Created date:		2004-09-16
** Version:				1.0
** Descriptions:		The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:			Litiantian
** Modified date:		2006-01-04
** Version:
** Descriptions:		使用LPC2300系列ARM的SSP DMA,操作SST25VF016B。
********************************************************************************************************/
#include  	"config.h" 

/* 宏定义 */
#define 	FIRSTSEC    	0
#define	    LASTSEC	   	 	499

#define		ADDR			0x2007
#define	    WRBYTES_N		8
#define	    SNDBYTES_N		5

#define 	SRC_RAMBUF		0x7FD00000	// DMA发送操作中源存储区起始地址
#define 	DST_RAMBUF		0x7FD01000	// DMA接收操作中目标存储区起始地址

#define 	SSP0DR_ADDR		0xE0068008	// SSP0的FIFO存储器之地址

/* 全局变量定义 */
uint8 		WrDat[10]  = 	{0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};	// 该数组用以存放要被写入Flash的8个数据,仅由SSTF016B_WR函数访问
uint8		SndBuf[10] = 	{0x0B,0x0,0x20,0x07,0xFF}; 			 		// 该数组用于存放对FLASH的操作信息,仅由SSPDMA_Snd函数访问

/*******************************************************************************************
** 函数名称:SSPDMA_SndIni															
** 功能说明:初始化LPC2300系列ARM SSP DMA发送				
** 入口参数:无
** 出口参数:无																
*******************************************************************************************/
void SSPDMA_SndIni(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;			
	
}

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

   	/* DMA传输启动 */
	DMACC1Configuration |= 0x01;	 	// 使能DMA通道1
   	SSP0DMACR = 0x02;					// 使能SSP0的发送DMA,此时DMA传输启动
    
    /* DMA数据传输中 */
    while ((DMACIntTCStatus & 0x02) == 0);	// 等待通道1传输完毕
    
	/* DMA传输结束 */
   	DMACC1SrcAddr  = SRC_RAMBUF;		// 复位DMA源地址计数器

	/* SSP数据发送 */
    while ( (SSP0SR & 0x10) == 0x10 );	// 等待SSP0 FIFO中的数据发送完毕
}

/********************************************************************************************************
** 函数名称:SSPDMA_RcvIni
** 函数功能:初始化LPC2300系列ARM SSP DMA接收
** 入口参数:无
** 出口参数:无
********************************************************************************************************/
void  SSPDMA_RcvIni(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
}

/*******************************************************************************************
** 函数名称:SSPDMA_Rcv														
** 功能说明:LPC2300系列ARM SSP DMA接收功能。				
** 入口参数:uint8  burstsndN	用户在此处设定要以DMA方式传输的字节数目
**			 uint8* snddatpt	发送数据缓存
** 出口参数:无																
*******************************************************************************************/
void SSPDMA_Rcv(void)
{
	uint32 i = 0;
	
	/* 清空接收FIFO */
	do
    {
	   	i = SSP0DR;							// 读取接收FIFO中的数据
    }
    while ((SSP0SR & 0x04) == 0x04); 		// 接收FIFO为空时,读操作结束
	
	/* 读取Flash返回的数据 */
	for (i = 0; i < 8; i++)		
	{
		SSP0DR = 0xff;   
   		while ( (SSP0SR & 0x10) != 0x10 );	// 等SSP控制器空闲
	}
    
    /* 等待接收FIFO满 */
    while((SSP0SR & 0x08) != 0x08);
    
    /* DMA传输启动 */
	DMACC0Configuration |= 0x01;	 		// 使能DMA通道0
	SSP0DMACR |= 0x01;						// 启动SSP接收DMA
	
    /* DMA传输中 */
	while ((DMACIntTCStatus & 0x01) == 0);	// 等待通道0传输完毕
	
    /* DMA传输结束 */
	DMACC0DestAddr = DST_RAMBUF;	

}

/********************************************************************************************************
** 函数名称:main
** 函数功能:调用软件包,演使用SSP DMA操作SST25VF016B
** 入口参数:无
** 出口参数:返回0则表明出错															
********************************************************************************************************/
int main (void)
{  	
	SSP_Init();								// 初始化SSP管脚以及SSP的工作参数
	PCONP |= 1 << 29;						// 在功率管理寄存器里启用GPDMA				

	SSPDMA_SndIni();						
	SSPDMA_RcvIni();						
//	SSTF016B_Erase(FIRSTSEC,LASTSEC);		// 全片擦除	
//	SSTF016B_WR(ADDR,WrDat,WRBYTES_N);		// 将1~8写入从地址0x2007开始的Flash存储单元里

	CE_Low();			
	SSPDMA_Snd(SNDBYTES_N,SndBuf);
	SSPDMA_Rcv();
	CE_High();
		
	while(1);
    return 0;
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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