Problem z odczytem pamięci FLASH

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

Reply to
Leszek Wieczoerk
Loading thread data ...

No piszą o zabezpieczeniu:

formatting link

Reply to
Pszemol

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

Reply to
Leszek Wieczoerk

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

Reply to
Andy

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

Reply to
Andy

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

Reply to
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

Reply to
Leszek Wieczoerk

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 ;-)

Reply to
BLE_Maciek

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

Reply to
Leszek Wieczoerk

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

Leszek Wieczorek

Reply to
Leszek Wieczoerk

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.

Reply to
BLE_Maciek

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

Reply to
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.

Reply to
Leszek Wieczoerk

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.