; Orange programmer module v1.2 ; (c) 2003 CnCLab ; CHIP=MCM2814ATR,256x8,MCM2814.HPL ; Motorola ISO7816 SmartCard Chip (I2C) INFO="ISO7816 Adapter" SOCKET=1 PING=SCL,0 PING=SDA,1 PINO=RST,2 CDELAY = 4 ; one set delay R9=CardType,D [_START] SDA=1,SCL=1,SDA=0,SCL=0 ;start [_STOP] SDA=0,SCL=1,SDA=1,SCL=0 ;stop [_ACKCHK] SDA=1,SCL=1,SDA?0,SCL=0 ; ack check [_NOACK] SDA=1,SCL=1,SCL=0,SDA=0 ;master not asked [INIT] R0=0xA0 ; write I2C address const R1=0xA1 ; read I2C address const SCL=0 RST=1,P=20,RST=0,P=1000 [READ] _START LOOP=(7,0) {SDA=R0[I],SCL=1,SCL=0} ; out 8 bits A0 _ACKCHK LOOP=(7,0) {SDA=ADR[I],SCL=1,SCL=0} ; out 8 bits _ACKCHK _START LOOP=(7,0){SDA=R1[I],SCL=1,SCL=0} ; out 8 bits A1 _ACKCHK LOOP=(7,0){SDA=1,SCL=1,DATA[I]=SDA,SCL=0} ;read byte _NOACK _STOP [WRITE] P=10 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 LOOP=(7,0){SDA=DATA[I],SCL=1,SCL=0} ; out 8 bits SDA=0,SDA=1,SCL=1,SDA?0 ; 0 - ack check? SCL=0,SDA=0 SCL=0,SCL=1,SDA=1 ;stop P=25000 ;---------------------------------------------------------------- [_RDBYTE] _START LOOP=(7,0) {SDA=R0[I],SCL=1,SCL=0} ; out 8 bits A0 _ACKCHK LOOP=(7,0) {SDA=ADR[I],SCL=1,SCL=0} ; out 8 bits _ACKCHK _START LOOP=(7,0){SDA=R1[I],SCL=1,SCL=0} ; out 8 bits A1 _ACKCHK R3=0 LOOP=(7,0){SDA=1,SCL=1,DATA[I]=SDA,SCL=0} ;read byte _NOACK _STOP ; Повторяет первые 4 байта памяти ; выдача бит в противоположном порядке [ReadATR] SCL=0,SDA=1,RST=1,SCL=1,SCL=0,RST=0,P=10 R5=0 LOOP=(24,31){SCL=1,R5[I]=SDA,SCL=0} LOOP=(16,23){SCL=1,R5[I]=SDA,SCL=0} LOOP=(8,15){SCL=1,R5[I]=SDA,SCL=0} LOOP=(0,7) {SCL=1,R5[I]=SDA,SCL=0} PRINT=("ATR %08lX",R5)