1.延时问题
有些教材和技术资料对IIC基本信号的脉宽和延时有一定的时间要求,在上述基本信号和数据传送子函数中加入了若干延时操作指令;另一些教材和技术资料则无此要求。经编者实验验证,80 C51单片机在fosc=12 MHz条件下
,基本信号子函数和单字节读写子函数中的波形延时指令可以略去
但写N字节子函数中必须有页写缓冲延时,否则,写后若立即读AT24C02,将失败。
有关AT24Cxx页写缓冲的概念说明如下:
由于E⁹PROM的半导体工艺特性,对E²PROM的写入时间需要5~10ms
,但AT24Cxx系列串行E*PROM芯片内部设置了一个具有SRAM性质的输入缓冲器,称为页写缓冲器。CPU对该芯片写操作时,AT24Cxx系列芯片先将CPU输入的数据暂存在页写缓冲器内,然后,慢慢写入E²PROM中。因此,CPU对AT24Cxx系列E’PROM一次写入的字节数,受到该芯片页写缓冲器容量的限制。页写缓冲器的容量为16B,若CPU写入字节数超过芯片页写缓冲器容量,应在一页写完后,隔5~10 ms重新启动一次写操作。
IIC操作
//delayms:
void delayms(uint xms)
{
uchar x, y;
for(x = xms; x > 0; x--)
for(y = 110; y > 0; y--);
}
//start:
void start() //启动i2c
{
sda = 1;
scl = 1;
delay();//延时必须大于4.7us,此约为五微秒
sda = 0; //在scl为高电平时,sda一个下降沿为启动信号
delay();
}
//stop:
void stop() //停止i2c
{
sda = 0;
scl = 1;
delay();
sda = 1; //在scl为高电平时,sdasda一个上升沿为停止信号
delay();
}
//ack:
void ack() //应答信号0
{
uchar i = 0; //等待变量
scl = 1;//在scl为高电平期间等待应答
delay();
while((sda == 1) && i < 250)