下面是小弟的AT24C64的程序,弄了个把星期了,总是实现不了对其读写(我要读写的是浮点数),又不知道那里有问题,心中异常郁闷,请前辈们拉小弟一把!<br />void 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 IIC_stop()<br />{<br />SCK=0; <br />SDA=0;<br />_nop_();_nop_();_nop_();_nop_();<br />SCK=1; <br />_nop_();_nop_();_nop_();_nop_(); <br />SDA=1; <br />_nop_();_nop_();_nop_();_nop_();<br />SCK=0; <br />}<br />void IIC_ACK()<br />{<br />SDA=0; <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 IIC_NACK() <br />{ <br />SDA=1; <br />SCK=1; <br />_nop_();_nop_();_nop_();_nop_();<br />SCK=0; <br />}<br />bit IIC_Check_ACK()<br />{<br />_nop_();_nop_();_nop_();_nop_();<br />SDA=1;<br />SCK=1;<br />if(SDA==1)<br /> return 1;<br />else<br /> return 0;<br />SCK=0;<br />}<br />void IIC_Send_Byte( unsigned char d) <br />{ <br />unsigned char i=8; <br />while(i--) <br /> { <br /> _nop_();_nop_();_nop_();_nop_();<br /> if((d&0x80)==0x80)<br /> {<br /> SDA=1;<br /> SCK=1;<br /> _nop_();_nop_();_nop_();_nop_();<br /> SCK=0;<br /> SDA=0;<br /> }<br /> else <br /> {<br /> SDA=0; <br /> SCK=1;<br /> _nop_();_nop_();_nop_();_nop_();<br /> SCK=0; <br /> }<br /> d=d<<1; <br /> } <br />}<br />unsigned char IIC_Receive_Byte() <br />{ <br />unsigned char i=8,d; <br />while(i--) <br /> { <br /> _nop_();_nop_();_nop_();_nop_();<br /> SDA=1; <br /> SCK=1;<br /> d=d<<1;<br /> if (SDA==1)<br /> d=d|0x01; <br /> else<br /> d=d|0xfe;<br /> SCK=0; <br /> } <br />return d; <br />} <br />void IIC_Save_float(unsigned int addr,float n)<br />{<br />unsigned char i,*p=&n;<br />for(i=0;i<4;i++)<br /> {<br /> IIC_start();<br /> IIC_Send_Byte(0xA0);<br /> if(IIC_Check_ACK()==1) return;<br /> IIC_Send_Byte(addr/256);<br /> if(IIC_Check_ACK()==1) return;<br /> IIC_Send_Byte(addr%256);<br /> if(IIC_Check_ACK()==1) return;<br /> IIC_Send_Byte(*p);<br /> if(IIC_Check_ACK()==1) return;<br /> IIC_stop();<br /> _nop_();_nop_();_nop_();_nop_();<br /> p++;<br /> addr++;<br /> }<br /> EA=1;<br />}<br />void IIC_Read_float(unsigned int addr,float n)<br />{<br />unsigned char i,*p=&n;<br />for(i=0;i<4;i++)<br /> {<br /> IIC_start(); <br /> IIC_Send_Byte(0xA0);<br /> if(IIC_Check_ACK()==1) return;<br /> IIC_Send_Byte(addr/256);<br /> if(IIC_Check_ACK()==1) return;<br /> IIC_Send_Byte(addr%256);<br /> if(IIC_Check_ACK()==1) return;<br /> IIC_start();<br /> IIC_Send_Byte(0xA1);<br /> if(IIC_Check_ACK()==1) return;<br /> *p=IIC_Receive_Byte();<br /> _nop_();_nop_();_nop_();_nop_();<br /> IIC_NACK();<br /> IIC_stop();<br /> p++;<br /> addr++;<br /> }<br />EA=1;<br />} <br /><br /> |
|