这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » ZLG 请问ZLG有没有认真的调试这个程序

共2条 1/1 1 跳转至

ZLG 请问ZLG有没有认真的调试这个程序

院士
2006-09-17 18:14:16     打赏
ZLG 请问ZLG有没有认真的调试这个程序



关键词: 请问     有没有     真的     调试     这个     程序    

院士
2006-12-22 22:43:00     打赏
2楼
问 在你们试验教程1中,根据你们后面的更改后,如果程序全速运行的话,向SST39LF160里写数据是失败的,但是如果加一条延时程序的话,全速运行就可以了,不知道你们调试的时候有没有遇到这样的情况。 1: 我们测试没有出现您说的情况,你说的延时是在什么位置? 2: 延时是在调用ChipErase()后试过几次了,不加延时就不能向flash里写数据,但擦除是能正确执行的。
我的板子是EasyARM2200。 3: 您是如何修改程序的呢? 4: 按照《实验教材1》加上你们的错误更正,都还不行最后自己参照SST公司的驱动写了一个程序,就可以了。不知道是怎么回事
你们能把调试好的程序给我吗。实在是想搞明白,我的邮箱:iamlyg98@163.com 5: re./****************************************************************************
* 名称: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 = GetAddr(Addr);
   *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)
{  uint16  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++;
   }
   
   for(i = 0; i < 0xFFFF; i++)          // 循环写入64K
   {      
        WordProgram(i, 0x55AA);            // 向FLASH的0地址写入0x55AA
        addr =GetAddr(i);
        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);
}




共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]