; Orange programmer module v2.8 ; (c) 1999-2011 CnCLab ; CHIP=X24164,2K(16),x24164.hpl ; Block read/write supported. ; Diff. with 24C16 pins: S0,S1,S2,TEST SOCKET=1 ;"I2C" PING=SCL,0 PING=SDA,1 PINO=TEST,2 PINO=S0, 3 PINO=S1, 4 PINO=S2, 5 CDELAY=4 ; one cycle time [_START] SDA=1,SCL=1,SDA=0,SCL=0 ; Start 10 [_STOP] SCL=0,SDA=0,SCL=1,SDA=1 ; Stop 01 [_PWAIT] ; polling wait R0=0 R1=0xA0 LOOP=(0,60){ _START LOOP=(7,0) {SDA=R1[I],SCL=P} ; out 8 bits SDA=1,SCL=1,R0[0]=SDA ; ack store SCL=0,SDA=0 _STOP R0?0{BREAK} P=500 } [INIT] TEST=0 S0=0 S1=0 S2=0 [READ] _START R0=0xA LOOP=(3,0) {SDA=R0[I],SCL=P} ; out 4 bits DeviceAdr LOOP=(10,8){SDA=ADR[I],SCL=P} ; out 3 bits Hi(Adr) SDA=0,SCL=P ; out 1 bit, 0=Write Mode SDA=1,SCL=1,SDA?0,SCL=0 ; ACKN check ; end out DeviceAdr, Hi(Adr), Mode LOOP=(7,0) {SDA=ADR[I],SCL=P} ; out 8 bits Lo(Adr) SDA=1,SCL=1,SDA?0,SCL=0 ; ACKN check ; end out Lo(Adr) _START R0=0xA LOOP=(3,0) {SDA=R0[I],SCL=P} ; out 4 bits DeviceAdr LOOP=(10,8) {SDA=ADR[I],SCL=P} ; out 3 bits Hi(Adr) SDA=1,SCL=P ; out 1 bit, 1=Read Mode SDA=1,SCL=1,SDA?0,SCL=0 ; ACKN check ; end out DeviceSelect LOOP=(7,0) {SCL=1,DATA[I]=SDA,SCL=0} ; read byte Data SDA=1,SCL=P ; out master NO_ACKN _STOP [READBLOCK] _START R0=0xA LOOP=(3,0) {SDA=R0[I],SCL=P} ; out 4 bits DeviceAdr LOOP=(10,8){SDA=ADR[I],SCL=P} ; out 3 bits Hi(Adr) SDA=0,SCL=P ; out 1 bit, 0=Write Mode SDA=1,SCL=1,SDA?0,SCL=0 ; ACKN check ; end out DeviceAdr, Hi(Adr), Mode LOOP=(7,0) {SDA=ADR[I],SCL=P} ; out 8 bits Lo(Adr) SDA=1,SCL=1,SDA?0,SCL=0 ; ACKN check ; end out Lo(Adr) _START R0=0xA LOOP=(3,0) {SDA=R0[I],SCL=P} ; out 4 bits DeviceAdr LOOP=(10,8) {SDA=ADR[I],SCL=P} ; out 3 bits Hi(Adr) SDA=1,SCL=P ; out 1 bit, 1=Read Mode SDA=1,SCL=1,SDA?0,SCL=0 ; ACKN check ; end out DeviceSelect R8=$BLOCKSIZE R8=-1 LOOP(R8){ LOOP=(7,0) {SCL=1,DATA[I]=SDA,SCL=0} ; read byte Data SDA=0 SCL=P,SDA=1 ; out master ACKN ADR=+1 } LOOP=(7,0) {SCL=1,DATA[I]=SDA,SCL=0} ; read byte Data SDA=1 SCL=P ; out master NO_ACKN ADR=+1 _STOP [WRITE] _START R0=0xA LOOP=(3,0) {SDA=R0[I],SCL=P} ; out 4 bits DeviceAdr LOOP=(10,8) {SDA=ADR[I],SCL=P} ; out 3 bits Hi(Adr) SDA=0,SCL=P ; out 1 bit, 0=Write Mode SDA=1,SCL=1,SDA?0,SCL=0 ; ACKN check ; end out DeviceAdr, Hi(Adr), Mode LOOP=(7,0) {SDA=ADR[I],SCL=P} ; out 8 bits Lo(Adr) SDA=1,SCL=1,SDA?0,SCL=0 ; ACKN check ; end out Lo(Adr) LOOP=(7,0) {SDA=DATA[I],SCL=P} ; out byte Data SDA=1,SCL=1,SDA?0,SCL=0 ; ACKN check ; end out Data _STOP P=4000 ; delay: (Write Time) _PWAIT [WRITEBLOCK] _START R0=0xA LOOP=(3,0) {SDA=R0[I],SCL=P} ; out 4 bits DeviceAdr LOOP=(10,8) {SDA=ADR[I],SCL=P} ; out 3 bits Hi(Adr) SDA=0,SCL=P ; out 1 bit, 0=Write Mode SDA=1,SCL=1,SDA?0,SCL=0 ; ACKN check ; end out DeviceAdr, Hi(Adr), Mode LOOP=(7,0) {SDA=ADR[I],SCL=P} ; out 8 bits Lo(Adr) SDA=1,SCL=1,SDA?0,SCL=0 ; ACKN check ; end out Lo(Adr) LOOP=($BLOCKSIZE){ LOOP=(7,0) {SDA=DATA[I],SCL=P} ; out byte Data SDA=1,SCL=1,SDA?0,SCL=0 ; ACKN check ; end out Data ADR=+1 } _STOP P=4000 ; delay: (Write Time) _PWAIT