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

📄 sst39vf160.c

📁 周立功经典实验教程《ARM嵌入式系统实验教程》的配套源代码
💻 C
字号:
/****************************************************************************
* 文件名:SST39VF160.C
* 功能:对SST39VF160进行全片擦除,然后写两字节数据到芯片0地址,再读出来校验,
*      若校验通过则蜂鸣器响一声,否则不断地蜂鸣报警。
* 说明:将跳线器JP9短接,JP4断开。
****************************************************************************/
#include  "config.h"

#define	  BEEPCON  0x00000080		/* P0.7引脚控制B1,低电平蜂鸣 */

/****************************************************************************
* 名称:DelayNS()
* 功能:长软件延时。
* 入口参数:dly		延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void  DelayNS(uint32  dly)
{  uint32  i;

   for(; dly>0; dly--) 
      for(i=0; i<5000; i++);
}

// FLASH的起始地址(分配为Bank1块)
#define  FLASH_ADDR		0x81000000

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

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

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

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

   ip = GetAddr(0x5555);
   ip[0] = 0xaaaa;			// 第一个写周期,地址0x5555,数据0xAA
   ip = GetAddr(0x2aaa);
   ip[0] = 0x5555;			// 第二个写周期,地址0x2aaa,数据0x55
   ip = GetAddr(0x5555);
   ip[0] = 0x8080;			// 第三个写周期,地址0x5555,数据0x80
   ip = GetAddr(0x5555);
   ip[0] = 0xaaaa;			// 第四个写周期,地址0x5555,数据0xAA
   ip = GetAddr(0x2aaa);
   ip[0] = 0x5555;			// 第五个写周期,地址0x2aaa,数据0x55
   ip = GetAddr(0x5555);
   ip[0] = 0x1010;			// 第六个写周期,地址0x5555,数据0x10

   while (1)				// 等待操作完成 (若擦除操作没有完成,每次读操作DQ6会跳变)
   {  temp1 = *ip;
      temp2 = *ip;
      if (temp1 == temp2)
      {  if (temp1 != 0xffff)
         {  return(FALSE);
         }
         else
         {  return(TRUE);
         }
      }
   }
   return(TRUE);
}


/****************************************************************************
* 名称:main()
* 功能:SST39VF160擦除、编程操作。
****************************************************************************/
int  main(void)
{  uint8  i;
   uint8  err = 0;
   
   volatile uint16  *addr;

   PINSEL0 = 0x00000000;			// 设置管脚连接GPIO   
   IO0DIR = BEEPCON; 				// 设置I/O为输出

   ChipErase();						// FLASH全片擦除
   
   // 校验是否真正擦除。若发现有非0xFFFF的存储单元,设置err=1
   addr = (volatile uint16  *)FLASH_ADDR + 0;
   for(i=0; i<100; i++)  			
   {  if(0xFFFF != (*addr)) err = 1;
      addr++;
   }
         
   WordProgram(0x0, 0x55AA);		// 向FLASH的0地址写入0x55AA
   
   addr = (volatile uint16  *)FLASH_ADDR + 0;
   if(0x55AA != (*addr)) err = 1;	// 读出校验,若数据错误则设置err=1
      
   if(0==err)   
   {  IO0CLR = BEEPCON;				// BEEPCON = 0
      DelayNS(20);
      IO0SET = BEEPCON;				// BEEPCON = 1
      DelayNS(20);
   }
   else
   {  while(1)	
      {  IO0CLR = BEEPCON;			// BEEPCON = 0
         DelayNS(10);
         IO0SET = BEEPCON;			// BEEPCON = 1
         DelayNS(10);
      }
   }  
   
   while(1);
   return(0);
}



⌨️ 快捷键说明

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