起始信号(时钟线为高,数据线由高变低):
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(0×00);     //发送存储单元地址
    for (i=0; i<16; i++)
    {
        AT24C04_SendByte(TESTDATA[i]);
    }
    AT24C04_Stop();             //停止信号
}

本文由刘翔奉献!版权归原作者所有。

如若复制、转载请注明原文地址:http://mtoou.info/i2c-zongxian/