专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

I2C串行总线的操作程序

作者:佚名   来源:本站原创   点击数:  更新时间:2011年11月09日   【字体:
起始信号(时钟线为高,数据线由高变低):

void AT24C04_Start()

{

    SDA = 1;                    //拉高数据线

    SCL = 1;                    //拉高时钟线

    Delay5us();                 //延时

    SDA = 0;                    //产生下降沿

    Delay5us();                 //延时

    SCL = 0;                    //拉低时钟线

}

结束信号:(时钟线为高,数据线由低变高)

void AT24C04_Stop()

{

    SDA = 0;                    //拉低数据线

    SCL = 1;                    //拉高时钟线

    Delay5us();                 //延时

    SDA = 1;                    //产生上升沿

    Delay5us();                 //延时

}

字节传输:(每个字节为8位,一个字节带一个相应位)

发送数据:

void AT24C04_SendByte(BYTE dat)

{

    BYTE i;

 

    for (i=0; i<8; i++)         //8位计数器

    {

        dat <<= 1;              //移出数据的最高位

        SDA = CY;               //送数据口

        SCL = 1;                //拉高时钟线

        Delay5us();             //延时

        SCL = 0;                //拉低时钟线

        Delay5us();             //延时

    }

    AT24C04_RecvACK();

}

接收数据:

BYTE AT24C04_RecvByte()

{

    BYTE i;

    BYTE dat = 0;

 

    SDA = 1;                    //使能内部上拉,准备读取数据

    for (i=0; i<8; i++)         //8位计数器

    {

        dat <<= 1;

        SCL = 1;                //拉高时钟线

        Delay5us();             //延时

        dat |= SDA;             //读数据

        SCL = 0;                //拉低时钟线

        Delay5us();             //延时

    }

 

    return dat;

}

数据响应:

每次数据传输成功后,接收器件发送一个应答信号,当第九个信号产生是,产生应答信号的器件将SDA拉低。

接收起始条件和从地址后,应答,选择读写操作。

写操作,每接收一个字节,24c02发送一个应答信号。

读操作,发送一字节后释放总线,等待应答信号。接收到应答信号继续传输数据,接收到非应答信号,等待接收结束信号。

读数据时发送应答信号

void AT24C04_SendACK(bit ack)

{

    SDA = ack;                  //写应答信号

    SCL = 1;                    //拉高时钟线

    Delay5us();                 //延时

    SCL = 0;                    //拉低时钟线

    Delay5us();                 //延时

}

写数据时接收应答信号

bit AT24C04_RecvACK()

{

    SCL = 1;                    //拉高时钟线

    Delay5us();                 //延时

    CY = SDA;                   //读应答信号

    SCL = 0;                    //拉低时钟线

    Delay5us();                 //延时

 

    return CY;

}

页写和也读程序:

void AT24C04_WritePage()

{

    BYTE i;

 

    AT24C04_Start();            //起始信号

    AT24C04_SendByte(0xa0);     //发送设备地址+写信号

    AT24C04_SendByte(0x00);     //发送存储单元地址

    for (i=0; i<16; i++)

    {

        AT24C04_SendByte(TESTDATA[i]);

    }

    AT24C04_Stop();             //停止信号

}

 
关闭窗口

相关文章