音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁(yè) | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

sst39vf160FLASH的寫(xiě)問(wèn)題?

作者:yh830921 欄目:ARM技術(shù)
sst39vf160FLASH的寫(xiě)問(wèn)題?
我寫(xiě)了一段寫(xiě)FLASH的程序,是用的字編程,在運(yùn)行的時(shí)候,結(jié)果顯示我寫(xiě)到falsh中的數(shù)據(jù)有的錯(cuò)誤有的正確,還有因?yàn)閷?xiě)入的數(shù)據(jù)較多,在寫(xiě)了一寫(xiě)數(shù)據(jù)以后,就不再寫(xiě)入了,程序進(jìn)入了死循環(huán),請(qǐng)高手指點(diǎn)一下

2樓: >>參與討論
skyler
設(shè)計(jì)超時(shí)
命令送出后要查詢其狀態(tài) 同時(shí)要有超時(shí)機(jī)制

SST的片子還是比較好使 應(yīng)該是你程序問(wèn)題.


3樓: >>參與討論
yh830921
謝謝 skyler
skyler,謝謝你,不過(guò)我還是不是很明白,現(xiàn)在單步調(diào)試的結(jié)果是寫(xiě)進(jìn)去的數(shù)第一個(gè)是錯(cuò)誤的,第二個(gè)是正確的,依次類(lèi)推,我實(shí)在不怎么怎么辦了,這個(gè)程序是用光盤(pán)上的程序改寫(xiě)的,程序如下,期望高手指點(diǎn)一下錯(cuò)在什么地方
#include  "config.h"
#include  "stdio.h"

#define      BEEPCON  0x00000080    /* P0.7引腳控制B1,低電平蜂鳴 */

