rubin0513 发表于 2009-8-1 09:44:30

求教傻孩子;AT24C01一次写多少字节的问题

求教傻孩子:
我读了深入浅出AVR单片机的书,对300叶的需求分析的AT24C01的一次性读取1-128字节(整个AT24C01的容量),我认为AT24C01的容量是1K,容量应该是1024字节,望解答。

还有怎么样跳过页写看到不是很懂,AT24C01的应答信号的时序我在数据手册能看到,倒是非应答信号的时序就没有看到,不知道怎么编写非应答信号程序,求教!!!!!!!!!

NE5532 发表于 2009-8-1 20:00:08

第一个貌似笔误,这个数据与单片机的程序无关,只由后台控制,请以后台实际能写入的数据为准(不在家,回去看看)。页写的问题是由后台来跳过的,非应答看标志,至于怎么处理,一般是重发,看你的差错处理流程了。

oldfang 发表于 2009-8-1 20:21:58

1kBit吧

我也在学IIC读写程序,不过我就懂点汇编,网上的程序多是C的,找个汇编的比较困难

gongxd 发表于 2009-8-1 20:40:30

#include "AT89X52.H"
#include "SysFunction.h"

//记录开始位置
unsigned int RecordStart;

#define uchar unsigned char

//全局指针
volatile unsigned intfpoint;

//每页最大字节数
#define Maxpagesize 64

//最大存储空间32KB
#define Maxsize   0x8000

//===============================================
//数据区记录起始地址
#define datastartaddress 100
//1BYTE反页标志
#define dathead_recordflip   32
//==============================================


sbit ECLK=P2^6;
sbit ESDA=P2^5;
                                                            
sbit ACC0=ACC^0;
sbit ACC1=ACC^1;
sbit ACC2=ACC^2;
sbit ACC3=ACC^3;
sbit ACC4=ACC^4;
sbit ACC5=ACC^5;
sbit ACC6=ACC^6;
sbit ACC7=ACC^7;

//等待应答
void ask()
{
unsigned char i=0xff;
ESDA=1;
ECLK=1;
do
{
i--;
if(ESDA!=1)
   {
   ECLK=0;
   i=0;
   }
}while(i!=0);

}

/******************MCU应答从器件*****************************/
void I2cMasAck(void)
{            
ESDA=0;   
sysnop();sysnop();
ECLK=1;   
sysnop();
ECLK=0;   
sysnop();sysnop();
ESDA=1;   

}

/*-------------------------------------------------------------
发送无确认
------------------------------------------------------------*/
void NoAck()
{
ECLK = 0;
sysnop();
ESDA = 1;
sysnop();
ECLK = 1;
sysnop();
ECLK = 0;
sysnop();
}
/*###################################*/
/*24c256 stop */
void stop()
{
    ECLK=0;
sysnop();sysnop();
    ESDA=0;
sysnop();sysnop();
    ECLK=1;
sysnop();sysnop();
    ESDA=1;
sysnop();sysnop();
    ECLK=0;
sysnop();sysnop();

}
/* */
/*###################################*/
/*24c256 start 启动*/
void start()
{
    ESDA=1;sysnop();
    ECLK=1;sysnop();
    ESDA=0;sysnop();
    ECLK=0;sysnop();
}
/*###################################*/
//24c256 rdby i2c 读一字节
uchar rdby()
{   
    ESDA=1;
    ECLK=1;ACC7=ESDA;ECLK=0;
    ECLK=1;ACC6=ESDA;ECLK=0;
    ECLK=1;ACC5=ESDA;ECLK=0;
    ECLK=1;ACC4=ESDA;ECLK=0;
    ECLK=1;ACC3=ESDA;ECLK=0;
    ECLK=1;ACC2=ESDA;ECLK=0;
    ECLK=1;ACC1=ESDA;ECLK=0;
    ECLK=1;ACC0=ESDA;ECLK=0;
    return(ACC);
}

/*###################################*/
//24c256i2c 写一字节
void wrby(unsigned char x)
{
    ACC=x;
    ESDA=ACC7;ECLK=1;ECLK=0;
    ESDA=ACC6;ECLK=1;ECLK=0;
    ESDA=ACC5;ECLK=1;ECLK=0;
    ESDA=ACC4;ECLK=1;ECLK=0;
    ESDA=ACC3;ECLK=1;ECLK=0;
    ESDA=ACC2;ECLK=1;ECLK=0;
    ESDA=ACC1;ECLK=1;ECLK=0;
    ESDA=ACC0;ECLK=1;ECLK=0;
    ESDA=1;ECLK=1;

}


