本帖最后由 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);
}
|