求教傻孩子;AT24C01一次写多少字节的问题
求教傻孩子:我读了深入浅出AVR单片机的书,对300叶的需求分析的AT24C01的一次性读取1-128字节(整个AT24C01的容量),我认为AT24C01的容量是1K,容量应该是1024字节,望解答。
还有怎么样跳过页写看到不是很懂,AT24C01的应答信号的时序我在数据手册能看到,倒是非应答信号的时序就没有看到,不知道怎么编写非应答信号程序,求教!!!!!!!!! 第一个貌似笔误,这个数据与单片机的程序无关,只由后台控制,请以后台实际能写入的数据为准(不在家,回去看看)。页写的问题是由后台来跳过的,非应答看标志,至于怎么处理,一般是重发,看你的差错处理流程了。 1kBit吧
我也在学IIC读写程序,不过我就懂点汇编,网上的程序多是C的,找个汇编的比较困难 #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)));
} 24C01容量是1Kb,每个字节8bit,所以容量是128字节(Byte)。
认真读读数据手册吧,看完了就什么都明白了。
点击此处下载 ourdev_466795.pdf(文件大小:576K) (原文件名:24c02串行储存器中文官方资料手册.pdf) 谢谢了啊,谢谢楼上的解答
页:
[1]