void IICInit(void) {<br /> /* ### Init_IIC init code */<br /> /* IICF: MULT1=0,MULT0=1,ICR5=0,ICR4=0,ICR3=0,ICR2=0,ICR1=0,ICR0=0 */<br /> IICF = 0x40; <br /> /* IICA: ADDR7=0,ADDR6=0,ADDR5=0,ADDR4=0,ADDR3=0,ADDR2=0,ADDR1=0 */<br /> IICA = 0x00; <br /> /* IICS: TCF=0,IAAS=0,BUSY=0,ARBL=1,SRW=0,IICIF=1,RXAK=0 */<br /> IICS = 0x12; /* Clear the interrupt flags */<br /> /* IICC: IICEN=1 */<br /> IICC |= (unsigned char)0x80; <br /> /* IICC: IICEN=1,IICIE=0,MST=0,TX=1,TXAK=0,RSTA=0 */<br /> IICC = 0x90; <br />} <br /><br />void IICWriteByte(word adr, byte dt){<br /> word temp;<br /> gAdr=adr;<br /> <br /> temp = (gAdrH & 0x01) << 1; //get A8 of 24c04 address.<br /> IICC_TXAK=0;<br /> IICC|=0x30; //MST=1 TX=1 and generate START condition<br /> IICD =IIC_SLAVE_ADR|temp;<br /> while(!IICS_IICIF); //wait untill TX completed<br /> IICS_IICIF=1; //clear IICIF<br /> while(IICS_RXAK); //check for slave ack<br /> <br /> IICD = gAdrL;<br /> while(!IICS_IICIF); <br /> IICS_IICIF=1;<br /> while(IICS_RXAK); <br /> <br /> IICD=dt;<br /> while(!IICS_IICIF); <br /> IICS_IICIF=1;<br /> while(IICS_RXAK);<br /> <br /> IICS_IICIF=1;<br /> IICC_MST=0;<br />}<br /><br />void IICWriteN(word adr,byte *dt,byte n){<br /><br /> byte i;<br /> for(i=0;i<n;++i) {<br /> IICWriteByte(adr+i,dt);<br /> }<br />}<br /><br />byte IICReadByte(word adr){<br /><br /> word temp;<br /> byte d;<br /> <br /> gAdr=adr;<br /> temp = (gAdrH&0x01)<<1; //get A8 of 24c04 address.<br /> IICC_TXAK=0;<br /> IICC|=0x30; //MST=1 TX=1 and generate START condition<br /> IICD =IIC_SLAVE_ADR|temp;<br /> while(!IICS_IICIF); //wait untill TX completed<br /> IICS_IICIF=1; //clear IICIF<br /> while(IICS_RXAK); //check for slave ack<br /> <br /> IICD = gAdrL;<br /> while(!IICS_IICIF); <br /> IICS_IICIF=1;<br /> while(IICS_RXAK);<br /> <br /> IICS_IICIF=1;<br /> IICC_RSTA=1;<br /> <br /> IICD =IIC_SLAVE_ADR|temp;<br /> while(!IICS_IICIF); //wait untill TX completed<br /> IICS_IICIF=1; //clear IICIF<br /> while(IICS_RXAK); //check for slave ack<br /> <br /> IICC_TX=0;<br /> IICC_TXAK=1;<br /> d=IICD; //dummy read <br /> while(!IICS_IICIF); <br /> IICS_IICIF=1;<br /> IICC_MST=0;<br /> d=IICD;<br /> return d; <br />}<br /><br />byte* IICReadN(word adr,byte n){<br /> word temp;<br /> byte i,d;<br /> static byte * dt;<br /> <br /> gAdr=adr;<br /> temp = (gAdrH&0x01)<<1; //get A8 of 24c04 address.<br /> IICC_TXAK=0;<br /> IICC|=0x30; //MST=1 TX=1 and generate START condition<br /> IICD =IIC_SLAVE_ADR|temp;<br /> while(!IICS_IICIF); //wait untill TX completed<br /> IICS_IICIF=1; //clear IICIF<br /> while(IICS_RXAK); //check for slave ack<br /> <br /> IICD = gAdrL;<br /> while(!IICS_IICIF); <br /> IICS_IICIF=1;<br /> while(IICS_RXAK);<br /> <br /> IICS_IICIF=1;<br /> IICC_RSTA=1;<br /> <br /> IICD =IIC_SLAVE_ADR|temp|1;<br /> while(!IICS_IICIF); //wait untill TX completed<br /> IICS_IICIF=1; //clear IICIF<br /> while(IICS_RXAK); //check for slave ack<br /> <br /> IICC_TX=0;<br /> //IIC_TXAK=1;<br /> d=IICD; //dummy read <br /> while(!IICS_IICIF); <br /> IICS_IICIF=1;<br /> <br /> for(i=0;i<(n-1);++i){<br /> <br /> dt=IICD;<br /> while(!IICS_IICIF); <br /> IICS_IICIF=1;<br /> }<br /> IICC_TXAK=1;<br /> dt=IICD;<br /> while(!IICS_IICIF);<br /> IICC_MST=0;<br /> return dt;<br />} |
|