打印

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

[复制链接]
1457|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ly700620|  楼主 | 2008-9-23 18:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是小弟的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;


相关下载

相关帖子

沙发
hotpower| | 2008-9-23 19:10 | 只看该作者

出错return前要IIC_stop()

使用特权

评论回复
板凳
linjing| | 2008-9-24 20:25 | 只看该作者

2楼说的有道理

 if (SDA==1)
      d=d|0x01; 
   else
      d=d|0xfe;  // 写错了吧?!
   SCK=0; 
   } 
这一句肯定有问题,2楼说的也需要注意

其他的没仔细看,不过I2C读写不需要关中断,
另外建议程序构架使用以下方式:
I2C_Save( int address, const void * p, int count );
I2C_Load( int address,       void * p, int count );

调用时:
float t = 123.456f;
I2C_Save( 0, &t, sizeof(t));
I2C_Load( 0, &t, sizeof(t));

这样通用性更好一些


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

11

帖子

1

粉丝