EDA365电子工程师网
标题:
关于外扩flash擦除的问题
[打印本页]
作者:
lpfzhx
时间:
2013-1-5 15:15
标题:
关于外扩flash擦除的问题
FLASH擦除程序:
( F0 q) a% j+ @- p8 d q \( w! \
Uint16 ChipErase(void)
! R% A3 w5 @6 c& x w6 t6 r
{
) B* \( N3 i( @3 T8 [
Uint16 Data;
c: ]# N7 b0 S$ P" @5 t7 c( T
Uint32 TimeOut,i;
l3 y6 R( I$ {7 D
/***********以下过程需要严格遵守**************************/
' C' L' y! \' K/ e( k8 F# p
*(FlashStart + 0x5555) = 0xAAAA; //需要对FLASH的0x5555单元写0xAAAA
( g1 D5 S- I; L9 u8 t
*(FlashStart + 0x2AAA) = 0x5555; //需要对FLASH的0x2AAA单元写0x5555
) u6 N- {6 C4 Q) a: Y1 y
*(FlashStart + 0x5555) = 0x8080; //随后对FLASH的0x5555单元写0x8080;
# {, x+ G/ S" w$ x
*(FlashStart + 0x5555) = 0xAAAA; //乊后对FLASH的0x5555单元写0xAAAA
( y' @; X; ?( B7 t
*(FlashStart + 0x2AAA) = 0x5555; //需要对FLASH的0x2AAA单元写0x5555
4 {+ Z1 k* A& s3 ~
*(FlashStart + 0x5555) = 0x1010; //需要对FLASH的0x5555单元写0x1010
4 G( B* [# [9 j; m& W8 g
i = 0;
7 ]; a. C ?, K2 t n! j
TimeOut = 0;
S3 q0 a; V! n. M
while(i<5)
3 h; d; u) _, |6 A6 }3 T
{
5 ~6 `5 `& I$ x9 t5 s6 ^% y# \9 f) i
Data = *(FlashStart + 0x3FFFF);
3 a4 q- [: ?& I. e3 N+ O" V0 {
if (Data == 0xFFFF)
2 E9 u, C- F- ?* E
i++;
- v+ F2 [( z0 v2 i* y. ?
else i=0;
: W `! c. E8 ^3 Z: W
if ( ++TimeOut>0x1000000)
# A. ? }% }8 g/ p" G$ F
return (TimeOutErr);
- ?8 r6 @1 _7 |* J5 F3 x
}
3 h p6 L) x" I4 F* f! R
for (i=0;i<0x40000;i++)
% Q4 r7 T( T" `: ^' X. ?. G# p6 K
{
; g! p8 [: [* ^! c4 o% F
Data = *(FlashStart + i);
5 x% u/ H4 ]7 a4 A, u* u
if (Data !=0xFFFF)
- _8 j' @$ _- W' O v2 }/ @
return (EraseErr);
, O! G1 V% v$ h" }# @9 k! C
}
3 I* F" A1 t1 f+ V
return (EraseOK)
* n7 L; r- k/ P/ _) P& z
为什么i<5,FlashStart + 0x3FFFF,++TimeOut>0x1000000
作者:
超級狗
时间:
2013-4-23 20:17
能給閃存芯片資料嗎?
1 x/ y, I9 Q3 p( I, U$ a
% l5 j" r' a9 V5 V
{:soso_e132:}
作者:
超級狗
时间:
2013-4-23 22:51
本帖最后由 超級狗 于 2013-4-23 23:06 编辑
6 Z+ J( t* P" C* ]* g
& c" M; S3 Z* d& {: s2 d
應該是一顆 128K x 16 的閃存,Word Address = 0x3FFFF 是最後的位址。
2 C% s& f7 |7 `# h. E) w
7 y! ?- b. t! Z0 o0 b. _
FlashStart + 0x3FFFF
3 L+ x, r) g! i
是閃存最後一個位址,這要看 CPU 定址,因為有的 CPU 定址是 Internal ROM 或 RAM 在前面,所以閃存位址會有一個 Offset,FlashStart 就是 Offset。
i < 5
$ G" M2 L9 B7 |- G
要讀到 5 次最後一個位址的內容等於 0xFFFF 再往下做,閃存內容被抹除後是 0xFFFF。下一段是檢查 0x00000 ~ 0x3FFFF 整顆閃存是否有被清除乾淨。
++TimeOut > 0x1000000
" A( ^; o( q* W0 {, e
i < 5 的迴圈檢查要設一個計數器,不然閃存有問題無法抹除,程序就會卡死。執行太久,發現最後一個位址都無法清除就不要再做了,回應 return (EraseErr) 告訴主程序閃存有問題。
$ r$ V, \9 t+ Q; V) J# s: D8 w; m9 o
4 J0 m9 D3 Y0 c
# [. s1 J D0 g2 o% {' U
{:soso_e125:}
欢迎光临 EDA365电子工程师网 (https://bbs.elecnest.cn/)
Powered by Discuz! X3.2