欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

51单片机第五讲(IIC)

程序员文章站 2024-02-23 23:00:28
...

一.什么是IIC
IIC是集成电路总线,IIC总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。
51单片机第五讲(IIC)

每个接到I2C总线上的器件都有唯一的地址。主机与其它器件间的数据传送可以是由主机发送数据到其它器件,这时主机即为发送器。由总线上接收数据的器件则为接收器。
51单片机第五讲(IIC)

二.要掌握IIC的通信协议,需要掌握以下几个函数的写法:
1.起始信号 i2c_Start()
2.终止信号 i2c_Stop()
3.写数据 i2c_SendByte()
4.读数据 i2c_ReadByte()
5.发送应答信号 i2c_Ack()
6.发送非应答信号 i2c_Nack()
7.等待应答 i2c_WaitAck()
8.检测I2C总线设备 i2c_CheckDevice

1.起始信号和终止信号
SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
51单片机第五讲(IIC)

void i2c_Start(void)
{
    /* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */
    SDA = 1;
    SCL = 1;
    i2c_Delay();
    SDA = 0;
    i2c_Delay();
    SCL = 0;
    i2c_Delay();
}

/*
*********************************************************************************************************
*   函 数 名: i2c_Start
*   功能说明: CPU发起I2C总线停止信号
*   形    参:  无
*   返 回 值: 无
*********************************************************************************************************
*/
void i2c_Stop(void)
{
    /* 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 */
    SDA = 0;
    SCL = 1;
    i2c_Delay();
    SDA = 1;
    i2c_Delay();
}

2.应答和非应答
IIC 总线协议规定,每传送一个字节数据后,都要有一个应答信号以确定数据传送是否被对方收到。应答信号由接受设备产生,在SCL为高电平期间,接受设备将SDA拉低为低电平,表示数据传输正确,产生应答。
51单片机第五讲(IIC)

/*
*********************************************************************************************************
*   函 数 名: i2c_WaitAck
*   功能说明: CPU产生一个时钟,并读取器件的ACK应答信号
*   形    参:  无
*   返 回 值: 返回0表示正确应答,1表示无器件响应
*********************************************************************************************************
*/
unsigned char i2c_WaitAck(void)
{
     unsigned char re; //应答信号等于0则应答正确,等于1则没有应答
     SDA = 1;          //释放总线,能让对方拉低
     i2c_Delay();
     SCL = 1;          //此时刻开始,数据保持应答状态稳定
     i2c_Delay();
     if(SDA == 1)
     {
        re = 1;        //没有应答
     }
     else
     {
        re = 0;        //应答正确                                                                                                                                                                            
     }
     SCL = 0;
     i2c_Delay();

     return re;
}

3.IIC的数据传送
数据位的有效性规定:IIC总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
51单片机第五讲(IIC)

/*
*********************************************************************************************************
*   函 数 名: i2c_SendByte
*   功能说明: CPU向I2C总线设备发送8bit数据
*   形    参:  _ucByte : 等待发送的字节
*   返 回 值: 无
*********************************************************************************************************
*/
void i2c_SendByte(unsigned char _ucByte)
{
     unsigned char i;     //其实信号开始后SCL是被拉低的
     for(i = 0; i < 8; i++)
     {
        if(_ucByte & 0x80)
            SDA = 1;
        else
            SDA = 0;
        SCL = 1; 
        i2c_Delay();
        SCL = 0;      //SCL等于0的时候写数据
        if(i == 7)    //最后一次时释放总线
        {
            SDA = 1;
        }
        _ucByte<<=1;  //左移一位
        i2c_Delay();
     }
}

/*
*********************************************************************************************************
*   函 数 名: i2c_ReadByte
*   功能说明: CPU从I2C总线设备读取8bit数据
*   形    参:  无
*   返 回 值: 读到的数据
*********************************************************************************************************
*/
unsigned char i2c_ReadByte(void)
{
     unsigned char i;
     unsigned char value = 0;
     for(i = 0; i < 8; i++)
     {
        value<<=1;
        SCL = 1;  //稳定状态的时候读数据
        if(SDA == 1)
            value++;
        SCL = 0;  //允许数据变化
        i2c_Delay();
     }

     return value;
}

4.产生一个应答信号和一个非应答信号

/*
*********************************************************************************************************
*   函 数 名: i2c_Ack
*   功能说明: CPU产生一个ACK信号
*   形    参:  无
*   返 回 值: 无
*********************************************************************************************************
*/
void i2c_Ack(void)
{
    SDA = 0;//响应
    i2c_Delay();
    SCL = 1;
    i2c_Delay();
    SCL = 0;
    i2c_Delay();   //在SCL为高电平期间SDA都为0即产生一个应答信号
    SDA = 1;       //释放总线
    i2c_Delay();
}

/*
*********************************************************************************************************
*   函 数 名: i2c_NAck
*   功能说明: CPU产生1个NACK信号
*   形    参:  无
*   返 回 值: 无
*********************************************************************************************************
*/
void i2c_NAck(void)
{
     SDA = 1;
     i2c_Delay();
     SCL = 1;
     i2c_Delay();
     SCL = 0;
     i2c_Delay();   //在SCL为高电平期间SDA都为1即产生一个非应答信号
}

延时

/*
*********************************************************************************************************
*   函 数 名: i2c_Delay
*   功能说明: I2C总线位延迟,最快400KHz
*   形    参:  无
*   返 回 值: 无
*********************************************************************************************************
*/
static void i2c_Delay(void)
{
    unsigned char i;

    /* 
        IIC 延时时间根据具体情况自行决定for循环延迟时间的大小

        实际应用选择小于400KHz左右的速率即可
    */
    for (i = 0; i < 10; i++);
}
相关标签: IIC