; Orange programmer module v2.9 ; (c) 1999-2011 CnCLab, pavel-pervomaysk ; CHIP=24C01 (128x8), 24C02 (256x8) ; Orange3,4,5,SE SOCKET=1 ;"I2C" PING=SCL,0 PING=SDA,1 PINO=WP, 2 PINO=A0, 3 PINO=A1, 4 PINO=A2, 5 CDELAY = 4 ; one set delay R10=I2CADR,H2 [!#SETUP] R10=0xA0 $WDELAY=25000 [_START] SDA=1,SCL=1,SDA=0,SCL=0 ; Start 10 SDA?1{ P=200 SDA?1{PRINT=E("SDA line error 1"),EXIT} } [_STOP] SCL=0,SDA=0,SCL=1,SDA=1 ; Stop 01 SDA?0{P=200} [INIT] A0=0,R3=R10,R3=&2,R3?2{A0=1} ;setup pins A1=0,R3=R10,R3=&4,R3?4{A1=1} A2=0,R3=R10,R3=&8,R3?8{A2=1} WP=1,P=10 R11=R10 ; I2C address const R11=+1 ; = A1 [READ] _START LOOP=(7,0) {SDA=R10[I],SCL=P} ; out 8 bits 0xA0 SDA=0,SDA=1,SCL=1,SDA?0 ; ack check SCL=0,SDA=0 LOOP=(7,0) {SDA=ADR[I],SCL=P} ; out 8 bits SDA=0,SDA=1,SCL=1,SDA?0 ; ack check SCL=0,SDA=0 _START LOOP=(7,0){SDA=R11[I],SCL=P} ; out 8 bits 0xA1 SDA=0,SDA=1,SCL=1,SDA?0 ; ack check SCL=0 SDA=1 ;SDA Hi-Z LOOP=(7,0){SCL=1,DATA[I]=SDA,SCL=0} ;read byte SDA=1,SCL=1,SCL=0,SDA=0 ;master not asked SCL=0,SCL=1,SDA=1 ;stop [READBLOCK] _START LOOP=(7,0) {SDA=R10[I],SCL=P} ; out 8 bits 0xA0 SDA=0,SDA=1,SCL=1,SDA?0 ; ack check SCL=0,SDA=0 LOOP=(7,0) {SDA=ADR[I],SCL=P} ; out 8 bits SDA=0,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=P} ; out 8 bits 0xA1 SDA=0,SDA=1,SCL=1,SDA?0 ; ack check SCL=0 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 [WRITEINIT] WP=0 [WRITE] _START LOOP=(7,0) {SDA=R10[I],SCL=P} ; out 8 bits 0xA0 SDA=0,SDA=1,SCL=1,SDA?0 ; ack check SCL=0,SDA=0 LOOP=(7,0){SDA=ADR[I],SCL=P} ; out 8 bits address SDA=0,SDA=1,SCL=1,SDA?0 ; ack check SCL=0,SDA=0 LOOP=(7,0){SDA=DATA[I],SCL=P} ; out 8 bits data SDA=0,SDA=1,SCL=1,SDA?0 ; 0 - ack check? SCL=0,SDA=0 SCL=0,SCL=1,SDA=1 ;stop P=$WDELAY [WRITEBLOCK] _START LOOP=(7,0) {SDA=R10[I],SCL=P} ; out 8 bits 0xA0 SDA=0,SDA=1,SCL=1,SDA?0 ; ack check SCL=0,SDA=0 LOOP=(7,0){SDA=ADR[I],SCL=P} ; out 8 bits address SDA=0,SDA=1,SCL=1,SDA?0 ; ack check SCL=0,SDA=0 LOOP=($BLOCKSIZE){ LOOP=(7,0){SDA=DATA[I],SCL=P} ; out 8 bits data SDA=0,SDA=1,SCL=1,SDA?0 ; 0 - ack check? SCL=0,SDA=0 ADR=+1 } SCL=0,SCL=1,SDA=1 ;stop P=$WDELAY