
一般的 24都是允许一次性全部读出的只要你的时序没有问题
另外ack信号迟一点发送 不会影响读写的
你可以仔细看一下 at的 daatsheep看有没有256字节的限制.
普通的24是01-128字节 02=256字节...16=2047字节..
超过部分..器件会自动回到0地址处理,
/////////////////////////////////////////////
看了一下你,后面添加的程序.
如果你这样写.那么read_all那边就不需要用参数了.
因为如果读取,一般都是从0开始读取的..
另外x24c08_read如果是单字节读写函数.而且是正确的话
那么用
for (ii=0ii<4ii++)
{
for (iii=0iii<256iii++)
{
c=x24c08_read(ii,(uchar)iii)
SBUF=c
while (!TI)
这种方式的读取一定是没有问题.
有问题就是你的代码..或者你的eep本身坏了.
如果你感觉时许地上对的话..不妨看一下.
//////////////////////////////////
贴个程序给你看看,,,单片机没有I2C总线接口,只能靠软件模拟/*程序的I2C从器件地址为1010,片选地址为000*/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SDA=P1^7
sbit SCL=P1^6
void Delay(uint us)
{
for(usus>0us--)
}
void start_iic() // 启动I2C总线
{
SDA=1 // 发送起始条件数据信号,启动时,
SCL=1 // 必需使数据线、时钟信号线处于高电平(空闲态)
Delay(10) // 使用I2C总线必需考虑保持时间和建立时间,故延时
SDA=0 //产生下降沿,发送起始信号
Delay(10)
SCL=0
}
void stop_iic()
{
SDA=0 //为产生上跳沿做准备
SCL=1 //打开时钟线
Delay(10)
SDA=1 //产生停止信号(上跳沿有效)
Delay(10)
SCL=0 //时钟线恢复无效态//
}
void ack_iic()
{
SDA=0 // 接受器件发送应答信号
SCL=1
Delay(10)
SCL=0
SDA=1 //应答信号低电平有效,故需将其重新置高电平
}
void nack_iic()
{
SDA=1 //主器件发非应答信号,通知AT24C08不再发送数据
SCL=1
Delay(10)
SCL=0
SDA=0 //非应答信号高电平有效,故需将其重新置低电平
}
Write_byte(uchar c)
{
uchar i
for(i=0i<8i++)
{
if(c&0x80)SDA=1
else SDA=0
SCL=1
Delay(10)
SCL=0 //因为当时钟线有效是,数据线必须保持稳定的电平,
c=c<<1 //要改变SDA电平,应先将SCL拉低
}
SDA=1 //释放I2C总线,准备接受应答信号
SCL=1
Delay(10)
if(SDA==1)F0=0 //没有接到应答位
else F0=1
SCL=0
}
uchar Read_byte()
{
uchar i
uchar r=0
SDA=1 //置数据线为输入方式
for(i=0i<8i++)
{
r=r<<1
SCL=1
Delay(10) //保证一定的电平保持时间
if(SDA==1)r++ //从高位开始,一位一位的读
SCL=0
}
return r
}
main()
{
uchar slave=0xa0 //I2C总线从器件地址(注意:硬件电路的接法要是片选地址为0,否则不能工作)
uchar Rslave=slave+1 //主器件发送读控制字字节
uchar addre=0x20 // 指定的写数据地址
uchar wbuf=0x23 //将要写进addre的数据
uchar rbuf //存放读出的数据的临时变量
start_iic() //产生起始信号
Write_byte(slave) //发送从器件地址
if(F0==0)return 0 //检查应答位
Write_byte(addre) //发送目的地址
if(F0==0)return 0
Write_byte(wbuf) //发送8为数据
if(F0==0)return 0
stop_iic() //停止信号
/*8位的数据发送完毕*/
Delay(1000)
start_iic()
Write_byte(slave)
if(F0==0)return 0
Write_byte(addre)
if(F0==0)return 0
start_iic() //再次产生起始信号,不能少
Write_byte(Rslave) //送读控制字
if(F0==0)return 0
rbuf=Read_byte() //读出指定单元的内容
nack_iic() //非应答信号
stop_iic()
/*8位的数据读取完毕*/
TMOD=0x20 //串口调试
TL1=0xfd
TH1=0xfd
SCON=0x40
PCON=0x00
TR1=1
while(1)
{
SBUF=rbuf //放入缓冲
while(TI==0)
TI=0
Delay(10000)
}
}
发送和接收差不多,这里是个例子,有问题欢迎一起讨论
/*****************************************************
/* 文件名: I2C.h
/* 描述 : I2C.c的头文件
/* 编写环境 : Keil uVision 3 V3.51
/* 作者 : XX
/* 学校 : 广东XX大学
/* Email : lanhaospider@163.com
/* 版本 : V1.0
/* 编写日期 : 2008-3-30
/* 仅供学习参考
/* 芯片 : MCS-51 AT89S52
/* 晶振 : 11.0592MHz
/* 功能描述 : 模拟I2C总线的接口程序库,主机的程序
/* 应用 : 发送n个字节: 起始位->发送控制字节(类型标识符4位->
片选3位->读写位最后1位)->应答位->数据->应答...........应答->终止位
高位先到达,低位后到达
/****************************************************/
#include "reg51.h"/*根据不同主控芯片型号改写该套入*/
#include "intrins.h"
sbit SCL = P1^6 /*定义SCL线所在口,根据实践需要改写该定义*/
sbit SDA = P1^7 /*定义SDA线所在口,根据实践需要改写该定义*/
unsigned char idata error/*错误提示,全局变量*/
extern void Start_I2C(void)
extern void Stop_I2C(void)
extern void Ack_I2C(void)
extern void Send_Ack(void)
extern void Send_Not_Ack(void)
extern void Send_I2C(unsigned char send_byte)
extern unsigned char Receive_I2C(void)
/*****************************************************/
/* 文件名: I2C.c
/* 描述 : I2C通信程序
/* 编写环境 : Keil uVision 3 V3.51
/* 作者 : XX
/* 学校 : 广东XX大学
/* Email : lanhaospider@163.com
/* 版本 : V1.0
/* 编写日期 : 2008-3-30
/* 仅供学习参考
/* 芯片 : MCS-51 AT89S52
/* 晶振 : 11.0592MHz
/* 功能描述 : 模拟I2C总线的接口程序库,为主机的程序
/*****************************************************/
#include "I2C.h"
/**************************************************
调用方式 : void Start_I2C(void)
函数说明: 启动I2C总线
**************************************************/
void Start_I2C(void)
{
EA = 0 /*关总中断*/
SDA = 1 /*发送启动总线的数据信号*/
SCL = 1 /*发送启动总线的时钟信号*/
_nop_() /*保持数据线高,延时*/
_nop_()
_nop_()
_nop_()
_nop_()
SDA = 0 /*发送起始信号*/
_nop_()
_nop_()
_nop_()
_nop_()
_nop_()
SCL = 0 /*时钟线高低跳变一次,I2C通信开始*/
}
/**************************************************
调用方式 : void Stop_I2C(void)
函数说明: 关闭I2C总线
**************************************************/
void Stop_I2C(void)
{
SCL = 0/*发送关闭总线的时钟信号*/
SDA = 0/*发送关闭总线的数据信号*/
_nop_()
_nop_()
_nop_() /*保持数据线低,延时*/
_nop_()
_nop_()
SCL = 1 /*时钟线一次低高跳变,I2C通信停止*/
_nop_()
_nop_()
_nop_()
_nop_()
_nop_()
SDA = 1 /*发送I2C总线停止数据信号*/
_nop_()
_nop_()
_nop_()
_nop_()
_nop_()
EA = 1 /*开总中断*/
}
/**************************************************
调用方式 : void Ask_I2C(void)
函数说明: 主控程序等待从器件接收方式应答
**************************************************/
void Ack_I2C(void)
{
unsigned char errtimes = 0xFF
SDA = 1
SCL = 1
error = 0x10
while(SDA)
{
errtimes--
if(!errtimes)
{
Stop_I2C()
error = 0x11
return
}
}
SCL = 0
}
/**************************************************
调用方式 : void Send_Ask(void)
函数说明: 主控程序为接收方,从器件为发送方时,从
器件等待主器件应答
**************************************************/
void Send_Ack(void)
{
SDA = 0 /*保持数据线低,时钟线发生一次高低跳变 发送一个应答信号*/
_nop_()
_nop_()
_nop_()
_nop_()
_nop_()
SCL = 1 /*时钟线保持低电平*/
_nop_()
_nop_()
_nop_()
_nop_()
_nop_()
SCL = 0
}
/**************************************************
调用方式 : void Send_Not_Ask(void)
函数说明: 主控程序为接收方,从器件为发送方时,非应答信号
**************************************************/
void Send_Not_Ack(void)
{
SDA = 1 /*保持数据线高,时钟线发生一次高低跳变 没有应答*/
_nop_()
_nop_()
_nop_()
_nop_()
_nop_()
SCL = 1 /*时钟线保持高电平*/
_nop_()
_nop_()
_nop_()
_nop_()
_nop_()
SCL = 0
}
/**************************************************
调用方式 : void Send_I2C(unsigned char send_byte)
函数说明: 总线发送一个字节
**************************************************/
void Send_I2C(unsigned char send_byte)
{
unsigned char send_bit
for(send_bit = 8send_bit <= 0send_bit--)
{
SCL = 0
_nop_()
SDA = (send_byte &0x80)
send_byte<<=1
_nop_()
_nop_()
_nop_()
_nop_()
_nop_()
SCL = 1
_nop_()
_nop_()
_nop_()
_nop_()
_nop_()
}
SCL = 0
}
/**************************************************
调用方式 : unsigned char Receive_I2C(void)
函数说明: 从I2C总线上接收一个字节
**************************************************/
unsigned char Receive_I2C(void)
{
unsigned char receive_bit , receive_byte = 0
for(receive_bit = 8receive_bit <= 0receive_bit--)
{
SCL = 0
_nop_()
_nop_()
_nop_()
_nop_()
_nop_()
_nop_()
SCL = 1
_nop_()
_nop_()
_nop_()
_nop_()
_nop_()
receive_byte <<=1
receive_byte |= SDA
}
SCL = 0
return receive_byte
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)