打印

24c256,用字节的方式写数据,是否和页写入一样也有16个字节的

[复制链接]
6097|8
手机看帖
扫描二维码
随时随地手机跟帖
沙发
tiger84| | 2007-6-9 09:35 | 只看该作者

你仔细看一下说明书吧,上面写的很清楚

一次只写一个字节,何来缓冲的说法?
24C256具有64字节作为一页的写入功能,一次页写入最多可写64字节。

使用特权

评论回复
板凳
daguang72| | 2007-6-9 09:50 | 只看该作者

我的程序

//适用于AT24C128/256器件的读写程序(该2种器件页容量均为64)个字节
//                                                                   2006/12/19
///////////////////////////////////////////////////////////////////////////////
#pragma    optimize(5)
#include   "e:kc802C51INCSTCSTC89C51RC_RD_PLUS.h"
#include   "intrins.h"

#define    UCHAR                      unsigned char
#define    UINT                       unsigned int
#define    nop()                      _nop_()

sbit       SDA                      = P1^1;
sbit       SCL                      = P1^0;
///////////////////////////////////////////////////////////////////////////////
void I2C_Start(void){
    SCL=1;nop();nop();

    SDA=1;nop();nop();
    SDA=0;nop();nop();

    SCL=0;nop();nop();
}
void I2C_Stop(void){
    SDA=0;nop();nop();
    SCL=1;nop();nop();
    SDA=1;nop();nop();

    SCL=0;nop();nop();
}
void I2C_Ack(bit sig){
    SDA=sig;

    SCL=0;nop();nop();
    SCL=1;nop();nop();
    SCL=0;nop();nop();
}
UCHAR I2C_ReadByte(void){
    UCHAR i,rByte=0;

    SDA=1;
    for(i=0;i<8;i++){
        SCL=0;nop();nop();
        SCL=1;

        rByte<<=1;
        if(SDA==1){rByte+=1;}
    }
    SCL=0;

    return rByte;
}
bit I2C_WriteByte(UCHAR preByte){
    bit ack;
    UCHAR i;

    for(i=0;i<8;i++){
        SDA=0;
        if((preByte<<i)&0x80){SDA=1;}

        SCL=1;nop();nop();
        SCL=0;
    }
    SDA=1;nop();nop();//释放数据线,准备接收应答信号
    ack=SDA;
    
    SCL=1;nop();nop();
    SCL=0;            

    return ack;
}
///////////////////////////////////////////////////////////////////////////////
//每次对器件进行读写操作之前都要用此函数查询其忙状态,对MicroChip的24C16测试结果
//如下:
//    在22.1184M/12T时钟晶体的情况下,i典型值为16
//    在11.0592M/12T时钟晶体的情况下,i典型值为8
//sla-从器件地址,从A0H开始
///////////////////////////////////////////////////////////////////////////////
void I2C_AcknowledgePolling(UCHAR sla){
    UCHAR i;
    
    I2C_Start();
    for(i=0;i<30;i++){
        if(I2C_WriteByte(sla)==1){I2C_Start();}
        else{break;}
    }
}
bit I2C_SequentialRead_AT24C128_256(UCHAR sla,UINT suba,UCHAR *pHead,UCHAR len){
    UCHAR i;

    I2C_Start();
    if(I2C_WriteByte(sla)==1){return 0;}
    if(I2C_WriteByte((UCHAR)(suba>>8))==1){return 0;}
    if(I2C_WriteByte((UCHAR)suba)==1){return 0;}
    
    I2C_Start();
    if(I2C_WriteByte(sla+1)==1){return 0;}

    if(len>1){
        for(i=0;i<(len-1);i++){
            *pHead=I2C_ReadByte();
            I2C_Ack(0);
            pHead++;
        }
    }
    *pHead=I2C_ReadByte();

    I2C_Ack(1);
    I2C_Stop();

    return 1;
}
bit I2C_PageWrite_AT24C128_256(UCHAR sla,UINT suba,UCHAR* pHead,UCHAR len){
    UCHAR wLen;
    UINT  addr;
    
    wLen=len;
    addr=suba;
    ScrollPage:I2C_AcknowledgePolling();
               I2C_Start();
               if(I2C_WriteByte(sla)==1){return 0;}
               if(I2C_WriteByte((UCHAR)(addr>>8))==1){return 0;}
               if(I2C_WriteByte((UCHAR)addr)==1){return 0;}
               
               if(I2C_WriteByte(*pHeader)==1){return 0;}
               addr++;
               wLen--;
        
    while(wLen>0){
        if((addr%64)!=0){
            if(I2C_WriteByte(*pHeader)==1){return 0;}
            addr++;
            wLen--;
        }
        else{
            I2C_Stop();
            goto ScrollPage;
        }
    }
    I2C_Stop();
       
    return 1;     
}

使用特权

评论回复
地板
boating| | 2007-6-9 12:31 | 只看该作者

请教24c256的页写模式

24c256的页写模式中,每页是64个字节,但请问,他们是怎么换页的?

使用特权

评论回复
5
ayb_ice| | 2007-6-9 13:27 | 只看该作者

16位地址中的低6位就是一页

16位地址中的低6位就是一页,其余是页号。。。
一次连续写只能往一页写,超过就会回绕,所有要注意页地址范围。。。

使用特权

评论回复
6
daguang72| | 2007-6-9 14:17 | 只看该作者

我的程序里面已经带自动换页功能

软件自己算的,所以只要把起始地址和数据地址和长度带进去就行

使用特权

评论回复
7
tiger84| | 2007-6-9 14:52 | 只看该作者

原理很简单

一页只有64个字节,所以数据字地址的低六位在接收到一个字节后会自动加1,而高位地址不变,即页地址不变。当地址到达一页的边界时,系统将回到页的开始地址写数据,覆盖掉以前写的数据。
所以每次到达一页时,你都必须重新写入地址。这个很简单,自己写个小程序就可以了。

使用特权

评论回复
8
snakeemail|  楼主 | 2007-6-9 16:51 | 只看该作者

马的,偶就是页写入方式,谢谢楼上的

使用特权

评论回复
9
mohanwei| | 2007-6-9 20:44 | 只看该作者

建议看手册吧,说得够清楚了……

使用特权

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

本版积分规则

547

主题

1910

帖子

8

粉丝