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