\prog;xI2cR.asi|Routine I2C ; Attention, les transferts I2C se font en bank 1. Les variables ; doivent être à cheval sur les banques adr 16'70-16'77 \rout;StartWrite|Envoie l'adresse, la sous-adresse et le data ; Un bloc de data peut suivre. Il faut terminer par un stop \in:AdSlave adresse slave ;\in;RegI2C adresse registre \in;Datai2c donnée StartWrite: Start Move AdSlave,W Move W,ADi2c Call WriteI2C Move RegI2C,W Move W,AdI2C Call WriteI2C Move DataI2C,W Move W,AdI2C \rout:WriteI2C|Send address or data \in;ADi2c byte to be transmitted \out;Carry = 0 si ack \mod:ADi2c WriteI2C: Move #8,W Move W,CBit L$: RLC ADi2c Skip,CC SetSDA Skip,CS ClrSDA FullSCk DecSkip,EQ CBit Jump L$ SetSDA ; On attend un Ack ClrC Bank1to0 ; Acknowledge TestSkip,BC PortI2C:#bSDA ; CK doit être à 0 SetC Bank0to1 FullSCK Nop3 ClrSDA Ret \rout;StartRead|Envoie l'adresse esclave pour resélectionner en lecture ; Un bloc de data peut suivre, voir ReadI2C \in:AdSlave adresse slave \in;RegI2C sous-adresse \out;W = Adi2c donnée StartRead: Start Move AdSlave,W Move W,ADi2c Call WriteI2C Move RegI2C,W Move W,AdI2C Call WriteI2C Restart Move AdSlave,W Move W,ADi2c Inc Adi2c ; read address Call WriteI2C \rout:ReadI2C|Il faut faire suivre par un Ack ou Nack, puis un Stop \out:ADi2c & W ; SDA =XX==^========= \mod:ADi2c ; SCK \...../''''\... 5us 5/6\mu;s ReadI2C: Move #8,W Move W,CBit SetSDA L$: Bank1to0 ClrC TestSkip,BC PortI2C:#bSDA ; SCK à 0 SetC RLC ADi2c Bank0to1 FullSCK DecSkip,EQ CBit Jump L$ Move AdI2c,W Ret \rout;GiveNAckStop| GiveNACkStop: SetSDA Nop FullSCk Nop \rout;StopR|Routine Stop (pas confondre avec macro Stop) StopR: ClrSDA Nop2 SetSCK ; SDA ....../'''' Nop2 SetSDA ; SCK ../'''''''' Bank1to0 Ret \rout;GiveAckR| <> macro GiveAckR: ClrSDA Nop FullSCk Nop SetSDA Ret \rout;GiveNAckR| <> macro GiveNACkR: SetSDA Nop FullSCk Nop Ret .End