Problem z odczytem pamięci FLASH

Nov 12, 2003 12 Replies

Czy pamięć flash może być zabezpieczona przed odczytem ? Próbuję odczytać pamięć AT29C1024 przy pomocy Eryki i przy próbie robienia czegokolwiek z tą pamięcią wyświetlony jest komunikat "Manufacture code error" Zrobiłem samodzielnie przejściówkę z PLCC44 na DIP44 - wydaje mi się że zrobiona jest dobrze - więc gdzie tkwi problem ? Zły algorytm, czy pamięć zabezpieczona ?



Leszek Wieczorek



Użytkownik "Pszemol" snipped-for-privacy@PolBox.com napisał w wiadomości news: snipped-for-privacy@poczta.onet.pl...

Czy to chodzi o algorytm zezwolenia ze strony 8? Co mam w takim razie zrobić? Czy wpisując te dane pod określone adresy pamięć stanie się dostępna ?

Leszek Wieczorek

Użytkownik "Leszek Wieczoerk" snipped-for-privacy@xl.wp.pl> napisał w wiadomości news:bouai3$p6a$ snipped-for-privacy@nemesis.news.tpi.pl...

raczej nie, ja sie nie spotkalem by klasyczne rownolegle flashe byly zabezpieczone przed odczytem nie widze za bardzo sensu

tzn, ze mu sie nie zgadza kod producenta

a odczytujesz algorytmem dokladnie dla AT29C1024 ? czy podobnym ale innego producenta ?

w pdf'e pisza, ze ten scalak ma:

manuf. code: 1F device code: 25

Użytkownik "Leszek Wieczoerk" snipped-for-privacy@xl.wp.pl> napisał w wiadomości news:bouai3$p6a$ snipped-for-privacy@nemesis.news.tpi.pl...

raczej nie, ja sie nie spotkalem by klasyczne rownolegle flashe byly zabezpieczone przed odczytem nie widze za bardzo sensu

tzn, ze mu sie nie zgadza kod producenta

a odczytujesz algorytmem dokladnie dla AT29C1024 ? czy podobnym ale innego producenta ?

w pdf'e pisza, ze ten scalak ma:

manuf. code: 1F device code: 25

moze pomyliles sie w drucikach robiac przejsciowke

Wygląda na to, że jest to zabezpieczenie przed przypadkowym zapisem.

Może się da jakoś w programatorze ustawić, aby ignorował kod producenta. Ale takie zachowanie może świadczyć o złym podłączeniu lub usterce pamięci. W pdfie piszą tylko (o ile dobrze widzę), że w trybie Power Down nie da się odczytać sygnatury. Ale to pewnie nie jest taki przypadek.

Pozdr EM

pamięci mam dwie - jedną z dobrego urządzenia więc jedna jest na pewno dobra podłączenie też jest dobre (moim zdaniem) - eryka testuje piny przed odczytem i wyświetla które są niepodłączone. Przejściówka jest zrobiona z PLCC44 na DIP44 w ten sposób że numer pinu DIP odpowiada numerowi pinu PLCC

Leszek Wieczorek

Thu, 13 Nov 2003 08:40:50 +0100 jednostka biologiczna o nazwie "EM" snipped-for-privacy@poczta.onet.pl> wyslala do portu 119 jednego z serwerow news nastepujace dane:

Dlatego uzywa sie programatorow wlasnej konstrukcji ;-)

No właśnie ale dlaczego ?

Dokładnie tym algorytmem - dla Atmela zresztą inni producenci nie robią chyba takiej pamięci

Ale czy to jest kod który muszę wpisać ? Myślę że za to powinien odpowiadać algorytm który obsługuje ten układ

Raczej nie...

Leszek Wieczorek

Omijają one kod producenta ? Możesz rozwinąć temat ?

Leszek Wieczorek

Thu, 13 Nov 2003 12:55:59 +0100 jednostka biologiczna o nazwie "Leszek Wieczoerk" snipped-for-privacy@xl.wp.pl> wyslala do portu 119 jednego z serwerow news nastepujace dane:

