; Orange programmer module v2.5 ; (c) 2010 CnCLab ; CHIP=AT45D011,135168(264) ; CHIP=AT45D021,270336(264) ; CHIP=AT45D041,540672(264) ; Atmel Serial DataFlash ; AT45D - 5V ; AT45DB - 3V ; primary tested! 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 PING=SO,1,7 ; info PINO=VCC,255,28 PING=VSS,6,1 CDELAY=1 ; one set delay R9=STATUS,C8,RDY,COMP,x,x ,x,x,x,x [_TXBYTE] LOOP=(7,0) {SI=R0[I],SCK=P} [_RXBYTE] R1=0 LOOP=(7,0) {SCK=P,R1[I]=SO} [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=(14,0){SI=R7[I],SCK=P} ; page address LOOP=(8,0) {SI=R8[I],SCK=P} ; byte address R0=0 SI=0,SCK=P32 ; 32 don't care bits 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=(14,0){SI=R7[I],SCK=P} ; page address LOOP=(8,0) {SI=R8[I],SCK=P} ; byte address SI=0,SCK=P32 ; 32 don't care bits 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} ADR=+1 } CS=1,P=5 ; 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=(14,0){SI=R7[I],SCK=P} ; page address SI=0 LOOP=(8,0){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) ["Read ID"] ;Read Status Reg SCK=0 CS=0 _TXBYTE(0x9F) ;Read ID opcode SI=1 R10=0 LOOP(4){ R10=<<8 _RXBYTE R10=|R1 } CS=1 PRINT=("ID=%08X",R10)