打印

24c64 程序 调不出来

[复制链接]
3397|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sdzhang1|  楼主 | 2009-9-17 17:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TE, ST, AD, AC, ck
我用的AT24c64,可写了程序怎么也调不出来,请高手指点一下,程序如下:
void Delay_ms(uint t)
{
   for(;t!=0;t--);
}
/**********************************************
**函数名称:void Start(void)
**函数功能:24c64开始信号
**说    明:无
***********************************************/
void Start(void)
{
   SDA=1;
   SCL=1;
   Delay_ms(200);
   SDA=0;
   Delay_ms(200);
   SCL=0;
}
/**********************************************
**函数名称:void Stop(void)
**函数功能:24c64停止信号
**说    明:无
***********************************************/
void Stop(void)
{
   SCL=0;
   SDA=0;
   Delay_ms(200);
   SCL=1;
   Delay_ms(200);
   SDA=1;
}
/***************************************************************************
void Ack(void)
{
   SDA=0;
   SCL=1;
   _nop_();
   _nop_();
   SCL=0;
   SDA=1;
} */
/***************************************************************************/
void NoAck()
{
   SDA=1;
   SCL=1;
   Delay_ms(200);
   SCL=0;
}
/***************************************************************************/
bit TestAck()
{
   bit ErrorBit;
   SDA=1;
   SCL=1;
   ErrorBit=SDA;
   SCL=0;
   return(ErrorBit);
}
/*****************************************************************
**函数名称:bit Write8Bit(uchar input)
**函数功能:写入一个字节
**说    明:无
/*****************************************************************/
void Write8Bit(uchar input)
{
   uchar temp;
   for(temp=8;temp!=0;temp--)
   {
      SDA=(bit)(input&0x80);
      SCL=1;
      SCL=0;
      input=input<<1;
   }
}
/********************************************************
**函数名称:void Write24c64_byte(uint add,uchar date)
**函数功能:往24c64中的某一地址写入一个字节的数据
**入口参数:uint add:数据地址(0000--8192)
           uchar date:具体写入的数据
/*******************************************************/
void Write24c64_byte(uint add,uchar date)
{
   Start();
   Write8Bit(add);
   TestAck();
   Write8Bit(date);
   TestAck();
   Stop();
   Delay_ms(1000);
}
/********************************************************
**函数名称:void Write24c64(uint add,uint date)
**函数功能:往24c64中的某一地址写入2个字节的数据
**入口参数:uint add:数据地址(0000--8192)
           uint date:具体写入的数据
/*******************************************************/
void Write24c64(uint add,uint date)
{
   uchar temp_L,temp_H;
   temp_L = (uchar)(date&0xff); //取低8位
   temp_H = (uchar)(date>>8);   //取高8位
   Write24c64_byte(add,temp_L);    //写低8位
   Write24c64_byte(add+1,temp_H);     //写高8位
}
/********************************************************
**函数名称:uchar Read8Bit(void)
**函数功能:实现从24c64中读出一个字节的数据
**说    明:无
**********************************************************/
uchar Read8Bit(void)
{
   uchar temp,rbyte=0;
   for(temp=8;temp!=0;temp--)
   {
      SCL=1;
      rbyte=rbyte<<1;
      rbyte=rbyte|((uchar)(SDA));
      SCL=0;
   }
   return(rbyte);
}
/*****************************************************
**函数名称:uchar Read24c64_byte(uint add)
**函数功能:从24c64中的某一地址取出一个字节的数据
**入口参数:uint add :存储器中的某一地址
****************************************************/
uchar Read24c64_byte(uint add)
{
   uchar date;
   Start();
   Write8Bit(add>>8);
   TestAck();
   Write8Bit(add);
   TestAck();
   Start();
   date =  Read8Bit();
   NoAck();
   Stop();
   return date;
}
/*****************************************************
**函数名称:uint Read24c64(uint add)
**函数功能:从24c64中的某一地址取出2个字节的数据
**入口参数:uint add :存储器中的某一地址
****************************************************/
uint Read24c64(uint add)
{
   uint temp, date;
   Start();
   Write8Bit(add>>8);
   TestAck();
   Write8Bit(add);
   TestAck();
   Start();
   temp =  Read8Bit();
   date = temp<<8;
   NoAck();
   Stop();
   add = add+1;
   Start();
   Write8Bit(add>>8);
   TestAck();
   Write8Bit(add);
   TestAck();
   Start();
   temp =  Read8Bit();
   date = temp+date;
   NoAck();
   Stop();
   return  date;
}

相关帖子

沙发
NE5532| | 2009-9-17 21:57 | 只看该作者
高手!=仿真器,不说现象的程序坚决不看。

使用特权

评论回复
板凳
涛行九天| | 2009-9-17 22:13 | 只看该作者
http://www.study-bbs.com/dispbbs ... ID=16233&page=1

到这里下载个现成的,自己对比一下吧

使用特权

评论回复
地板
zhaoyu2005| | 2009-9-17 22:42 | 只看该作者
写数据时没加延时
SDA=(bit)(input&0x80);
      SCL=1;
      SCL=0;
      input=input<<1;
得加两个延时;
读数据也是同样的问题
像这种问题,对着datasheet的时序要求计算下就知道了

使用特权

评论回复
5
ningling_21| | 2009-9-17 23:11 | 只看该作者
SCL=1;
      SCL=0;

中间的延时要保证在4.7US以上才行.....

使用特权

评论回复
6
sdzhang1|  楼主 | 2009-9-18 07:55 | 只看该作者
谢谢各位了,加延时调调看看

使用特权

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

本版积分规则

12

主题

31

帖子

0

粉丝