请用过AT24C64的大侠们帮帮我!@

[复制链接]
2320|2
 楼主| ly700620 发表于 2008-9-23 18:47 | 显示全部楼层 |阅读模式
下面是小弟的AT24C64的程序,弄了个把星期了,总是实现不了对其读写(我要读写的是浮点数),又不知道那里有问题,心中异常郁闷,请前辈们拉小弟一把!<br />void&nbsp;IIC_start()<br />{<br />EA=0;<br />SCK=0;<br />SDA=1;<br />_nop_();_nop_();_nop_();_nop_();<br />SCK=1;<br />_nop_();_nop_();_nop_();_nop_();<br />SDA=0;<br />_nop_();_nop_();_nop_();_nop_();<br />SCK=0;<br />_nop_();_nop_();_nop_();_nop_();<br />SDA=1;<br />}<br />void&nbsp;IIC_stop()<br />{<br />SCK=0;&nbsp;<br />SDA=0;<br />_nop_();_nop_();_nop_();_nop_();<br />SCK=1;&nbsp;<br />_nop_();_nop_();_nop_();_nop_();&nbsp;<br />SDA=1;&nbsp;<br />_nop_();_nop_();_nop_();_nop_();<br />SCK=0;&nbsp;<br />}<br />void&nbsp;IIC_ACK()<br />{<br />SDA=0;&nbsp;<br />SCK=1;<br />_nop_();_nop_();_nop_();_nop_();<br />SDA=0;&nbsp;<br />_nop_();_nop_();_nop_();_nop_();&nbsp;<br />SCK=0;&nbsp;<br />_nop_();_nop_();_nop_();_nop_();&nbsp;<br />SDA=1;&nbsp;<br />}<br />void&nbsp;IIC_NACK()&nbsp;<br />{&nbsp;<br />SDA=1;&nbsp;<br />SCK=1;&nbsp;<br />_nop_();_nop_();_nop_();_nop_();<br />SCK=0;&nbsp;<br />}<br />bit&nbsp;IIC_Check_ACK()<br />{<br />_nop_();_nop_();_nop_();_nop_();<br />SDA=1;<br />SCK=1;<br />if(SDA==1)<br />&nbsp;&nbsp;return&nbsp;1;<br />else<br />&nbsp;&nbsp;return&nbsp;0;<br />SCK=0;<br />}<br />void&nbsp;IIC_Send_Byte(&nbsp;unsigned&nbsp;char&nbsp;d)&nbsp;<br />{&nbsp;<br />unsigned&nbsp;char&nbsp;i=8;&nbsp;<br />while(i--)&nbsp;<br />&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;_nop_();_nop_();_nop_();_nop_();<br />&nbsp;&nbsp;&nbsp;if((d&0x80)==0x80)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SDA=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCK=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_nop_();_nop_();_nop_();_nop_();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCK=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SDA=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;else&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SDA=0;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCK=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_nop_();_nop_();_nop_();_nop_();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCK=0;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;d=d&lt&lt1;&nbsp;<br />&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />}<br />unsigned&nbsp;char&nbsp;IIC_Receive_Byte()&nbsp;<br />{&nbsp;<br />unsigned&nbsp;char&nbsp;i=8,d;&nbsp;<br />while(i--)&nbsp;<br />&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;_nop_();_nop_();_nop_();_nop_();<br />&nbsp;&nbsp;&nbsp;SDA=1;&nbsp;<br />&nbsp;&nbsp;&nbsp;SCK=1;<br />&nbsp;&nbsp;&nbsp;d=d&lt&lt1;<br />&nbsp;&nbsp;&nbsp;if&nbsp;(SDA==1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d=d|0x01;&nbsp;<br />&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d=d|0xfe;<br />&nbsp;&nbsp;&nbsp;SCK=0;&nbsp;<br />&nbsp;&nbsp;&nbsp;}&nbsp;<br />return&nbsp;d;&nbsp;<br />}&nbsp;<br />void&nbsp;IIC_Save_float(unsigned&nbsp;int&nbsp;addr,float&nbsp;n)<br />{<br />unsigned&nbsp;char&nbsp;i,*p=&n;<br />for(i=0;i&lt4;i++)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;IIC_start();<br />&nbsp;&nbsp;&nbsp;IIC_Send_Byte(0xA0);<br />&nbsp;&nbsp;&nbsp;if(IIC_Check_ACK()==1)&nbsp;return;<br />&nbsp;&nbsp;&nbsp;IIC_Send_Byte(addr/256);<br />&nbsp;&nbsp;&nbsp;if(IIC_Check_ACK()==1)&nbsp;return;<br />&nbsp;&nbsp;&nbsp;IIC_Send_Byte(addr%256);<br />&nbsp;&nbsp;&nbsp;if(IIC_Check_ACK()==1)&nbsp;return;<br />&nbsp;&nbsp;&nbsp;IIC_Send_Byte(*p);<br />&nbsp;&nbsp;&nbsp;if(IIC_Check_ACK()==1)&nbsp;return;<br />&nbsp;&nbsp;&nbsp;IIC_stop();<br />&nbsp;&nbsp;&nbsp;_nop_();_nop_();_nop_();_nop_();<br />&nbsp;&nbsp;&nbsp;p++;<br />&nbsp;&nbsp;&nbsp;addr++;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;EA=1;<br />}<br />void&nbsp;IIC_Read_float(unsigned&nbsp;int&nbsp;addr,float&nbsp;n)<br />{<br />unsigned&nbsp;char&nbsp;i,*p=&n;<br />for(i=0;i&lt4;i++)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;IIC_start();&nbsp;<br />&nbsp;&nbsp;&nbsp;IIC_Send_Byte(0xA0);<br />&nbsp;&nbsp;&nbsp;if(IIC_Check_ACK()==1)&nbsp;return;<br />&nbsp;&nbsp;&nbsp;IIC_Send_Byte(addr/256);<br />&nbsp;&nbsp;&nbsp;if(IIC_Check_ACK()==1)&nbsp;return;<br />&nbsp;&nbsp;&nbsp;IIC_Send_Byte(addr%256);<br />&nbsp;&nbsp;&nbsp;if(IIC_Check_ACK()==1)&nbsp;return;<br />&nbsp;&nbsp;&nbsp;IIC_start();<br />&nbsp;&nbsp;&nbsp;IIC_Send_Byte(0xA1);<br />&nbsp;&nbsp;&nbsp;if(IIC_Check_ACK()==1)&nbsp;return;<br />&nbsp;&nbsp;&nbsp;*p=IIC_Receive_Byte();<br />&nbsp;&nbsp;&nbsp;_nop_();_nop_();_nop_();_nop_();<br />&nbsp;&nbsp;&nbsp;IIC_NACK();<br />&nbsp;&nbsp;&nbsp;IIC_stop();<br />&nbsp;&nbsp;&nbsp;p++;<br />&nbsp;&nbsp;&nbsp;addr++;<br />&nbsp;&nbsp;&nbsp;}<br />EA=1;<br />}&nbsp;<br /><br />
hotpower 发表于 2008-9-23 19:10 | 显示全部楼层

