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