|
|||||||||||
| 技術(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ù) |
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 于 2005/12/23 16:30:00 發(fā)布:
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 于 2005/12/23 17:42:00 發(fā)布:
麻煩再詳細(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 于 2005/12/26 11:42:00 發(fā)布:
re 請大俠再漏一次面啊? 這個問題我實在是想不通,幫幫忙! |
|
| 5樓: | >>參與討論 |
| 作者: zlgarm 于 2005/12/26 13:59:00 發(fā)布:
re 你的程序在調(diào)用函數(shù)WordProgram(uint32 Addr, uint16 Data)對FLASH操作的時候,Addr是已經(jīng)是偶數(shù)地址了(所以A0實際上是沒有用的),如果你再對Addr進(jìn)行左移一位,那么就寫到其他地址上去了。 |
|
| 6樓: | >>參與討論 |
| 作者: pengyuchun 于 2005/12/29 10:21:00 發(fā)布:
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ì)講講。 |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |