; Orange programmer module v2.9 ; (c) 2004-2010 CnCLab & pavel-pervomaysk ; CHIP=25C080, 1K,25c256.hpl ; CHIP=25C160, 2K,25c256.hpl ; CHIP=25C320, 4K,25c256.hpl ; CHIP=25C650, 8K,25c256.hpl ; CHIP=25C128,16K,25c256.hpl ; CHIP=25C256,32K,25c256.hpl ; SPI EEPROM with 16 bit address ; block read/write supported. ; ;Status Register: 7 6 5 4 3 2 1 0 ; WPEN X X X BL1 BL0 WEL WIP ; r/o r/o ;Tested AT25160, AT25256W FM25L256 ... SOCKET=4 ;"SPI" PINO=SCK,0 PINO=SI,1 PINO=CS,2 PINO=WP,3 PINO=HOLD,4 PINI=SO,1 CDELAY=1 ; one set delay R9=STATUS,C8,WPEN,x,x,x,BL1,BL0,WEL,RDY [!#SETUP] $WDELAY=10000 ; Send 8 bits [_SEND] LOOP=(7,0){SI=R0[I],SCK=P} ; Read STATUS register [_RDSR] CS=0 _SEND(00000101b) ;RDSR SI=1 R9=0 LOOP=(7,0){SCK=1,R9[I]=SO,SCK=0} CS=1 ;Wait for end write memory... [_WAITWR] SCK=0 LOOP=(0,2000){ CS=0 _SEND(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=10 } [INIT] HOLD=1 WP=0 CS=1 SCK=0 _WAITWR ; READ STATUS REGISTER and wait ;R9=0 R9[0]?1{ ; if bit0 not READY, error present. PRINT=A("Chip not respond, continue?") RA?0{EXIT} } [READ] CS=1 SCK=0 CS=0 _SEND(00000011b) ;Read cmd LOOP=(15,0){SI=ADR[I],SCK=P} SI=1 R0=0 LOOP=(7,0){SCK=1,R0[I]=SO,SCK=0} DATA=R0 CS=1 P=1 [READBLOCK] CS=1 SCK=0 CS=0 _SEND(00000011b) ;Read cmd LOOP=(15,0){SI=ADR[I],SCK=P} SI=1 LOOP=($BLOCKSIZE){ R0=0 LOOP=(7,0){SCK=1,R0[I]=SO,SCK=0} DATA=R0 ADR=+1 } CS=1 P=1 [WRITEINIT] HOLD=1 WP=1 ;write enable CS=1 SCK=0 CS=0 _SEND(00000110b) ; Write enable SI=1,CS=1 P=20 CS=0 _SEND(00000001b) ;WRSR _SEND(00000000b) ;Status Register SI=1,CS=1 P=12000 [WRITE] SCK=0 CS=0,SI=0 _SEND(00000110b) ; Write enable SI=1,CS=1 P=20 CS=0,SI=0 _SEND(00000010b) ; Write LOOP=(15,0){SI=ADR[I],SCK=P} LOOP=(7,0){SI=DATA[I],SCK=P} SI=1,CS=1 P=$WDELAY [WRITEBLOCK] SCK=0 CS=0,SI=0 _SEND(00000110b) ; Write enable SI=1,CS=1 P=20 CS=0,SI=0 _SEND(00000010b) ; Write LOOP=(15,0){SI=ADR[I],SCK=P} LOOP=($BLOCKSIZE){ LOOP=(7,0){SI=DATA[I],SCK=P} ADR=+1 } SI=1 CS=1 ;P=$WDELAY _WAITWR [ReadStatus] _RDSR GET=("Status Register",R9) [WriteStatus] GET=("Status Register",R9) RA?0{EXIT} CS=1 HOLD=1 WP=1 SCK=0 CS=0 _SEND(00000110b) ; Write enable CS=1 P=100 CS=0 _SEND(00000001b) ; WRSR _SEND(R9) CS=1 P=$WDELAY P=500000