Chodzilo mi o to ze oprogramowanie pisze sie wtedy samemu wiec mozna latwo olac sygnaturke ukladu. BTW: jestem w trakcie konczenia takiego ustrojstwa wlasnej konstrukcji

- zrobione jest na AT89C2051 i 2 szt. 8255, do tego zasilacz sterowany cyfrowo na LM317 (do ustawiania roznych napiec programowania (VPP)). Programator jest "uniwersalny" :-) tzn. nie ma zadnej konkretnej podstawki tylko wszystko jest wypuszczone na 80-pinowe zlacze do ktorego bedzie sie dolaczalo przystawki pod odpowiednie uklady. Dzieki temu mozliwosc rozbudowy bedzie wlasciwie nieograniczona. Ustrojstwo samo z siebie nie zna algorytmu programowania zadnego ukladu programowalnego tylko przyjmuje przez RS-232 rozkazy typu "ustaw na danej linii/porcie8255 dany stan/liczbe". Umie tez oczywiscie czytac porty ukladow 8255 Dzieki temu rozbudowa o kolejny typ ukladu prgramowalnego bedzie sie sprowadzac do dorobienia plytki z podstawka i zlaczem i uzupelnienia oprogramowania sterujacego na PC.

Czy na pewno przejsciówka powinna być jeden do jednego pinowo? Ten Flash może mieć obudowę PLCC lub TSOP i wyprowadzenia nie są zgodne. Poza tym chcę przypomnieć, że numery pinów się liczy inaczej w PLCC niż zwykle. Pozdr EM

Zgadza się, ale przejściówka jest miom zdaniem dobrze zrobiona. Algorytm nazywa się AT29C1024-PLCC44 więc jest do takiego właśnie układu. Jeżeli nie włożę do programatora nic, to wyświetla mi wtedy błąd podłączenia i pokazuje które piny są nie podłączone na rysunku podstawki DIP48. wśród nich nie ma pinów 1, 2, 13, 33,42. A są to właśnie puste piny (NC) w AT29C1024 w obudowie PLCC44 tak więc wnioskuję, że przejściówka ma być zrobiona 1 do 1. Zresztą zwykłą przejściówkę z PLCC44 na DIP40 mam oryginalną i pierwsze co zrobiłem to właśnie próby programowania przy jej pomocy, ale wtedy były kompletne bzdury na rysunku podłączenia.

Dodatkowo zablokowałem testowanie sygnatury - nie wiem czy dobrze. Teraz już ne wyświetla błędu "manufacturer code error" i wydaje się że normalnie czyta, ale w buforze po przeczytaniu nic sensownego nie widzę, a zaznaczam jeszcze raz, że pamięć mam jedną napewno dobrą (z działającego urządzenia) natomiast druga - jest albo uszko dzona albo wykasowana - chodzi mi tylko o przekopiowanie Tutaj jest algorytm do tego układu, może ktoś coś mądrego podpowie. wyrzucone pętle są zaznaczone gwiazdkami:

;***************************************************** ; EPROM 29C1024-PLCC44.as ; PINBASE=44;

Var CheckSum:Word; VAR SectorStart: Word; VAR SectorStop : Word; VAR ChipStart : LongWord; VAR ChipStop : LongWord; VAR BufferStart: LongWord; VAR Data:word; var DataVer:Word;

Frame(10,10,210,325) Button('/Blank' ,20, 20,112,35,'IconDeviceBlank',Blank); Frame(10,59,210,2) Button('/Read' ,20, 65,112,35,'IconDeviceRead',READ); Frame(10,104,210,2) Button('/Program',20,110,112,35,'IconDeviceProgram',Program); Frame(10,149,210,2) Button('/Verify' ,20,155,112,35,'IconDeviceVerify',verify); Frame(10,194,210,2) Button('/Auto' ,20,200,112,35,'IconDeviceAuto',auto); Frame(10,239,210,2) Button('Pr/otect',20,245,112,35,'IconDeviceProtect',Protect); Frame(10,285,210,2) Button('/Unprotect',20,290,112,35,'IconDeviceUnProtect',UnProtect);