void  DelayNS(uint32  dly)
{  uint32  i;

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

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

// 轉(zhuǎn)換地址。將要發(fā)送給SST39VF160的地址值進(jìn)行轉(zhuǎn)換,以便于LPC2210輸出。
// 由于SST39VF160的A0是與LPC2210的A1相連,所以addr要左移1位。
#define  GetAddr(addr)    (volatile uint16  *)(FLASH_ADDR|(addr<<1))

/****************************************************************************
* 名稱:WordProgram()
* 功能:半字(16位)數(shù)據(jù)編程。
* 入口參數(shù):Addr        編程地址(SST39VF160內(nèi)部地址)    
*          Data        編程數(shù)據(jù)
* 出口參數(shù):返回TRUE表示操作成功,返回FALSE表示操作失敗
****************************************************************************/
uint8  WordProgram(uint32 Addr, int Data)
{  volatile uint16  *ip;
   uint16  temp1,temp2;

   ip = GetAddr(0x5555);    // 轉(zhuǎn)換地址0x5555
   ip[0] = 0xaaaa;            // 第一個(gè)寫(xiě)周期,地址0x5555,數(shù)據(jù)0xAA
   ip = GetAddr(0x2aaa);
   ip[0] = 0x5555;            // 第二個(gè)寫(xiě)周期,地址0x2aaa,數(shù)據(jù)0x55
   ip = GetAddr(0x5555);
   ip[0] = 0xa0a0;            // 第三個(gè)寫(xiě)周期,地址0x5555,數(shù)據(jù)0xA0
    
   ip = (volatile uint16  *)(FLASH_ADDR|(Addr&0x1FFFFF));
   *ip = Data;                // 第四個(gè)寫(xiě)周期,地址Addr,數(shù)據(jù)Data
   
   while (1)                // 等待操作完成 (若編程操作沒(méi)有完成,每次讀操作DQ6會(huì)跳變)
   {  temp1 = *ip;            
      temp2 = *ip;
      if (temp1 == temp2)
      {  if (temp1 != Data)
         {
            return(FALSE);
         }
         else
         {  
            return(TRUE);
         }
      }
   }
   
//   return(TRUE);
}

/****************************************************************************
* 名稱:ChipErase()
* 功能:扇區(qū)擦除。
* 入口參數(shù):無(wú)
* 出口參數(shù):返回TRUE表示操作成功,返回FALSE表示操作失敗
****************************************************************************/

uint8  ChipErase(void)
{  volatile uint16  *ip;
   uint16  temp1,temp2;

   ip = GetAddr(0x5555);
   ip[0] = 0xaaaa;        // 第一個(gè)寫(xiě)周期,地址0x5555,數(shù)據(jù)0xAA
   ip = GetAddr(0x2aaa);
   ip[0] = 0x5555;        // 第二個(gè)寫(xiě)周期,地址0x2aaa,數(shù)據(jù)0x55
   ip = GetAddr(0x5555);
   ip[0] = 0x8080;        // 第三個(gè)寫(xiě)周期,地址0x5555,數(shù)據(jù)0x80
   ip = GetAddr(0x5555);
   ip[0] = 0xaaaa;        // 第四個(gè)寫(xiě)周期,地址0x5555,數(shù)據(jù)0xAA
   ip = GetAddr(0x2aaa);
   ip[0] = 0x5555;        // 第五個(gè)寫(xiě)周期,地址0x2aaa,數(shù)據(jù)0x55
   ip = GetAddr(0x5555);
   ip[0] = 0x1010;        // 第六個(gè)寫(xiě)周期,地址0x5555,數(shù)據(jù)0x10

   while (1)// 等待操作完成 (若擦除操作沒(méi)有完成,每次讀操作DQ6會(huì)跳變)
   {  temp1 = *ip;
      temp2 = *ip;
      if (temp1 == temp2)
      {  if (temp1 != 0xffff)
         {
           return(FALSE);
         }
         else
         {
           return(TRUE);
         }
      }
   }
//   return(TRUE);
}


/****************************************************************************
* 功能:SST39VF160擦除、編程操作。
****************************************************************************/
volatile uint16 *addr_flash = 0x00000000;
void  SST39VF160(int xy[1024])
{  uint8  i;
   uint8  err = 0;
   
   volatile uint16  *addr;

   PINSEL0 = 0x00000000;        // 設(shè)置管腳連接GPIO   
   IO0DIR = BEEPCON;         // 設(shè)置I/O為輸出

   if(addr_flash == 0x00000000)
   {
     ChipErase();      // FLASH全片擦除
     // 校驗(yàn)是否真正擦除。若發(fā)現(xiàn)有非0xFFFF的存儲(chǔ)單元,設(shè)置err=1
     addr = (volatile uint16  *)FLASH_ADDR;
     for(i=0; i<100; i++)              
     {  if(0xFFFF != (*addr)) err = 1;
      addr++;
     }
   }
         
   for(i=0;i<1024;i++)
   {
     WordProgram((uint32)addr_flash,xy[i]);    // 向FLASH的地址寫(xiě)入數(shù)據(jù)
     addr_flash++;
   }
}

4樓: >>參與討論
yh830921
怎么沒(méi)人幫幫我的!
怎么沒(méi)人幫幫我的啊!

5樓: >>參與討論
skyler
怎么錯(cuò)法?
"寫(xiě)進(jìn)去的數(shù)第一個(gè)是錯(cuò)誤的,第二個(gè)是正確的"
指的是字節(jié)還是word?

* - 本貼最后修改時(shí)間:2006-11-6 9:10:35 修改者:skyler

6樓: >>參與討論
twentyone
re
寫(xiě)之前,是否執(zhí)行了擦除操作?

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
LPC2132 watchdog 都不能復(fù)位,是跑到哪里去了?
整天都是if,for,太累了
關(guān)于Philips flash utility
請(qǐng)問(wèn)LPC213X的上電晶體不起振的問(wèn)題有沒(méi)有完全解決?
2148 PWM 的速率和分辨率
免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào)