51单片机I2C总线的问题。为什么写不进到外部eeprom啊? 10

#include<reg51.h>#defineucharunsignedcharsbitSCL=P0^0;sbitSDA=P0^1;voiddelayms(void){... #include<reg51.h>
#define uchar unsigned char
sbit SCL=P0^0;
sbit SDA=P0^1;
void delayms(void)
{
{;;;}
}
//*******************init****************//
void init()
{
SDA=1;
delayms();
SCL=1;
delayms();
}
//**************start******************//
void start()
{

SDA=1;
delayms();
SCL=1;
delayms();
SDA=0;
}
//**********************stop*****************//
void stop()
{
SDA=0;
delayms();
SCL=1;
delayms();
SDA=1;
delayms();
}
//**********************writebyte******************//
void writebyte(uchar w_byte)
{
uchar temp,i;
temp=w_byte;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCL=0;
delayms();
SDA=CY;
delayms();
SCL=1;
delayms();
}
SCL=0;
delayms();
SDA=1;
delayms();
}
//*************************readbyte********************//
uchar readbyte()
{
uchar k,i;
SCL=0;
delayms();
SDA=1;
delayms();
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;
delayms();
k=(k<<1)|SDA;
SCL=0;
delayms();
}
return k;
}
//*********************respons********************//
void respons()
{
uchar i=0;
SCL=1;
delayms();
while((SDA==1)&&i<250) i++;
SCL=0;
delayms();
}
//***********************writedata*************************//
void writedata(uchar add,uchar w_data)
{
start();
writebyte(0xa0);
respons();
writebyte(add);
respons();
writebyte(w_data);
respons();
stop();

}
//***********************readdata***********************//
uchar readdata(uchar add)
{
uchar r_data;
start();
writebyte(0xa0);
respons();
writebyte(add);
respons();
start();
writebyte(0xa1);
respons();
r_data=readbyte();
stop();
return(r_data);
}
//*****************************************主函数*******************************//
void main()
{
uchar temp,a;
init();
writedata(0x02,0x5); //写入的地址+数据
temp=readdata(0x02); //从eeprom所要读出的地址,正常的话temp应该等于0x05
a=temp;
}
最后返回值temp=0。。。如果正常的话应该是temp=0x05
展开
 我来答
mj84pyz
2011-04-09 · TA获得超过570个赞
知道答主
回答量:504
采纳率:100%
帮助的人:0
展开全部
ead_byte()中第一个SCL=0:表示让对方输入数据;( I2C总线是SCL=0时从设备输出数据,SCL=1时主设备接收数据。)
第一个SDA=1:表示释放数据线,这样对方发数据到总线上,因为在SDA=0时,会线与,所以对方发不了数据。

write_byte中的“SCL = 0; delay(1); SDA = 1; delay(1); ”和read_byte()中一个意思。只是这里write_byte之后要接收应答信号。

可参考下面的资料
I2C总线信号时序分析

铁电存储器 FM24C16G(I2C接口) 数据手册
时钟芯片 DS3231(I2C接口) 数据手册
意法半导体(中国)投资有限公司
2023-06-12 广告
STM32F103是一款高性能的嵌入式芯片,由意法半导体(STMicroelectronics)公司生产。它是STM32系列芯片之一,具有紧凑、低功耗、高性能等特点,被广泛应用于嵌入式系统中。STM32F103的主要特点包括:1. 集成了A... 点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
dinosaurbd
2011-04-08 · 超过26用户采纳过TA的回答
知道答主
回答量:62
采纳率:0%
帮助的人:0
展开全部
我只能说你的时序肯定不对 你单步运行一下 与芯片手册进行核对 在写入和读出指令之间加个0.2MS的延时
更多追问追答
追问
加了。还是不行啊。我开始自己写的不行。这个是把书上的子程序抄下来了,然后主程序自己简单的写了一下。按你说,我的的时序那个地方不对啊?。。。我折腾了一天了都
追答
慢慢来 你用的是keil吗 还是WAVE  他们都可以单步运行 你先单步运行一下
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
seuzhouww
2011-04-09 · TA获得超过1386个赞
知道小有建树答主
回答量:658
采纳率:0%
帮助的人:311万
展开全部
SDA=CY;
这里不对吧?
左移会进位吗?
建议:改成 SDA=temp&0x80;
把temp=temp<<1; 放在后面试试。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式