; Orange programmer module v3.8 ; (c) 1999-2010 CnCLab ; CHIP=24C32 (4096x8), 24C65 (8192x8), 24C128 (16384x8), ; 24C256(32768x8), 24C512(65535x8) ; Page read/write support ; Acknowledge Polling SOCKET=1 ;"I2C" PING=SCL,0 PING=SDA,1 PINO=WP, 2 PINO=A0, 3 PINO=A1, 4 PINO=A2, 5 CDELAY=2 ; one cycle time ;R8=Polling,C1 R10=I2CADR,H2 [!#SETUP] ;R8=1 R10=0xA0 $WDELAY=0 [_START] SDA=1,SCL=1,SDA=0,SCL=0 ; Start 10 [_STOP] SCL=0,SDA=0,SCL=1,SDA=1 ; Stop 01 [INIT] A0=0,A1=0,A2=0 WP=1 R11=R10,R11=+1 ;ADDR RD [_POLLING] ; polling check _START R0=0 R1=R10 LOOP=(7,0) {SDA=R1[I],SCL=1,SCL=0} ; out 8 bits SDA=1,SCL=1,R0[0]=SDA ; ack store SCL=0,SDA=0 _STOP [_PWAIT] ; polling wait $WDELAY?>0{P=$WDELAY,RETURN} P=1000 R3=11 LOOP=(0,60){ _POLLING R0?0{BREAK} P=500,R3=+1 } ;R9=R3,R9=/2 [READ] _START LOOP=(7,0){SDA=R10[I],SCL=1,SCL=0} ; out 8 bits SDA=1,SCL=1,SDA?0 ; ack check SCL=0,SDA=0 LOOP=(15,8) {SDA=ADR[I],SCL=1,SCL=0} ; out 8 bits adr Hi SDA=1,SCL=1,SDA?0 ; ack check SCL=0,SDA=0 LOOP=(7,0) {SDA=ADR[I],SCL=1,SCL=0} ; out 8 bits adr Lo SDA=1,SCL=1,SDA?0 ; ack check SCL=0,SDA=0 SDA=1,SCL=1,SDA=0,SCL=0 ;start LOOP=(7,0){SDA=R11[I],SCL=1,SCL=0} ; out 8 bits SDA=1,SCL=1,SDA?0 ; ack check SCL=0 SDA=1 LOOP=(7,0){SCL=1,DATA[I]=SDA,SCL=0} ;read byte SDA=1,SCL=1,SCL=0 ; no ack _STOP [READBLOCK] _START LOOP=(7,0) {SDA=R10[I],SCL=1,SCL=0} ; out 8 bits SDA=1,SCL=1,SDA?0 ; ack check SCL=0,SDA=0 LOOP=(15,8) {SDA=ADR[I],SCL=1,SCL=0} ; out 8 bits adr Hi SDA=1,SCL=1,SDA?0 ; ack check SCL=0,SDA=0 LOOP=(7,0) {SDA=ADR[I],SCL=1,SCL=0} ; out 8 bits adr Lo SDA=1,SCL=1,SDA?0 ; ack check SCL=0,SDA=0 SDA=1,SCL=1,SDA=0,SCL=0 ;start LOOP=(7,0) {SDA=R11[I],SCL=1,SCL=0} ; out 8 bits SDA=1,SCL=1,SDA?0 ; ack check SCL=0,SDA=0 ;[READBLK] R0=$BLOCKSIZE,R0=-1 LOOP=(R0){ SDA=1 LOOP=(7,0){SCL=1,DATA[I]=SDA,SCL=0} ;read byte SDA=0,SCL=1,SCL=0 ;ack ADR=+1 } SDA=1 LOOP=(7,0){SCL=1,DATA[I]=SDA,SCL=0} ;read last byte SDA=1,SCL=1,SCL=0 ;no ack SDA=0,SCL=0,SCL=1,SDA=1,SCL=0;stop [WRITEINIT] WP=0 [WRITE] _START LOOP=(7,0) {SDA=R10[I],SCL=1,SCL=0} ; out 8 bits SDA=1,SCL=1,SDA?0 ; ack check SCL=0,SDA=0 LOOP=(15,8) {SDA=ADR[I],SCL=1,SCL=0} ; out 8 bits adr Hi SDA=1,SCL=1,SDA?0 ; ack check SCL=0,SDA=0 LOOP=(7,0) {SDA=ADR[I],SCL=1,SCL=0} ; out 8 bits adr Lo SDA=1,SCL=1,SDA?0 ; ack check SCL=0 LOOP=(7,0){SDA=DATA[I],SCL=1,SCL=0} ; write byte SDA=1,SCL=1,SDA?0 ; ack check SCL=0,SDA=0 SCL=0,SCL=1,SDA=1 ;stop _PWAIT [WRITEBLOCK] _START LOOP=(7,0) {SDA=R10[I],SCL=1,SCL=0} ; out 8 bits SDA=1,SCL=1,SDA?0 ; ack check SCL=0,SDA=0 LOOP=(15,8) {SDA=ADR[I],SCL=1,SCL=0} ; out 8 bits adr Hi SDA=1,SCL=1,SDA?0 ; ack check SCL=0,SDA=0 LOOP=(7,0) {SDA=ADR[I],SCL=1,SCL=0} ; out 8 bits adr Lo SDA=1,SCL=1,SDA?0 ; ack check SCL=0,SDA=0 LOOP=($BLOCKSIZE){ LOOP=(7,0){SDA=DATA[I],SCL=1,SCL=0} ; write byte SDA=1,SCL=1,SDA?0,SCL=0 ; ack check ADR=+1 } SCL=0,SDA=0 SCL=0,SCL=1,SDA=1 ;stop _PWAIT