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

📄 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:
**
*********************************************************************************************************/

/********************************************************************************************************
* 文 件 名:main.c
* 功    能:对SST39VF1601进行全片擦除,然后写两字节数据到芯片0地址,再读出来校验,
*           若校验通过则蜂鸣器响一声,否则不断地蜂鸣报警。
* 说    明:需将跳线P3.30和BEEP短接。
*********************************************************************************************************/
#include "main.h"

#define	 BEEPCON  1<<30					                                /* P3.30引脚控制B1,低电平蜂鸣   */
#define  FLASH_ADDR		0x81000000  	                                /* FLASH的起始地址(分配为Bank1块)*/


/********************************************************************************************************
* 转换地址。将要发送给SST39VF1601的地址值进行转换,以便于LPC2210输出。
* 由于SST39VF1601的A0是与LPC2470的A1相连,所以addr要左移1位。
*********************************************************************************************************/
#define  GetAddr(addr)	(volatile uint16  *)(FLASH_ADDR|(addr<<1))


/********************************************************************************************************
* 名    称:DelayNS()
* 功    能:长软件延时。
* 入口参数:dly		延时参数,值越大,延时越久
* 出口参数:无
*********************************************************************************************************/
void  DelayNS(uint32  idly)
{  
    uint32  i;
    for(; idly>0; idly--) 
    {
        for(i=0; i<5000; i++);
    }
}



/*********************************************************************************************************
* 名    称:WordProgram()
* 功    能:半字(16位)数据编程。
* 入口参数:Addr		编程地址(SST39VF1601内部地址)	
*           Data		编程数据
* 出口参数:返回TRUE表示操作成功,返回FALSE表示操作失败
**********************************************************************************************************/
uint8  WordProgram(uint32 iAddr, uint16 iData) 
{  
    volatile uint16  *ipTmp;
    uint16  itemp1,itemp2;

    ipTmp = GetAddr(0x5555);	                                        /* 转换地址0x5555                */
    ipTmp[0] = 0xaaaa;			                                        /* 第一个周期,地址0x5555,数据0xAA*/
    ipTmp = GetAddr(0x2aaa);
    ipTmp[0] = 0x5555;			                                        /* 第二个周期,地址0x2aaa,数据0x55*/
    ipTmp = GetAddr(0x5555);
    ipTmp[0] = 0xa0a0;			                                        /* 第三个周期,地址0x5555,数据0xA0*/
    
    ipTmp = (volatile uint16  *)(FLASH_ADDR|(iAddr&0x1FFFFF));
    *ipTmp = iData;				                                        /* 第四个周期,地址Addr,数据Data  */
   
   /*
    *  等待操作完成 (若编程操作没有完成,每次读操作DQ6会跳变)
    */
    while (1) { 
        itemp1 = *ipTmp;			
        itemp2 = *ipTmp;
        if (itemp1 == itemp2) {  
            if (itemp1 != iData) {  
                return(FALSE);
            }
            else { 
                return(TRUE);
            }
        }
    }
    return(TRUE);
}

/*********************************************************************************************************
* 名    称:ChipTmpErase()
* 功    能:芯片全片擦除。
* 入口参数:无
* 出口参数:返回TRUE表示操作成功,返回FALSE表示操作失败
**********************************************************************************************************/
uint8  ChipErase(void) 
{  
    volatile uint16  *ipTmp;
    uint16  itemp1,itemp2;

    ipTmp = GetAddr(0x5555);
    ipTmp[0] = 0xaaaa;			                                        /* 第一个周期,地址0x5555,数据0xAA*/
    ipTmp = GetAddr(0x2aaa);
    ipTmp[0] = 0x5555;			                                        /* 第二个周期,地址0x2aaa,数据0x55*/
    ipTmp = GetAddr(0x5555);
    ipTmp[0] = 0x8080;			                                        /* 第三个周期,地址0x5555,数据0x80*/
    ipTmp = GetAddr(0x5555);
    ipTmp[0] = 0xaaaa;			                                        /* 第四个周期,地址0x5555,数据0xAA*/
    ipTmp = GetAddr(0x2aaa);
    ipTmp[0] = 0x5555;			                                        /* 第五个周期,地址0x2aaa,数据0x55*/
    ipTmp = GetAddr(0x5555);
    ipTmp[0] = 0x1010;			                                        /* 第六个周期,地址0x5555,数据0x10*/
    
    /* 
     *  等待操作完成 (若擦除操作没有完成,每次读操作DQ6会跳变) 
     */
    while (1)				
    {  
        itemp1 = *ipTmp;
        itemp2 = *ipTmp;
        if (itemp1 == itemp2)
        {  
            if (itemp1 != 0xffff)
            {  
                return(FALSE);
            }
            else
            {  
                return(TRUE);
            }
        }
    }
    return(TRUE);
}