equ Check=1; equ unCheck=0; Var CheckAutoBlank:Byte; Var OverWrite:Byte; Var CheckAutoVerify:Byte; Var CheckProgramVerify:Byte;

CheckBox('Verify',140,119,CheckProgramVerify,1);

CheckBox('Blank' ,140,198,CheckAutoBlank,1); CheckBox('Verify',140,220,CheckAutoVerify,1);

equ SectorSize=80h; Label('Adres = Sector * 080h',600,10)

Frame(590,30,185,147) EditHEX('Sector Start' ,100,705, 45,58,25,SectorStart,0,0,SectorStop); Frame(590,79,185,2) EditHEX('Sector Stop' ,100,705, 92,58,25,SectorStop,_GLOBALSIZE /80h-1h,0,_GLOBALSIZE /80h-1h); Frame(590,124,185,2) EditHEX('Buffer Start',100,705,139,58,25,BufferStart,0,0,_GLOBALBUFFERSIZE-1);

TextFrame(230,10,350,210,T1);

ProgressRect(230,230,350,15,P1);

AdresMask(24,25,26,27,28,29,30,31,32, 44,36,37,38,39,40,41); DataMask(21,20,19,18,17,16,15,14, 11,10,9,8,7,6,5,3);

EQU VCC=35; EQU GND1=12; EQU GND2=34; EQU CE=4; EQU OE=22; EQU WE=43; EQU A9=44;

VAR ADRESChip:LongWord; VAR ADRESMemory:LongWord; VAR Blanked:LongWord; VAR DataTemp:Word; VAR Verify:LongWord;

BODY

;******************************************************* procedure(Puls); DATAOUT(Data); PINL(CE,WE); PINH(CE,WE); EndProc; ;******************************************************* Procedure(ID); ADRESOUT(05555h); Let Data = 0AAAAh; Puls; ADRESOUT(02AAAh); Let Data = 05555h; Puls; ADRESOUT(05555h); Let Data = 09090h; Puls; Loop(100);

DATAOUT(0FFFFh)

ADRESOUT(0h); PinL(OE,CE); DATAIN(DataVer); PinH(OE,CE); if DataVer<>_GLOBALMANUFCODE then ;******************************************** ;******************************************** ;UWAGA PONIŻSZĄ PĘTLĘ WYRZUCIŁEM ; begin ; TEXT(T1,'/Red/Manufacturer code ERROR!#//'); ; Reset; ; Halt; ; end;

ADRESOUT(1h); PinL(OE,CE); DATAIN(DataVer); PinH(OE,CE);

;***************************************** ;I TĄ TEŻ WYRZUCIŁEM ; if DataVer<>_GLOBALDEVICECODE then ; begin ; TEXT(T1,'/Red/Device code ERROR!#//'); ; Reset; ; Halt; ; end;

ADRESOUT(05555h); Let Data = 0AAAAh; Puls; ADRESOUT(02AAAh); Let Data = 05555h; Puls; ADRESOUT(05555h); Let Data = 0F0F0h; Puls; Loop(100);

DATAOUT(0FFFFh) EndProc; ;******************************************************* Procedure(POWER_ON); TEXT(T1,'/Maroon/Waiting...#//'); RESET LEDON VCCSET(500) PULLUP5V VCC(VCC) PINL(GND1,GND2) DATAOUT($FFFF) PINH(OE,CE) PINH(WE) VCCON; ID; EndProc; ;******************************************************* Procedure(POWER_OFF); Progress(P1,0); RESET EndProc; ;******************************************************* Procedure(BLANK); TEXT(T1,'#BLANK '); POWER_ON;

Let ChipStart = SectorStart; let ChipStart * SectorSize; Let ChipStop = SectorStop; let ChipStop * SectorSize; let ChipStop + SectorSize -1;

