|
|||||||||||
| 技術(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ù) |
我寫(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 于 2006/11/3 16:08:00 發(fā)布:
設(shè)計(jì)超時(shí) 命令送出后要查詢其狀態(tài) 同時(shí)要有超時(shí)機(jī)制 SST的片子還是比較好使 應(yīng)該是你程序問(wèn)題. |
|
| 3樓: | >>參與討論 |
| 作者: yh830921 于 2006/11/3 16:59:00 發(fā)布:
謝謝 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 于 2006/11/4 9:53:00 發(fā)布:
怎么沒(méi)人幫幫我的! 怎么沒(méi)人幫幫我的啊! |
|
| 5樓: | >>參與討論 |
| 作者: skyler 于 2006/11/5 23:59:00 發(fā)布:
怎么錯(cuò)法? "寫(xiě)進(jìn)去的數(shù)第一個(gè)是錯(cuò)誤的,第二個(gè)是正確的" 指的是字節(jié)還是word? * - 本貼最后修改時(shí)間:2006-11-6 9:10:35 修改者:skyler |
|
| 6樓: | >>參與討論 |
| 作者: twentyone 于 2006/11/7 8:38:00 發(fā)布:
re 寫(xiě)之前,是否執(zhí)行了擦除操作? |
|
|
|
| 免費(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) |