/**********************************************************************************************************
** 函数名称 :main()
** 函数功能 :用P3.30控制BEEP,让BEEP鸣叫。
** 调试说明 :需将跳线P3.30和BEEP短接。
**********************************************************************************************************/
int main (void){
    uint8  i;
    uint8  ierr = 0;
   
    volatile uint16  *ipAddr;
	
	/*  
	 *  Edit for LPC2460/70
     *  配置外部总线访问SST36VF1601C
     *  的速度,其中,将读取速度
     *  配置为最快,写速度配置为最快 	
     */
    
    PINSEL6          = 0x55555555;              						/* 配置外部总线D0~D15  	        */
    PINSEL8          = 0x55555554;										/* 配置外部总线A1~A15  	        */
    PINSEL9          = 0x40050155;              						/* 配置外部总线A16~A20,OE,WE,CS1*/

    EMCControl       = 0x01;											/* 使能外部EMC,禁止镜像        */
    EMCStaticConfig1 = 0x00000081;              						/* 配置外部总线,16bit宽度 	    */ 
	EMCStaticWaitRd1 = 4;												/* 配置外部总线,读延时5cclk 	*/ 
	EMCStaticWaitOen1  = 0x01;											/* 输出使能延时1cclk 			*/ 
	
	EMCStaticWaitWen1  = 0x00;											/* 写使能延时1cclk 			    */ 
	EMCStaticWaitWr1   = 0x02;	



    PINSEL7 = 0x00000000;			                                    /* 设置管脚连接GPIO             */
    FIO3DIR = BEEPCON; 				                                    /* 设置I/O为输出                */
    FIO3SET = BEEPCON;				                                    /* BEEPCON = 0                  */
    
    ChipErase();					                                    /* FLASH全片擦除                */
   
    /* 
     *  校验是否真正擦除。若发现有非0xFFFF的存储单元,设置ierr=1  
     */
    ipAddr = (volatile uint16  *)FLASH_ADDR + 0;
    for(i=0; i<100; i++) { 
        if(0xFFFF != (*ipAddr)) ierr = 1;
        ipAddr++;
    }
    
    
    for(i=0; i<255; i++) { 
	    WordProgram(i, 0x55AA);			                                /* 向FLASH的0地址写入0x55AA      */

    }
         
   
    ipAddr = (volatile uint16  *)FLASH_ADDR + 0;
    if(0x55AA != (*ipAddr)) ierr = 1;	                                /* 读出校验,若数据错误则设置err=1*/
      
    if(0==ierr) {  
        FIO3CLR = BEEPCON;				                                /* BEEPCON = 0                   */
        DelayNS(1000);
        FIO3SET = BEEPCON;				                                /* BEEPCON = 1                   */
        DelayNS(1000);
    }
    else {  
        while(1) {  
            FIO3CLR = BEEPCON;			                                /* BEEPCON = 0                   */
            DelayNS(500);
            FIO3SET = BEEPCON;			                                /* BEEPCON = 1                   */
            DelayNS(500);
        }
    }  
    while(1);
    return(0);
	
    while(1);

}

/*********************************************************************************************************
  END FILE
**********************************************************************************************************/

⌨️ 快捷键说明

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