; Orange programmer module v2.2 ; (c) 1999-2004 CnCLab ; CHIP=24LC21 (128x8) Microchip ; Dual mode Serial EEPROM ; tested ok! SOCKET=1 ;"I2C" PING=SCL,0 PING=SDA,1 PINO=VCLK,2 ;PINO=NC0, 3 ;PINO=NC1, 4 ;PINO=NC2, 5 CDELAY = 5 ; one set delay [!#SETUP] R0=0xA0 ; write I2C address const R1=0xA1 ; read I2C address const [INIT] ;NC0=0,NC1=0,NC2=0 P=100 SCL=1 P=100 RE?!4{VCLK=1,SCL=1,P=10,SCL=0,P=10} ; switch to bi-dir mode if not USER section [READ] SDA=1,SCL=1,SDA=0,SCL=0 ;start LOOP=(7,0) {SDA=R0[I],SCL=1,SCL=0} ; 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=1,SCL=0} ; 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=R1[I],SCL=1,SCL=0} ; 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 [WRITE] SDA=1,SCL=1,SDA=0,SCL=0 ;start LOOP=(7,0) {SDA=R0[I],SCL=1,SCL=0} ; 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=1,SCL=0} ; 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=1,SCL=0} ; 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=25000 [ReadAll] ; Init transmit mode: SCL=1,SDA=1,VCLK=0,P=20 LOOP=(0,8){VCLK=1,VCLK=0} ; Read all data (transmit mode): ADR=0 LOOP=(0,127){ LOOP=(7,0){SCL=1,DATA[I]=SDA,SCL=0} ;read byte SCL=1,SCL=0 ;null bit? ADR=+1 }