/*################################*/
//写入256的16位地址
void w16addr(unsigned int x)
{
    uchar m;uchar n;
    n=x;
    x=x>>8;
    m=x;
    wrby(m );
    ask();
    wrby(n );
    ask();
}

/*###################################*/
/*24c256 waddr 发送器件地址*/
void waddr()
{   
    start();
    wrby(0xa0);
    ask();
}



/*###################################*/
/*24c256 raddr 立即字节读*/
uchar raddr()
{
    start();
    wrby(0xa1);
    ask();
    ACC=rdby();
    stop();
    return(ACC);
}

/*########################################*/
/*24c256 随机字节读*/
uchar byteread(unsigned int x)
{
    waddr();
    w16addr(x);
    ACC=raddr();
    return(ACC);
}

/*######################################*/
/*24c256随机字节写 */
void bytewrite(unsigned int f,uchar x)
{
    waddr();
    w16addr(f);
    wrby(x);
    ask();
    stop();
        delayms(5);
}

/*######################################*/
//*24c256 页读
void pageread(uchar *x,uchar size)
{
        unsigned char sizetmp;
        if (size!=0)
        {
          waddr();
          w16addr(fpoint);
          start();
          wrby(0xa1);
                ask();
          for (sizetmp=1;sizetmp<size;sizetmp++)
          {
                       *x++=rdby();
                       I2cMasAck();   
          }
                *x=rdby();
      NoAck();
          stop();
      fpoint+=size;
      if(fpoint>Maxsize)
      {
         fpoint=fpoint-Maxsize;
      }
          //delayms(1);             

        }

}
/*######################################*/
//*24c256 连续写
voidpagewrite(unsigned char *x,unsigned char size)
{
    unsigned char i;

    waddr();
    w16addr(fpoint);
    for(i=0;i<size;i++)
    {
          wrby(x);
      fpoint++;
      ask();
          
          //页覆盖标志============================         
      if(fpoint%Maxpagesize==0)
      {
       if(fpoint==Maxsize) fpoint=datastartaddress;
       stop();
       delayms(10);
       waddr();
       w16addr(fpoint);   
      }
                    //页覆盖标志============================
          if(fpoint==RecordStart)
          {
           stop();
       delayms(10);
           bytewrite(dathead_recordflip,1);
           delayms(10);
       waddr();
       w16addr(fpoint);
          }

    }      
    stop();
        delayms(5);

}

/*######################################*/
//*24c256 从rom连续写
voidpagewriteR(unsigned char code *x,unsigned char size)
{
    unsigned char i;

    waddr();
    w16addr(fpoint);
    for(i=0;i<size;i++)
    {
          wrby(x);
      ask();
      fpoint++;
            
      if(fpoint%Maxpagesize==0)
      {
       if(fpoint==Maxsize) fpoint=datastartaddress;
       stop();
       delayms(2);
       waddr();
       w16addr(fpoint);   
      }


    }      
    stop();

}

/*######################################*/
/*24c256字节添加 */
void bytewriteW(uchar x)
{
    waddr();
    w16addr(fpoint);
    wrby(x);
    fpoint++;
    if(fpoint==Maxsize) fpoint=datastartaddress;
    ask();
    stop();
        delayms(10);
}

/*########################################*/
/*24c256 随机双字节读*/
unsigned int intread(unsigned int x)
{
unsigned int ret;
ret=byteread(x+1);
ret=(ret<<8) | byteread(x);
return ret;
}

/*######################################*/
/*24c256随机双字节写 */
void intwrite(unsigned int f,unsigned intx)
{
bytewrite(f,(unsigned char)x);
bytewrite(f+1,((unsigned char)(x>>8)));

}

whb06370283 发表于 2009-8-3 12:08:32

24C01容量是1Kb,每个字节8bit,所以容量是128字节(Byte)。
认真读读数据手册吧,看完了就什么都明白了。



点击此处下载 ourdev_466795.pdf(文件大小:576K) (原文件名:24c02串行储存器中文官方资料手册.pdf)

rubin0513 发表于 2009-8-4 16:33:49

谢谢了啊,谢谢楼上的解答
页: [1]
查看完整版本: 求教傻孩子;AT24C01一次写多少字节的问题