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 ?
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.
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
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 ;-)
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:
Var CheckSum:Word; VAR SectorStart: Word; VAR SectorStop : Word; VAR ChipStart : LongWord; VAR ChipStop : LongWord; VAR BufferStart: LongWord; VAR Data:word; var DataVer:Word;
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;
;***************************************** ;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);
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.#')
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!//')
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;
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#')
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;
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
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.