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

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

關(guān)于LPC2210的flash操作?奇怪,請周立功高手回答一下!

作者:pengyuchun 欄目:ARM技術(shù)
關(guān)于LPC2210FLASH操作?奇怪,請周立功高手回答一下!
arm2200開發(fā)板中,FLASH的地址線A0~A17分別連接到LPC2210的A1~A18,那么實際上從CPU發(fā)出讀寫地址時要把地址左移一位才行吧,例如:

  FLASH地址   cpu發(fā)送的讀寫地址          (假設(shè)基址設(shè)在0x81000000)
   0x0000        0x81000000
   0x0001        0x81000002
   0x0002        0x81000004

  那么這樣cpu的外部bank1(0x81000000)地址豈不不連續(xù)了?實際應(yīng)該應(yīng)該不是這樣啊,我哪里理解錯了呢?

  但是arm2200遠(yuǎn)程序?qū)?a target="_blank" href="http://m.58mhw.cn/stock-ic/FLASH.html">FLASH和擦除FLASH又確實顯示地左移了一位啊,程序如下:

#define  FLASH_ADDR    0x81000000
#define  GetAddr(addr)    (volatile uint16  *)(FLASH_ADDR|(addr<<1))  //這個宏負(fù)責(zé)左移
uint8  ChipErase(void)
{  volatile uint16  *ip;
   uint16  temp1,temp2;

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

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

還有一個疑問就是關(guān)于扇區(qū)擦除:
   如果地址確實需要左移一位,那么扇區(qū)擦除的地址也應(yīng)該左移一位啊,FLASH扇區(qū)地址為A12~A17,那對應(yīng)的cpu地址應(yīng)該在A13~A18啊,可是我試過了,實際的擦除地址仍然對應(yīng)cpu地址應(yīng)該在A12~A17,這就奇怪了,為什么這時候又不用左移一位了呢?

2樓: >>參與討論
zlgarm
re
1.EasyARM2200開發(fā)板的外部Ram和FLASH都是16位的。故訪問外部Ram和FLASH時候,地址線A0是沒有用的。
2.擦寫FLASH時,如果要讀取FLASH的物理地址0x5555上的數(shù)據(jù),那么ARM外部存儲器總線上就得送出FLASH_ADDR|(0x5555<<1)的地址信號,這樣FLASH扇區(qū)地址A0~A18上才會出現(xiàn)0x5555的地址信號。

3樓: >>參與討論
pengyuchun
麻煩再詳細(xì)一下,看我下面的理解到底錯在哪了?請zlg高手幫忙!
是這樣的啊,我也是這樣理解的啊。

一句話總結(jié)就是:
       FLASH上的地址線A0~A17最終對應(yīng)LPC2210的地址線A1~A18。

如果正常操作都要左移的話,我就能理解,但為什么下面情況沒有左移:

   1、寫FLASH。
uint8  WordProgram(uint32 Addr, uint16 Data)
{  volatile uint16  *ip;
   uint16  temp1,temp2;

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

注意上面第四個寫周期沒有用GetAddr宏,這個宏會把FLASH的寫地址左移一位。
但這一條沒有左移:ip = (volatile uint16  *)(FLASH_ADDR_BASE|Addr);
但寫入FLASH寫入的數(shù)據(jù)是正確的,如果把這個地址左移了寫入FLASH的數(shù)據(jù)反而是錯誤的。Addr就是FLASH的實際地址,是字對齊的。

  2、起始讀FLASH的操作也沒有左移地址,如:
*(uint16 *0x80000002)實際讀到的就是0x80000002的FLASH內(nèi)容,而按照上面說的左移一位,讀0x80000002處的FLASH,LPC2210上的地址應(yīng)該是0x80000004啊。

  3、扇區(qū)擦除時,扇區(qū)號出現(xiàn)在sst39sf160的地址線A12~A17,而實際從LPC2210輸出的地址中,sst39sf160的扇區(qū)號也出現(xiàn)在A12~A17,按照前面說的應(yīng)該左移一位出現(xiàn)在A13~A18才對啊。

4樓: >>參與討論
pengyuchun
re
請大俠再漏一次面啊?
這個問題我實在是想不通,幫幫忙!

5樓: >>參與討論
zlgarm
re
你的程序在調(diào)用函數(shù)WordProgram(uint32 Addr, uint16 Data)對FLASH操作的時候,Addr是已經(jīng)是偶數(shù)地址了(所以A0實際上是沒有用的),如果你再對Addr進(jìn)行左移一位,那么就寫到其他地址上去了。


6樓: >>參與討論
pengyuchun
re
還是不能明白,煩請版主詳細(xì)點(diǎn)。

尤其是扇區(qū)擦除時,扇區(qū)號應(yīng)該出現(xiàn)在sst39sf160的地址線A12~A17,而按照實際電路圖的接法,從LCP2210出來的FLASH扇區(qū)的地址線應(yīng)該左移一位,即在LPC的地址線A13~A18才對。

可我實際寫程序的時候發(fā)現(xiàn)FLASH扇區(qū)號的地址也要出現(xiàn)在LPC2210的A12~A18扇區(qū)擦除才正常。

到底是什么地方出了問題?

請版主詳細(xì)講講。

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
請教
關(guān)于boot的問題,麻煩大俠們指條路
請問DeviceARM2200工控板在哪里有賣
請問周公,是否能夠用IS61LV51216取代smart板上的PSRAM?
為什么PWM的中斷不能記錄次數(shù)?
免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號