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();
}
红圈那里就开始没有应答了
看手册应该有的。 看示波器波形,SCL上升沿是否足够快,SDA建立时间够不够。注意I2C是下拉型总线,OD输出,需要接1K电阻上拉。上拉不够或太小都会造成I2C不工作。 我用的51的P3口也接了5K上拉。38K速率 问题解决了吗?正在弄这个也有些问题。 简单的I2C,除了时序,还是时序
页:
[1]