; Orange programmer module v1.7 ; (c) 2003-2015 CnCLab, Evimix, EugenOS ; GROUP=ST ; CHIP=M45PE20,256K(256),M45PE20.HPL ; VCC=3250 ; SPI ; Tested: ST M45PE20 ;Status Register: 7 6 5 4 3 2 1 0 ; WPEN X X X BL1 BL0 WEL WIP ; r/o r/o ; микросхему вставлять надо в rotated mw часть ZIFа. И задом наперед 1 нога мс на 9 ногу панели. SOCKET=0 ;"USER" OPTIONS=f CDELAY=1 ; one set delay INFO="1 chip pin to 9 ZIF pin" PINO=SCK,3,2 PINO=SI,2,8 PINO=CS,5,4 PINO=WP,6,5 PINO=HOLD,4,3 PINI=SO,1,1 PING=GND,0,8 PINO=VDD,254,6 R9=STATUS,C8,WPEN,x,x,x,BL1,BL0,WEL,WIP ;R9=STATUS,B8 R1="Enter addr: 0x",h24 R14="",P1," ERASE Sector (64Kb) " R15="",P1," Full ERASE " [INIT] HOLD=1 WP=0 CS=1 SCK=0 [_SENDBYTE] LOOP=(7,0){SI=R0[I],SCK=P} [READ] CS=0 R0=00000011b,_SENDBYTE ;Read LOOP=(23,0){SI=ADR[I],SCK=P} SI=1 LOOP=(7,0){SCK=1,DATA[I]=SO,SCK=0} CS=1 P=1 [READBLOCK] CS=0 R0=00000011b,_SENDBYTE ;Read LOOP=(23,0){SI=ADR[I],SCK=P} SI=1 LOOP=($BLOCKSIZE){ ;LOOP=(7,0){SCK=1,DATA[I]=SO,SCK=0} SCK=1 R0[7]=SO,SCK=N R0[6]=SO,SCK=N R0[5]=SO,SCK=N R0[4]=SO,SCK=N R0[3]=SO,SCK=N R0[2]=SO,SCK=N R0[1]=SO,SCK=N R0[0]=SO,SCK=0 DATA=R0 ADR=+1 } CS=1 [_WAITWR] ;Wait for end write memory... SCK=0 LOOP=(0,500){ CS=0 R0=00000101b,_SENDBYTE ;RDSR SI=1 R9=0 LOOP=(7,0){SCK=1,R9[I]=SO,SCK=0} CS=1 R9[0]?0{BREAK} ;WIP bit P=10 } [_WREN] SCK=0 CS=0 R0=00000110b ; Write enable _SENDBYTE CS=1 [WRITEINIT] HOLD=1 WP=1 CS=1 P=5000 _WREN CS=0 R0=00000001b ;WRSR _SENDBYTE R0=00000000b ;Status Register _SENDBYTE CS=1 P=25000 ;! [WRITE] SCK=0 _WREN CS=0 R0=00000010b ; Write _SENDBYTE LOOP=(23,0){SI=ADR[I],SCK=P} LOOP=(7,0){SI=DATA[I],SCK=P} SI=1,CS=1 ;P=5000 _WAITWR [WRITEBLOCK] SCK=0 _WREN CS=0 _SENDBYTE(00000010b) ; Write LOOP=(23,0){SI=ADR[I],SCK=P} LOOP=($BLOCKSIZE){ LOOP=(7,0){SI=DATA[I],SCK=P} ADR=+1 } CS=1 _WAITWR [_ReadID];orig WP=1 SCK=0 CS=1 CS=0 R7=0 R0=10101011b ;RES _SENDBYTE R0=0 ; DUMMY adr LOOP=(23,0){SI=R0[I],SCK=P} SI=1 LOOP=(7,0){SCK=1,R7[I]=SO,SCK=0} CS=1 P=10000 PRINT=("ID value = %02lXH",R7) [_CHCKID] WP=1 SCK=0 CS=1 CS=0 R7=0 R8=0 R9=0 R0=10011111b ;Read ID _SENDBYTE SI=1 LOOP=(7,0){SCK=1,R7[I]=SO,SCK=0} LOOP=(7,0){SCK=1,R8[I]=SO,SCK=0} LOOP=(7,0){SCK=1,R9[I]=SO,SCK=0} CS=1 P=10000 R7?0{R8?0{R9?0{PRINT=E("Manufacturer/Device ID read ERROR !"),EXIT}}} R7?0xFF{R8?0xFF{R9?0xFF{PRINT=E("Manufacturer/Device ID read ERROR !"),EXIT}}} [ReadID] _CHCKID R1=0 R7?0x20{R2=0 R8?0x20{R2=1} R8?0x30{R2=1} R8?0x40{R2=2} R8?0x50{R2=2} R8?0x80{R2=2} R2?1{ R9?0x10{PRINT=("Numonyx/ST M25P05 (64Kx8) ID: %01lXh %02lXh%02lXh",R7,R8,R9),R1=1} R9?0x11{PRINT=("Numonyx/ST M25P10 (128Kx8) ID: %01lXh %02lXh%02lXh",R7,R8,R9),R1=1} R9?0x12{PRINT=("Numonyx/ST M25P20 (256Kx8) ID: %01lXh %02lXh%02lXh",R7,R8,R9),R1=1} R9?0x13{PRINT=("Numonyx/ST M25P40 (512Kx8) ID: %01lXh %02lXh%02lXh",R7,R8,R9),R1=1} R9?0x14{PRINT=("Numonyx/ST M25P80 (1Mx8) ID: %01lXh %02lXh%02lXh",R7,R8,R9),R1=1} R9?0x15{PRINT=("Numonyx/ST M25P16 (2Mx8) ID: %01lXh %02lXh%02lXh",R7,R8,R9),R1=1} R9?0x16{PRINT=("Numonyx/ST M25P32 (4Mx8) ID: %01lXh %02lXh%02lXh",R7,R8,R9),R1=1} R9?0x17{PRINT=("Numonyx/ST M25P64 (8Mx8) ID: %01lXh %02lXh%02lXh",R7,R8,R9),R1=1} } R2?2{ R9?0x10{PRINT=("Numonyx/ST M25PE05/M45PE05 (64Kx8) ID: %01lXh %02lXh%02lXh",R7,R8,R9),R1=1} R9?0x11{PRINT=("Numonyx/ST M25PE10/M45PE10 (128Kx8) ID: %01lXh %02lXh%02lXh",R7,R8,R9),R1=1} R9?0x12{PRINT=("Numonyx/ST M25PE20/M45PE20 (256Kx8) ID: %01lXh %02lXh%02lXh",R7,R8,R9),R1=1} R9?0x13{PRINT=("Numonyx/ST M25PE40/M45PE40 (512Kx8) ID: %01lXh %02lXh%02lXh",R7,R8,R9),R1=1} R9?0x14{PRINT=("Numonyx/ST M25PE80/M45PE80 (1Mx8) ID: %01lXh %02lXh%02lXh",R7,R8,R9),R1=1} R9?0x15{PRINT=("Numonyx/ST M25PE16/M45PE16 (2Mx8) ID: %01lXh %02lXh%02lXh",R7,R8,R9),R1=1} R9?0x16{PRINT=("Numonyx/ST M25PE32/M45PE32 (4Mx8) ID: %01lXh %02lXh%02lXh",R7,R8,R9),R1=1} R9?0x17{PRINT=("Numonyx/ST M25PE64/M45PE64 (8Mx8) ID: %01lXh %02lXh%02lXh",R7,R8,R9),R1=1} } } R1?0{PRINT=("Manufacturer/Device ID = %01lXh %02lXh%02lXh%02lXh",R7,R8,R9,R9)} [ReadStatus] ;HOLD=1 WP=1 SCK=0 CS=1 CS=0 R9=0 R0=00000101b,_SENDBYTE ;RDSR SI=1 LOOP=(7,0){SCK=1,R9[I]=SO,SCK=0} CS=1 P=10000 GET=("Status",R9) [WriteStatus] GET=("Write Status",R9) RA?0{EXIT} WP=1 CS=1 SCK=0 ;PRINT=("value %02lX",R9) _WREN CS=0 R0=00000001b ;WRSR _SENDBYTE R0=R9 ;Status Register _SENDBYTE CS=1 P=20000 [_CKSTREG] SCK=0 R2=0 LOOP=(20000){ CS=0 PRINT=S("Erase %lu",R2) R2=+1 _SENDBYTE(00000101b) ;RDSR SI=1 R9=0 LOOP=(7,0){SCK=1,R9[I]=SO,SCK=0} CS=1 R9[0]?0{BREAK} ;WIP bit P=1000 } [_SectorErase] R1=0 ;GET=("Please enter sector address :",R1) GET=("Erase sector (64Kb) :",R1) RA?0{EXIT} R2=R1,R3=65535,R4=0 R2?>R3{R2=/R3} R4=R2,R2?>0{R4=*0x10000} R5=R4,R5=+R3 _CHCKID R6=0,R7=0 R9?0x11{R2?>1{R6=1},R2?<2{R7=1}} R9?0x12{R2?>3{R6=1},R2?<4{R7=1}} R9?0x13{R2?>7{R6=1},R2?<8{R7=1}} R9?0x14{R2?>15{R6=1},R2?<16{R7=1}} R6?1{PRINT=E("ERROR! The selected address is out of memory range",R1,R2,R4,R5),EXIT} R7?0{PRINT=E("ERROR! In the socket wrong type memory!"),EXIT} PRINT=A(" Are You sure ERASE 0x%06lX address sector ?\n( %lu Sector, 0x%06lX - 0x%06lX address range)",R1,R2,R4,R5),RA?0{EXIT} HOLD=1 WP=1 SCK=0 CS=1 _WREN CS=0 _SENDBYTE(00000001b) ;WRSR _SENDBYTE(0) ;Status Register CS=1 P=10000 _WREN CS=0 R0=11011000b ;Sector Erase _SENDBYTE LOOP=(23,0){SI=R1[I],SCK=P} CS=1 _CKSTREG [_FullErase] PRINT=A("Are You sure full ERASE flash ?"),RA?0{EXIT} _CHCKID HOLD=1 WP=1 SCK=0 CS=1 _WREN CS=0 _SENDBYTE(00000001b) ;WRSR _SENDBYTE(0) ;Status Register CS=1 P=10000 _WREN CS=0 _SENDBYTE(11000111b) ;BE Bulk Erase 0xC7 CS=1 ; Full erase time for 25P80 - 20 sec! _CKSTREG ["Erase Flash"] LOOP(0x7FFFFFF){ GET=("Select ERASE type",R14,R15),RA?0{BREAK} RA?3{_SectorErase},RA?4{_FullErase},EXIT}