; Orange programmer module v2.4 ; (c) 2003-2010 CnCLab ; CHIP=AT45DB161,2162688(528) ; Atmel Serial DataFlash ; Write time - over 15 min! ; primary tested! ;Bit 0 in the Status Register indicates page size ;for "power of 2" binary page size (512 bytes) or standard DataFlash page size (528 bytes). ;If bit 0 is a 1, then the page size is set to 512 bytes. ;If bit 0 is a 0, then the page size is set to 528 bytes. INFO="AT45 Adapter" ALLPINS=28 SOCKET=0 PINO=SCK,0,5 PINO=SI,5,6 PINO=CS,2,4 PINO=WP,3,25 PINO=RESET,4,24 PINO=SO,1,7 PINI=SO,1,7 ;GND 1 ;VCC 28 PING=VSS,6 CDELAY=1 ; one set delay R9=STATUS,C8,RDY,COMP,x,x,x,x,PROT,PageSize [INIT] VSS=0 SO=Z WP=1 CS=0,SCK=0,CS=1 RESET=0,P=50,RESET=1,P=500 [READ] CS=1 SCK=0 R7=ADR,R7=/$BLOCKSIZE ; page number R8=ADR,R8=%$BLOCKSIZE ; byte number CS=0 R0=0x52 ;Read opcode LOOP=(7,0) {SI=R0[I],SCK=P} ; opcode LOOP=(13,0){SI=R7[I],SCK=P} ; page address LOOP=(9,0) {SI=R8[I],SCK=P} ; byte address SI=0 LOOP=(15,0){SCK=P} ; 32 don't care bits LOOP=(15,0){SCK=P} SI=1 LOOP=(7,0){SCK=P,DATA[I]=SO} CS=1 [READBLOCK] CS=1 SCK=0 R7=ADR,R7=/$BLOCKSIZE ; page number R8=ADR,R8=%$BLOCKSIZE ; byte number CS=0 R0=0x52 ;Read opcode LOOP=(7,0) {SI=R0[I],SCK=P} ; opcode LOOP=(13,0){SI=R7[I],SCK=P} ; page address LOOP=(9,0) {SI=R8[I],SCK=P} ; byte address SI=0 LOOP=(15,0){SCK=P} ; 32 don't care bits LOOP=(15,0){SCK=P} SI=1 LOOP=($BLOCKSIZE){ LOOP=(7,0){SCK=P,DATA[I]=SO} ADR=+1 } CS=1 [_RDSTAT] ;Read Status Reg CS=0 R0=0x57 ;Read opcode LOOP=(7,0) {SI=R0[I],SCK=P} ; opcode SI=1 R9=0 LOOP=(7,0){SCK=P,R9[I]=SO} CS=1 [WRITEBLOCK] WP=1 R7=ADR,R7=/$BLOCKSIZE ; page number ; 1. BUFFER WRITE: CS=1 SCK=0 CS=0 R0=0x84 ;buffer write opcode LOOP=(7,0){SI=R0[I],SCK=P} ; opcode R0=0 LOOP=(23,0){SI=R0[I],SCK=P} ; address form 0 LOOP=($BLOCKSIZE){ LOOP=(7,0){SI=DATA[I],SCK=P} ; transfer data ADR=+1 } CS=1,P=10 ; 2. BUFFER TO MAIN MEMORY PAGE PROGRAM WITH BUILT-IN ERASE CS=0 R0=0x83 ; program opcode LOOP=(7,0){SI=R0[I],SCK=P} ; opcode LOOP=(13,0){SI=R7[I],SCK=P} ; page address R0=0 LOOP=(9,0){SI=R0[I],SCK=P} ; 9 don't care bits CS=1 ;P=20000 ; tEP delay LOOP=(0,200){ P=100 _RDSTAT R9=&0x80 ;Ready/Busy bit R9?0x80{BREAK} } ["Read Status"] _RDSTAT GET=("Read Status",R9)