初学I2C总线,碰到点问题请高手解答

2019-07-16 04:43发布

以下是我写的I2C总线写E2PROM,然后读取出写入的数据,使P1口赋值为0XAA,但是为什么读出来的数据始终为0XFF呢?看了好多遍了,都不知道哪里出了错,只是仿真过读数错误,没烧写进单片机去试

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit SDA_i2c=P2^0;
sbit SCL_i2c=P2^1;
void delay_us()
{ ; ; }
void delay_ms(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void init_i2c()          //初始化I2C总线
{
SDA_i2c=1;          //SDA拉高
delay_us();
SCL_i2c=1;          //SCL拉高
delay_us();
}
void start_i2c()         //I2C启动信号
{
SDA_i2c=1;          //SDA拉高
delay_us();
SCL_i2c=1;          //SCL至高
delay_us();
SDA_i2c=0;          //SDA跳低
delay_us();
}
void stop_i2c()          //I2C停止信号
{
SDA_i2c=0;          //SDA置低
delay_us();
SCL_i2c=1;          //SCL至高
delay_us();
SDA_i2c=1;          //SDA跳高
delay_us();
}
void respond_i2c()         //I2C应答信号
{
uchar i;
SCL_i2c=1;
delay_us();
while((SDA_i2c==1)&&(i<250))
  i++;
SCL_i2c=0;
delay_us();
SDA_i2c=1;
delay_us();
}
void write_i2cByte(uchar dat)      //I2C写字节
{
uchar i,temp;
temp=dat;
SCL_i2c=0;
delay_us();
for(i=0;i<8;i++)
  {
   temp=temp<<1;
   SCL_i2c=0;
   delay_us();
   SDA_i2c=CY;
   delay_us();
   SCL_i2c=1;
   delay_us();
  }
SCL_i2c=0;
delay_us();
SDA_i2c=1;
delay_us();
}
void write_i2cAddressData(uchar address,uchar dat) //在某地址写入某数据
{
start_i2c();
write_i2cByte(0xae);
respond_i2c();
write_i2cByte(address);
respond_i2c();
write_i2cByte(dat);
respond_i2c();
stop_i2c();
}
uchar read_byte()         //I2C读字节
{
uchar i,i2c_dat;
SCL_i2c=0;
delay_us();
SDA_i2c=1;
delay_us();
for(i=0;i<8;i++)
  {
   SCL_i2c=0;
   delay_us();
   i2c_dat=(i2c_dat<<1)|SDA_i2c;
   delay_us();
   SCL_i2c=1;
   delay_us();
  }
return i2c_dat;
}
uchar read_i2cAddress(uchar address)    //从某个地址中读出数据
{
uchar date;
start_i2c();
write_i2cByte(0xae);
respond_i2c();
write_i2cByte(address);
respond_i2c();
start_i2c();
write_i2cByte(0xaf);
respond_i2c();
date=read_byte();
stop_i2c();
return date;
}
void main()
{
init_i2c();
write_i2cAddressData(1,0xaa);
delay_ms(100);
P1=read_i2cAddress(1);
while(1);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
lstcspring
1楼-- · 2019-07-16 07:45
为什么不烧进去试呢,用的什么住真器,量一下EEPROM的供电电压
j249081716
2楼-- · 2019-07-16 09:09
 精彩回答 2  元偷偷看……
ericsolo
3楼-- · 2019-07-16 11:05
我实验成功了,其实I2C是通过单片机IO口给E2PROM写入地址和数据,然后读的时候通过IO口从E2PROM指定地址读出写入的数据,完全根据51IO口模拟出来的I2C时序
昨天为什么不成功,分析了一下,SDA和SCL要接上拉电阻,我的实验板上24c02芯片没有接上拉电阻,这时我把P2口直接接SDA和SCL,烧进去程序也不对,后来原封不动的程序,将SDA和SCL口接P0口,由于P0口外部有接上拉电阻,另外这个程序再定义一个WP=P0^3,进入主程序将WP拉低,就可以通过I2C总线写入E2PROM的24C02了,读的时候也可以读取了。
程序是没有问题的,还是谢谢你们了!

一周热门 更多>