Let ADRESCHIP = ChipStart Let ADRESMEMORY=BufferStart; Let Blanked=0; PROGRESSMAX(P1,ChipStop); PROGRESSMIN(P1,ChipStart);

for AdresChip to ChipStop do begin ADRESOUT(AdresChip); PINL(CE,OE); DATAIN(Data); PINH(CE,OE); IF DATA<>$FFFF THEN Inc(Blanked); Progress(P1,AdresChip); end;

if blanked<>0 then begin TEXT(T1,'/Red//Under/WARNING !// CHIP NOT BLANK.#') TEXT(T1,'/Navy blue/') TEXTHEX(T1,Blanked) TEXT(T1,' //byte <> FFFFh.#')

POWER_OFF Halt end;

TEXT(T1,'/Under/OK!// CHIP BLANK#')

POWER_OFF EndProc; ;******************************************************* Procedure(READ); TEXT(T1,'#READ '); POWER_ON;

Let ChipStart = SectorStart; let ChipStart * SectorSize; Let ChipStop = SectorStop; let ChipStop * SectorSize; let ChipStop + SectorSize -1;

Let ADRESCHIP=ChipStart; Let ADRESMEMORY=BufferStart; LET Blanked=0; Let CheckSum=0; PROGRESSMAX(P1,ChipStop); PROGRESSMIN(P1,ChipStart);

for AdresChip to ChipStop do begin ADRESOUT(ADRESChip); PINL(CE,OE); DATAIN(Data); PINH(CE,OE); MEMORYOUT(ADRESMemory,Data); Let CheckSum+Data; IF DATA<>$FFFF THEN Inc(Blanked); INC(ADRESMemory); Progress(P1,AdresChip); end;

if blanked<>0 then begin TEXT(T1,'/Navy blue/') TEXTHEX(T1,Blanked) TEXT(T1,'// word <> FFFFh. ') end; Text(T1,'/Under/OK!//')

Text(T1,' Crc='); TextHex(T1,CheckSum); Text(T1,'h#');

POWER_OFF EndProc; ;******************************************************* Var AdrError:LongWord; Var DataBufferError:Word; Var DataChipError:Word; Var MarkError:Byte

Equ Marked = 1; Equ NotMarked = 0;

Procedure(Verify); TEXT(T1,'#VERIFY '); POWER_ON;

Let ChipStart = SectorStart; let ChipStart * SectorSize; Let ChipStop = SectorStop; let ChipStop * SectorSize; let ChipStop + SectorSize -1;

Let ADRESCHIP=ChipStart; Let ADRESMEMORY=BufferStart; Let Verify=0; Let MarkError=NotMarked;

PROGRESSMAX(P1,ChipStop); PROGRESSMIN(P1,ChipStart);

for AdresChip to ChipStop do begin ADRESOUT(AdresChip); PINL(CE,OE); DATAIN(Data); PINH(CE,OE); CompareOut(AdresMemory,Data); MemoryIn(AdresMemory,DataTemp); IF DATA<>DataTemp THEN begin Inc(Verify); if MarkError=NotMarked then begin Let AdrError=AdresChip; Let DataBufferError=DataTemp; Let DataChipError=Data; Let MarkError=Marked; end; end;

INC(AdresMemory); Progress(P1,AdresChip); end;

if verify<>0 then begin TEXT(T1,'/Red//Under/ERROR !// Verify #') TEXT(T1,'/Navy blue/') TEXTHEX(T1,Verify) TEXT(T1,' //byte bad value#')

TEXT(T1,'First error:#') TEXT(T1,'ChipAdres ChipData MemoryData#/Navy blue/') TEXTHEX(T1,AdrError) TEXT(T1,'h ') TEXTHEX(T1,DataChipError) TEXT(T1,'h ') TEXTHEX(T1,DataBufferError) TEXT(T1,'h #//')

POWER_OFF exit end

TEXT(T1,'/Under/OK!// CHIP Verify#')

POWER_OFF EndProc; ;******************************************************* var SAdresMemory:LongWord; var SAdresChip:LongWord; var SCounter:Word; procedure(SectorVerify); Let SAdresMemory=AdresMemory; Let SAdresMemory - SectorSize -1 ; Let SAdresChip =AdresChip; Let SAdresChip - SectorSize -1;

