#define I2EN 6<br />#define STA 5<br />#define STO 4<br />#define SI 3<br />#define AA 2<br /><br />__inline void IIC_Start(void)<br />{<br /> I2C0CONCLR = (1 << STA) | (1 << SI) | (1 << AA);<br /> I2C0CONSET = (1 << STA) | (1 << I2EN);<br />}<br />__inline void IIC_RepStart(void)<br />{<br /> I2C0CONCLR = (1 << STA) | (1 << SI) | (1 << AA);<br /> I2C0CONSET = (1 << STA) | (1 << I2EN);<br />}<br />__inline void IIC_Stop(void)<br />{<br /> I2C0CONCLR = (1 << STA)| (1 << SI);<br /> I2C0CONSET = (1 << STO);<br />}<br />__inline void IIC_Wait()<br />{<br /> while(!(I2C0CONSET & (1 << SI)));<br />}<br />__inline void IIC_WriteData(void)<br />{<br /> I2C0CONCLR = (1 << STA)| (1 << SI)| (1 << STO);<br />}<br />__inline void IIC_ReadAck(void)<br />{<br /> I2C0CONCLR = (1 << STA)| (1 << SI)| (1 << STO); <br /> I2C0CONSET = (1 << AA);<br />}<br />__inline void IIC_ReadNack(void)<br />{<br /> I2C0CONCLR = (1 << STA)| (1 << SI)| (1 << STO)| (1 << AA);<br />}<br />/*********************************************<br />*Function :Iic0非嵌套IRQ中断服务程序<br />*Create By:shannon<br />**********************************************/<br />void IRQIic0(void) __irq<br />{<br /> VICVectAddr = 0;//向量中断结束<br />}<br /><br />/*********************************************<br />*Function :iic0初始化程序<br />* 通讯频率固定在80K<br />*Create By:shannon<br />**********************************************/<br />uint8 Iic0Init(void)<br />{<br /> uint32 bak;<br /> uint32 addrOffset;<br /> <br /> pinmap.pin.p02 = GP002SCL0;<br /> pinmap.pin.p03 = GP003SDA0;<br /> PINSEL0 = pinmap.PinSel[0];<br />#if (I2C0_PRI > 0 && I2C0_PRI < 17)//1到16,0未用 <br /> VICIntSelect = VICIntSelect & ~(1 << (I2C0_PRI - 1));//设置相应的中断为IRQ中断<br /> addrOffset = (I2C0_PRI - 1) * 4; <br /> *(volatile uint32 *)(VICVectAddrBase + addrOffset) = (uint32)IRQIic0;//设置中断服务程序地址 <br /> *(volatile uint32 *)(VICVectCntlBase + addrOffset) = 0x20 | I2C0_INT;//分配中断<br /> VICIntEnable = 1 << I2C0_INT; //使能中断<br />#endif<br /><br /> I2C0SCLH = Fpclk / 160000;<br /> I2C0SCLL = Fpclk / 160000;<br /> return (1);<br />}<br /><br />void RTCWrite(uint8 ad,uint8 da)<br />{<br /> IIC_Start();<br /> IIC_Wait();<br /> <br /> I2C0DAT = 0xA0;<br /> IIC_WriteData();<br /> IIC_Wait();<br /> I2C0DAT = ad;<br /> IIC_WriteData();<br /> IIC_Wait();<br /> I2C0DAT = da;<br /> IIC_WriteData();<br /> IIC_Wait();<br /> IIC_Stop();<br />}<br /><br />uint8 RTCRead(uint8 ad)<br />{<br /> uint8 data;<br /> IIC_Start();<br /> IIC_Wait();<br /> I2C0DAT = 0xA0;<br /> IIC_WriteData();<br /> IIC_Wait();<br /> I2C0DAT = ad;<br /> IIC_WriteData();<br /> IIC_Wait();<br /> <br /> IIC_RepStart();<br /> IIC_Wait(); <br /> I2C0DAT = 0xA1;<br /> IIC_WriteData();<br /> IIC_Wait();<br /> IIC_ReadNack();<br /> IIC_Wait();<br /> data = I2C0DAT; <br /> IIC_Stop();<br /> return data;<br />} |
|