[ZLG-ARM] lpc2138的I2C查询方式对24lc02的读写

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

#define&nbsp;I2C0_PRI&nbsp;0//没有使用I2C中断方式
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

40

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部