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.