AT24C02写一个数据然后读取一个数据是正确的,但是当写入多个数据时,读出数据就不正确,求指教?

 我来答
9reyson
推荐于2017-11-26
知道答主
回答量:1
采纳率:0%
帮助的人:2万
展开全部
恩,这个问题困扰了两天,终于找到原因并且顺利解决了!原因是:单片机接收应答信号(向AT24C02写数据时)和发送应答信号(AT24C02向单片机发送数据)的代码是不一样的!
void ack()//acknowledge (单片机接收应答信号)
{
uchar i;
scl=1;
delay();
while((sda == 1)&&(i > 250))
i++;
scl=0;//注意此处,此处表示第九个时钟结束,不能不写
delay();
}

void ack2(bit response)//(单片机发送的应答信号,response=1时是非应答,response=0时是应答!)
{
sda=response;
scl=1;
delay();
scl=0;
delay();
}
//然后严格遵循datasheet的操作时序
//读数据的代码是这样的()
void read_add(uchar address)
{

start();
write_byte(0xa0);
ack();
write_byte(address);
ack();//dummy write
start();
write_byte(0xa1);
ack();
P1=read_byte();
ack2(0);//这个应答才正确
// ack();这个应答不正确
P1=read_byte();
ack2(1);
delay();
stop();

}
//这里注意,我用郭天祥老师的TX-1C,给P1口赋值让lcd灯来检验我的应答信号是否正确
清鹏之
2020-04-06 · TA获得超过227个赞
知道答主
回答量:42
采纳率:100%
帮助的人:1.7万
展开全部
我找了几个小时的bug,终于找到 了,,,,你是不是多写一个等待信号。
——————————————错误代码如下
unsigned int read_E2prom(unsigned char adr)
{
unsigned int re;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(adr);
IIC_WaitAck();

IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
re=IIC_RecByte();
IIC_SendAck(0);
IIC_WaitAck();//这个代码多余,要删除。
re=(IIC_RecByte()<<8)|re;
IIC_Stop();
Delayms(5);
return re;
}

———————————————————正确代码如下
unsigned int read_E2prom(unsigned char adr)
{
unsigned int re;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(adr);
IIC_WaitAck();

IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
re=IIC_RecByte();
IIC_SendAck(0);
re=(IIC_RecByte()<<8)|re;
IIC_Stop();
Delayms(5);
return re;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Cindere鞡
2013-10-24 · TA获得超过7254个赞
知道大有可为答主
回答量:1148
采纳率:84%
帮助的人:512万
展开全部
注意写入位置和读取位置。
另外读写程序也要注意是否正确
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式