DataOut(0FFFFh); Let SCounter=0; for SCounter to SectorSize-1 do begin ADRESOUT(SAdresChip); PINL(CE,OE); DATAIN(DataVer); PINH(CE,OE); MemoryIn(SAdresMemory,Data); if DataVer<>Data then begin Text(T1,'/Red//Under/Error!//#'); TEXT(T1,'ChipAdres ChipData MemoryData#') Text(T1,'/Navy blue/'); TEXTHEX(T1,SAdresChip) TEXT(T1,'h ') TEXTHEX(T1,DataVer) TEXT(T1,'h ') TEXTHEX(T1,Data) TEXT(T1,'h #//') POWER_OFF Halt; end;

Inc(SAdresMemory); Inc(SAdresChip); end; EndProc; ;******************************************************* var Counter:Word; procedure(ProgramLoop); TEXT(T1,'#PROGRAM '); POWER_ON; PinH(CE,OE,WE); VCCSET(_GLOBALVCC);

Let ChipStart = SectorStart; let ChipStart * SectorSize; Let ChipStop = SectorStop; let ChipStop * SectorSize; let ChipStop + SectorSize -1;

Let ADRESCHIP=ChipStart; Let ADRESMEMORY=BufferStart; PROGRESSMAX(P1,ChipStop); PROGRESSMIN(P1,ChipStart);

PinL(CE); PinH(OE); Let Counter=0;

ADRESOUT(ADRESCHIP); Let SADRESCHIP=AdresChip;

for AdresChip to ChipStop do begin ADRESOUT(ADRESCHIP); PulseHL(WE); MEMORYIN(AdresMemory,Data); DataOut(Data)

inc(Counter); if Counter=SectorSize then begin PinH(CE,WE); Loop(100) Let Counter=0; Progress(P1,ADRESCHIP); SectorVerify; PinL(CE); end;

INC(ADRESMemory); end;

Loop(100); TEXT(T1,'/Under/OK!// CHIP Program#') POWER_OFF EndProc;

;******************************************************* procedure(Program); ProgramLoop; if CheckProgramVerify=Check then Verify EndProc; ;******************************************************* procedure(Protect); TEXT(T1,'#PROTECT '); POWER_ON; VCCSET(_GLOBALVCC);

ADRESOUT(5555h); Let Data= 0AAh; Puls; ADRESOUT(2AAAh); Let Data= 055h; Puls; ADRESOUT(5555h); Let Data= 0A0h; Puls;

ADRESOUT(0h); Let Counter=0 for Counter to SectorSize-1 do begin PulseHL(WE); end;

PinH(CE,WE); LOOP(100);

TEXT(T1,'/Under/OK!// CHIP Protected#') POWER_OFF EndProc; ;******************************************************* procedure(UnProtect); TEXT(T1,'#UNPROTECT '); POWER_ON; VCCSET(_GLOBALVCC);

ADRESOUT(5555h); Let Data= 0AAh; Puls; ADRESOUT(2AAAh); Let Data= 055h; Puls; ADRESOUT(5555h); Let Data= 080h; Puls; ADRESOUT(5555h); Let Data= 0AAh; Puls; ADRESOUT(2AAAh); Let Data= 055h; Puls; ADRESOUT(5555h); Let Data= 020h; Puls;

ADRESOUT(0h); Let Counter=0 for Counter to SectorSize-1 do begin PulseHL(WE); end;

PinH(CE,WE);

LOOP(100);

TEXT(T1,'/Under/OK!// CHIP UnProtected#') POWER_OFF EndProc; ;******************************************************* procedure(Auto) TEXT(T1,'#AUTO '); if CheckAutoBlank=Check then Blank

ProgramLoop;

if CheckAutoVerify=Check then Verify

Serialize;

TEXT(T1,'#/Under/OK!// AUTO#') endproc ;******************************************************* end.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required