; Orange programmer module v2.9 ; (c) 2004-2010 CnCLab & pavel-pervomaysk ; 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 BR35H160 SOCKET=4 ;"SPI" PINO=SCK,0 PINO=SI,1 PINO=CS,2 ;PINO=WP,3 ;PINO=HOLD,4 PINI=SO,1 CDELAY=2 ; one set delay R9=STATUS,C8,x,x,x,x,x,x,WEN,R/B [!#SETUP] $WDELAY=10000 ; Send 8 bits [_SEND] ;PRINT=L("S. %02X\n",R0) 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 CS=0 _SEND(00000101b) ;RDSR LOOP=(2000){ SI=1 R9=0 LOOP=(7,0){SCK=1,R9[I]=SO,SCK=0} ;PRINT=L("A. %02X\n",R9) 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] 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