打印

FM24C04写问题

[复制链接]
886|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tcc8073|  楼主 | 2015-3-3 08:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
fm, TE, sd, AC, ck
本帖最后由 tcc8073 于 2015-3-4 04:56 编辑

我用了个网上的程序写铁电的FM24C04,读没有问题,但是发现写的时候如果把那个字节写在前面的0-255,那么写一个数据进去后,整个256字节内容都被改成一样;如果写后面一区的0-255,后面这个区所有字节内容都被写成数据一样,不知道是什么原因,我对了下时序,没有发现错误,不知道是不是买到假的,还是我有什么细节的地方没有注意到,请使用过的高手给些建议。
#define IIC_READ 0XA1    //定义读指令
#define IIC_WRITE 0XA0   //定义写指令
#define NOP {_nop_();_nop_();}
sbit SDA=P3^3;//P3^3; //THE SDA BIT IS PORT 3 BIT 3
sbit SCL=P3^4;//P3^4; //THE SCL BIT IS PORT 3 BIT4
//*********************************************************************
//FUNCTION:ROUTES TO PROVIDE A START SIGNAL
void start(void)
{
SCL=0;SDA=1;SCL=1;SDA=0;SCL=0;
}
//=======================================
//FUNCTION:ROUTES TO PROVIDE A STOP SIGNAL
void stop(void)
{
SCL=0;NOP;NOP;SDA=0;NOP;NOP;SCL=1;NOP;NOP;SDA=1;NOP;NOP;SCL=0;
}
//=====================================
//FUNCTION:ROUTES TO PROVIDE ACK SINGAL
void ack(void)
{
SCL=0;NOP;SDA=0;NOP;SCL=1;NOP;SCL=0;
}
//=====================================
//FUNCTION:ROUTES TO RELEASE THE SDA TO RECEIVE A ACK SIGNAL
//              OR TO PROVIDE A NO_ACK SIGNAL
//type=1等待应答信号
//type=0 产生无应答信号
void nack(uchar type)
{
SCL=0;SDA=1;SCL=1;IFACK=SDA;SCL=0;
if(type)
{
  if(IFACK)//如果无应答信号,则置标志位NO_ACK,程序中止
  {
   NO_ACK=1;//用户可以加入自己的异常处理程序
   //while(1);
  }
  else NO_ACK=0;
}
}
//=======================================================
//FUNCTION:THE IIC DEVICE SHIFT OUT A BYTE  TO THE MASTER
uchar  inbyte(void) {//从IIC器件中读出数据
SDA=1;
SCL=1;a7=SDA;SCL=0;
SCL=1;a6=SDA;SCL=0;
SCL=1;a5=SDA;SCL=0;
SCL=1;a4=SDA;SCL=0;
SCL=1;a3=SDA;SCL=0;
SCL=1;a2=SDA;SCL=0;
SCL=1;a1=SDA;SCL=0;
SCL=1;a0=SDA;SCL=0;
return(bbyte);
}
//=======================================================
//FUNCTION:THE IIC DEVICE SHIFT IN A BYTE FROM THE MASTER
void outbyte(uchar outdata) {//将数据写放IIC器件
bbyte=outdata;
SDA=a7;SCL=1;NOP;SCL=0;
SDA=a6;SCL=1;NOP;SCL=0;
SDA=a5;SCL=1;NOP;SCL=0;
SDA=a4;SCL=1;NOP;SCL=0;
SDA=a3;SCL=1;NOP;SCL=0;
SDA=a2;SCL=1;NOP;SCL=0;
SDA=a1;SCL=1;NOP;SCL=0;
SDA=a0;SCL=1;NOP;SCL=0;
}
//======================================================
//FUNCTION:BYTE WRITE.  'add'THE WRITE ADDRESS,'wbyte'THE DATA WANT TO WRITE
void writebyte(uint add,uchar wbyte)//add为写入地址,wbyte为写入数据
{
uchar temph,templ;
temph=(uchar)(add/256);
templ=(uchar)(add%256);
start();    //开始信号
outbyte(IIC_WRITE);   //写命令
nack(1);   //等待应答
outbyte(temph);  //写地址
nack(1);   //等待应答
outbyte(templ); //写地址
nack(1);
outbyte(wbyte); //写数据
nack(1);   //等待应答
stop();    //停止信号
//stop();
NOP;
}
//=====================================================
//FUNCTION:RANDOM READ.'add' IS THE ADDRESS WANT TO READ
uchar readbyte (uint add)//add为读地址
{
uchar temp,temph,templ;
temph=(uchar)(add/256);
templ=(uchar)(add%256);
start();   //开始信号
outbyte(IIC_WRITE);   //写命令
nack(1);   //等待应答
outbyte(temph);  //写地址
nack(1);   //等待应答
outbyte(templ);  //写地址
nack(1);
start();   //开始信号
outbyte(IIC_READ);//读命令
nack(1);   //等待应答
temp=inbyte();   //读数据
nack(0);   //无应答
stop();    //停止信号
NOP;
return(temp);
}

相关帖子

沙发
dirtwillfly| | 2015-3-3 17:22 | 只看该作者
好奇怪的问题,第一次见这种问题

使用特权

评论回复
板凳
tcc8073|  楼主 | 2015-7-8 06:58 | 只看该作者
如果数据写在同一个页里面并且读第一页内的任何位置,读到的数据都是写入的数据,如果写在第一页,读第二页则不会,真有点奇怪,比如:原来302位置数值是0X35,现在writebyte(304,0XAD);再readbyte(302);得到的数据是0XAD,这有点奇怪,我的写和读用的都是指定读写。

使用特权

评论回复
地板
受不了了| | 2015-7-8 09:28 | 只看该作者
服了楼主了,一个24C04能拖几个月,我在马云家买的这片子都没遇到过假的

使用特权

评论回复
5
ningling_21| | 2015-7-8 09:52 | 只看该作者
还是用示波器看看数据线波形,是不是正确的

使用特权

评论回复
6
tcc8073|  楼主 | 2015-7-8 16:17 | 只看该作者
还没有用这个IC量产做产品,只是这二天翻出来测试了下,遇到这个问题奇怪而已,听说FM24C04寿命极其高,所以想把原来的AT24C04换了,换器件是很严肃的事情,AT24C04一直都很稳定,所以也就没有急着换,所以会多测试,发现问题就请教下,多指教啊!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

179

主题

1359

帖子

7

粉丝