查看: 2692|回复: 0
打印 上一主题 下一主题

80C51单片机I2C串行总线器件的接口

[复制链接]
跳转到指定楼层
沙发
发表于 2014-12-10 20:06:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 李俊韬 于 2014-12-10 20:06 编辑

1、总线数据传送的模拟:主机可以采用不带I2C总线接口的单片机,如80C51、AT89C2051等单片机,利用软件实现I2C总线的数据传送,即软件与硬件结合的信号模拟。
典型信号模拟:
为了保证数据传送的可靠性,标准的I2C总线的数据传送有严格的时序要求。I2C总线的起始信号、终止信号、发送“0”及发送“1”的模拟时序 :

典型信号模拟子程序:
初始化IIC
void init_IIC()
{
        SDA=1;
        delay();
        SCL=1;
        delay();
}

起始信号
void start()
{
        SDA=1;
        delay();
        SCL=1;
        delay();
        SDA=0;
        delay();
}


终止信号
void stop()
{
        SDA=0;
        delay();
        SCL=1;
        delay();
        SDA=1;
        delay();
}


应答信号
void ack()
{
        uchar i=0;
        SCL=1;
        delay();
        while((SDA==1)&&(i<250))         {
                i++;
        }
        SCL=0;
        delay();
}


非应答信号
void noack()
{
        SDA=1;
        delay();
        SCL=1;
        delay();
        SCL=0;
        delay();
}


写一个字节
void Write_Byte(uchar dat)
{
        uchar i;
        for(i=0;i<8;i++)
        {
                SCL=0;
                delay();
                if(dat&0x80)
                {
                        SDA=1;
                }
                else
                {
                        SDA=0;
                }
                dat=dat<<1;
                SCL=1;
                delay();
        }
        SCL=0;
        delay();
        SDA=1;
        delay();        
}


读一个字节
uchar Read_Byte()
{
        uchar i,dat;
        SCL=0;
        delay();
        SDA=1;
        delay();
        for(i=0;i<8;i++)
        {
                SCL=1;
                delay();
                dat=dat<<1;
                if(SDA)
                {
                        dat++;
                }
                SCL=0;
                delay();
        }
        return dat;
}


写EEPROM
void Write_IIC(uchar add,uchar dat)
{
        start();
        Write_Byte(0xa0);
        ack();
        Write_Byte(add);
        ack();
        Write_Byte(dat);
        ack();
        stop();
}


读EEPROM
uchar Read_IIC(uchar add)
{
        uchar temp;
        start();
        Write_Byte(0xa0);
        ack();
        Write_Byte(add);
        ack();
        start();
        Write_Byte(0xa1);
        ack();
        temp=Read_Byte();
        noack();
        stop();
        return temp;
}


8uS延时
void delay()
{
        _nop_();_nop_();
        _nop_();_nop_();
        _nop_();_nop_();
        _nop_();_nop_();
}


2、I2C总线器件的扩展:
(1)、扩展电路:


(2)、串行E2PROM的扩展:
串行E2PROM典型产品:
ATMEL公司的AT24C系列:
AT24C01:128字节(128×8位)
AT24C02:256字节(256×8位)
AT24C04:512字节(512×8位)
AT24C08:1K字节(1K×8位);
AT24C16:2K字节(2K×8位);



写入过程:
AT24C系列E2PROM芯片地址的固定部分为1010,A2、A1、A0引脚接高、低电平后得到确定的3位编码。形成的7位编码即为该器件的地址码。单片机进行写操作时,首先发送该器件的7位地址码和写方向位“0”(共8位,即一个字节),发送完后释放SDA线并在SCL线上产生第9个时钟信号。被选中的存储器器件在确认是自己的地址后,在SDA线上产生一个应答信号作为相应,单片机收到应答后就可以传送数据了。传送数据时,单片机首先发送一个字节的被写入器件的存储区的首地址,收到存储器器件的应答后,单片机就逐个发送各数据字节,但每发送一个字节后都要等待应答。
AT24C系列器件片内地址在接收到每一个数据字节地址后自动加1,在芯片的“一次装载字节数”(不同芯片字节数不同)限度内,只需输入首地址。装载字节数超过芯片的“一次装载字节数”时,数据地址将“上卷”,前面的数据将被覆盖。

当要写入的数据传送完后,单片机应发出终止信号以结束写入操作。写入n个字节的数据格式 :




读出过程:
单片机先发送该器件的7位地址码和写方向位“0”(“伪写”),发送完后释放SDA线并在SCL线上产生第9个时钟信号。被选中的存储器器件在确认是自己的地址后,在SDA线上产生一个应答信号作为回应。然后,再发一个字节的要读出器件的存储区的首地址,收到应答后,单片机要重复一次起始信号并发出器件地址和读方向位(“1”),收到器件应答后就可以读出数据字节,每读出一个字节,单片机都要回复应答信号。当最后一个字节数据读完后,单片机应返回以“非应答”(高电平),并发出终止信号以结束读出操作。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入中科因仑

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

快速回复 返回顶部 返回列表