声明:代码确实写的不好,用的都是最笨的方法实现功能,不喜勿喷
对于EEPROM来说难就难在怎样看懂时序图,说实话其实我自己有的时候也看不太懂,我一般都会借助一下视屏来好好的理解一下。EEPROM在蓝桥板的电路图如下:
它的datasheet大家去百度就可以了,百度上有很多,在乎这里我只给出我自己写的关于EEPROM的驱动函数,供大家参考一下:
void Delay10ms() //@11.0592MHz
{
unsigned char i, j;
i = 108;
j = 145;
do
{
while (--j);
} while (--i);
}
//IIC开始函数
void IIC_statrt(void)
{
SDA = 1;
_nop_();
SCL = 1;
_nop_();
SDA = 0;
_nop_();
SCL = 0;
}
//IIC停止函数
void IIC_stop(void)
{
SDA = 0;
_nop_();
SCL = 1;
_nop_();
SDA = 1;
}
//将地址和数据写进IIC
void IIC_write(uchar add ,uchar dat)
{
IIC_statrt();
writebyte(0xa0);
ACK();
writebyte(add);
ACK();
writebyte(dat);
ACK();
IIC_stop();
Delay10ms();Delay10ms();//一定要加
}
//向IIC写一个字节
void writebyte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
SCL = 0;
_nop_();
SDA = dat&0x80;
_nop_();
SCL = 1;
dat<<=1;
}
SCL = 0;
_nop_();
}
void IIC_delay(uchar a)
{
do
{
_nop_();
}
while(a--);
}
//应答函数
uchar ACK(void)
{
SCL = 1;
IIC_delay(5);
if(SDA == 1)
{
SCL = 0;
IIC_stop();
return 0;
}
else
{
SCL = 0;
return 1;
}
}
//从IIC中读取数据
uchar IIC_read(uchar add)
{
uchar temp;
IIC_statrt();
writebyte(0xa0);
ACK();
writebyte(add);
ACK();
IIC_statrt();
writebyte(0xa1);
ACK();
temp = IIC_readbyte();
IIC_stop();
Delay10ms();
return temp;
}
//从IIC中读取一个字节
uchar IIC_readbyte()
{
uchar dat;
uchar i;
SCL = 0;
_nop_();
SCL = 1;
_nop_();
for(i=0;i<8;i++)
{
SCL = 1;
dat<<=1;
if(SDA)
{
dat |= 0x01;
}
SCL = 0;
}
return dat;
}