出错return前要IIC_stop()

  
linjing 发表于 2008-9-24 20:25 | 显示全部楼层

2楼说的有道理

&nbsp;if&nbsp;(SDA==1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d=d|0x01;&nbsp;<br />&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d=d|0xfe;&nbsp;&nbsp;//&nbsp;写错了吧?!<br />&nbsp;&nbsp;&nbsp;SCK=0;&nbsp;<br />&nbsp;&nbsp;&nbsp;}&nbsp;<br />这一句肯定有问题,2楼说的也需要注意<br /><br />其他的没仔细看,不过I2C读写不需要关中断,<br />另外建议程序构架使用以下方式:<br />I2C_Save(&nbsp;int&nbsp;address,&nbsp;const&nbsp;void&nbsp;*&nbsp;p,&nbsp;int&nbsp;count&nbsp;);<br />I2C_Load(&nbsp;int&nbsp;address,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;*&nbsp;p,&nbsp;int&nbsp;count&nbsp;);<br /><br />调用时:<br />float&nbsp;t&nbsp;=&nbsp;123.456f;<br />I2C_Save(&nbsp;0,&nbsp;&t,&nbsp;sizeof(t));<br />I2C_Load(&nbsp;0,&nbsp;&t,&nbsp;sizeof(t));<br /><br />这样通用性更好一些<br /><br /><br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

11

帖子

1

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