搜索
bottom↓
回复: 5

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

[复制链接]

出0入0汤圆

发表于 2009-8-1 09:44:30 | 显示全部楼层 |阅读模式
求教傻孩子:
我读了深入浅出AVR单片机的书,对300叶的需求分析的AT24C01的一次性读取1-128字节(整个AT24C01的容量),我认为AT24C01的容量是1K,容量应该是1024字节,望解答。

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

出0入0汤圆

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

出0入0汤圆

发表于 2009-8-1 20:21:58 | 显示全部楼层
1kBit吧

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

出0入0汤圆

发表于 2009-8-1 20:40:30 | 显示全部楼层
#include "AT89X52.H"
#include "SysFunction.h"

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

#define uchar unsigned char

//全局指针
volatile unsigned int  fpoint;

//每页最大字节数
#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);
}

/*###################################*/
//24c256  i2c 写一字节
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 连续写
void  pagewrite(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连续写
void  pagewriteR(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 int  x)
{
bytewrite(f,(unsigned char)x);
bytewrite(f+1,((unsigned char)(x>>8)));

}

出0入0汤圆

发表于 2009-8-3 12:08:32 | 显示全部楼层
24C01容量是1Kb,每个字节8bit,所以容量是128字节(Byte)。
认真读读数据手册吧,看完了就什么都明白了。



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

出0入0汤圆

 楼主| 发表于 2009-8-4 16:33:49 | 显示全部楼层
谢谢了啊,谢谢楼上的解答
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-4 18:38

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表