useisbb 发表于 2013-2-28 00:14:17

STC12C4052读写AT24C256问题收到FF

请大哥们帮忙看看程序
程序很简单。
5V供电AT24C256高速型的。
EEPROM换了一个还是这情况。
写完数据55还有应答,再写命令A0后就没有收到应答,之后就再没有应答信号了。
芯片应该没有问题,想问一下高手,见过没有开始有应答,后来就没有应答了。这是怎么搞的。
示波器看过波形虽然糟糕但是对于38K来说足够了。


自从没有应答,说明芯片就不认识主机发的数据了,自然不会再总线上返回数据。
请高手出面吧


上图了







下面是源码
while(1)
   {
   
   write_rom(0x0002,0x55);
   m=read_rom(0x0002);
   send_UART(0x55);
   send_UART(m);   
      DelayD(2000);
}
void start_rom()
{ //SCL 为高时,SDA 从高到低
SDA=1;
delay(2);
SCL=1;
delay(2);
SDA=0;
delay(2);
}
//**********************************************//
//函数名称:void stop_rom()
//函数功能:ROM 停止信号
//传入参数:无
//返回参数:无
//编写时间:2010-06-02
//**********************************************//
void stop_rom()
{ //SCL 为高时,SDA 从低到高
SDA=0;
delay(2);
SCL=1;
delay(2);
SDA=1;
delay(2);
}
//**********************************************//
//函数名称:void ack_rom()
//函数功能:ROM 应答信号
//传入参数:无
//返回参数:无
//编写时间:2010-06-02
//**********************************************//
void ack_rom()
{
SDA=1;
delay(2);
SCL=0;
delay(2);
SCL=1;
delay(2);
SCL=0;
delay(2);
}
//**********************************************//
//函数名称:void no_ack_rom()
//函数功能:无需应答
//传入参数:无
//返回参数:无
//编写时间:2010-06-02
//**********************************************//
void no_ack_rom()
{
SDA=1;
delay(2);
SCL=1;
delay(2);
SCL=0;
delay(2);
}
//**********************************************//
//函数名称:uchar read_rom(uint addr)
//函数功能:读取ROM 数据
//传入参数:addr 读取的地址
//返回参数:read_data 读取的数据
//编写时间:2010-06-02
//**********************************************//
uchar read_rom(uint addr)
{
uchar read_data=0,temp,i=8;
start_rom();
write_byte_rom(0xA0); //1010 0000,选择写操作
ack_rom();
write_byte_rom(addr/256); //写入地址高八位
//write_byte_rom(addr>>8); //写入地址高八位
ack_rom();
write_byte_rom(addr%256); //写入地址低八位
//write_byte_rom(addr&0xff); //写入地址低八位
ack_rom();
stop_rom();
start_rom();
write_byte_rom(0xA1); //1010 0001,选择读操作
ack_rom();
SDA=1; //IO 口方向改为输入
while(i--) //读取数据循环,从高位开始
{
read_data<<=1;
SCL=0;
delay(2);
SCL=1;
delay(2);
temp=SDA; //IO 口状态即为数据1 或0
read_data |= temp;
}
no_ack_rom();
stop_rom();
return read_data;
}
//**********************************************//
//函数名称:void write_byte_rom(uchar data)
//函数功能:向ROM 写入字节
//传入参数:data 待写入的字节
//返回参数:无
//编写时间:2010-06-02
//**********************************************//
void write_byte_rom(uchar dataa)
{
uchar i=8;
SCL=0;
delay(2);
while(i--)//写数据循环,从高位开始
{
if(dataa & 0x80) SDA=1; //将IO 口拉高,写入1
else SDA=0; //将IO 口拉低,写入0
delay(2);
dataa<<=1;
SCL=1;
delay(2);
SCL=0;
delay(2);
}
}
//**********************************************//
//函数名称:void write_rom(uchar addr,uchar data)
//函数功能:写数据到ROM
//传入参数:addr 写入的地址
//返回参数:read_data 待写入的数据
//编写时间:2010-06-02
//**********************************************//
void write_rom(uint addr,uchar dataa)
{
start_rom();
write_byte_rom(0xA0); //选择写操作
ack_rom();
write_byte_rom(addr/256); //写入地址高八位
//write_byte_rom(addr>>8); //写入地址高八位
ack_rom();
write_byte_rom(addr%256); //写入地址低八位
//write_byte_rom(addr&0xff); //写入地址低八位
ack_rom();
write_byte_rom(dataa); //写入数据
ack_rom();
stop_rom();
}

useisbb 发表于 2013-2-28 00:16:11

红圈那里就开始没有应答了
看手册应该有的。

wye11083 发表于 2013-2-28 07:58:37

看示波器波形,SCL上升沿是否足够快,SDA建立时间够不够。注意I2C是下拉型总线,OD输出,需要接1K电阻上拉。上拉不够或太小都会造成I2C不工作。

useisbb 发表于 2013-2-28 09:45:17

我用的51的P3口也接了5K上拉。38K速率

Mikle2016 发表于 2016-5-5 11:13:52

问题解决了吗?正在弄这个也有些问题。

小李非刀 发表于 2016-5-10 12:47:21

简单的I2C,除了时序,还是时序
页: [1]
查看完整版本: STC12C4052读写AT24C256问题收到FF