EDA365电子论坛网
标题:
关于外扩flash擦除的问题
[打印本页]
作者:
lpfzhx
时间:
2013-1-5 15:15
标题:
关于外扩flash擦除的问题
FLASH擦除程序:
$ x: N" g" Z! Z1 k) u& F
Uint16 ChipErase(void)
! o: k1 J4 n1 ^- [# T
{
" @( _( @1 [2 \1 c4 y: n3 v, r
Uint16 Data;
8 s6 c d. U2 i8 O x2 E* m
Uint32 TimeOut,i;
3 e* p9 A8 r. Y3 B- H+ h$ H/ G! J
/***********以下过程需要严格遵守**************************/
! ]! r6 \( A1 n; l c
*(FlashStart + 0x5555) = 0xAAAA; //需要对FLASH的0x5555单元写0xAAAA
" [9 R2 [& e3 T
*(FlashStart + 0x2AAA) = 0x5555; //需要对FLASH的0x2AAA单元写0x5555
9 S: e* T* x! n
*(FlashStart + 0x5555) = 0x8080; //随后对FLASH的0x5555单元写0x8080;
+ S* `8 Q) A: n; S7 s, k
*(FlashStart + 0x5555) = 0xAAAA; //乊后对FLASH的0x5555单元写0xAAAA
, A9 Z0 l5 F+ ?, R' T0 c. w
*(FlashStart + 0x2AAA) = 0x5555; //需要对FLASH的0x2AAA单元写0x5555
+ {9 A6 m% n ?- J* |
*(FlashStart + 0x5555) = 0x1010; //需要对FLASH的0x5555单元写0x1010
% p* x/ l$ a, l+ l) y/ E
i = 0;
, [! z9 o: Q( z" p
TimeOut = 0;
' f4 ^5 u* x+ f
while(i<5)
/ v# J/ B0 y; P1 W7 t, X! _
{
+ U" K4 N) V! b' Y: k* Y
Data = *(FlashStart + 0x3FFFF);
" i/ f7 R: d6 ^; l7 F% f
if (Data == 0xFFFF)
' H6 [6 \- U$ Z6 [
i++;
# F- h: c. @- K% c
else i=0;
F& B2 I* b6 ^: Z' J- R
if ( ++TimeOut>0x1000000)
7 Q0 _; e# c u& [7 z: m% k% M2 f/ W
return (TimeOutErr);
1 J( | R5 d4 Q4 \8 V
}
# \! N2 h6 \& f! n" ~( ?2 N
for (i=0;i<0x40000;i++)
, t0 I, [+ x. F6 l
{
; o5 i% r- k, O$ K* y; I! ^3 q
Data = *(FlashStart + i);
3 e6 t8 o3 O/ A
if (Data !=0xFFFF)
: |, S1 c- L8 S6 I* }! P2 y( c
return (EraseErr);
- Q6 G3 I- S; [& J1 F$ O
}
( j/ X3 }+ }, z1 X+ p, r1 _" A& i
return (EraseOK)
, \/ }0 T0 X- M
为什么i<5,FlashStart + 0x3FFFF,++TimeOut>0x1000000
作者:
超級狗
时间:
2013-4-23 20:17
能給閃存芯片資料嗎?
) ]4 o0 D6 g9 S" p9 o8 s( w& @
* ?0 D* q1 }7 h% a- K+ x
{:soso_e132:}
作者:
超級狗
时间:
2013-4-23 22:51
本帖最后由 超級狗 于 2013-4-23 23:06 编辑
/ y/ P8 O" o$ b% `# ^
, z0 R9 l3 ?6 G
應該是一顆 128K x 16 的閃存,Word Address = 0x3FFFF 是最後的位址。
6 J. b1 q; v; q# @
; {2 s0 A% z6 T$ V* t1 z1 x" o: u
FlashStart + 0x3FFFF
& k7 H/ b5 S4 h/ k8 d& h
是閃存最後一個位址,這要看 CPU 定址,因為有的 CPU 定址是 Internal ROM 或 RAM 在前面,所以閃存位址會有一個 Offset,FlashStart 就是 Offset。
i < 5
- e. A5 x" O! G- K
要讀到 5 次最後一個位址的內容等於 0xFFFF 再往下做,閃存內容被抹除後是 0xFFFF。下一段是檢查 0x00000 ~ 0x3FFFF 整顆閃存是否有被清除乾淨。
++TimeOut > 0x1000000
# K. \9 }1 g' B- e! s7 m
i < 5 的迴圈檢查要設一個計數器,不然閃存有問題無法抹除,程序就會卡死。執行太久,發現最後一個位址都無法清除就不要再做了,回應 return (EraseErr) 告訴主程序閃存有問題。
0 p2 s K2 ~/ K
9 b. R+ j; F: x/ B4 A
; {3 G" G/ l8 z* x
{:soso_e125:}
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2