⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.c

📁 提供I2C总线初始化、工作时的启始位、结束位、提供I2C总线的时钟信号
💻 C
字号:
/***************************************************
*函数原形:void function I2C_start(void);
*功    能:提供I2C总线工作时的启始位
*
**************************************************/
void function I2C_start(void)
{
        SCL=HIGH;
        delay_10us();
        SDA=LOW;
        delay_10us();
        SCL=LOW;
        delay_10us();
}


/***************************************************
*函数原形:void function I2C_stop(void);
*功    能:提供I2C总线工作时的结束位
*
**************************************************/
void function I2C_stop(void)
{
        SDA=LOW;
        delay_10us();
        SCL=HIGH;
        delay_10us();
        SDA=HIGH;
        delay_10us();
        SCL=LOW;
        delay_10us();
}


/***************************************************
*函数原形:void function I2C_init(void);
*功    能:I2C总线初始化,在main()函数中应首先调用
*          本函数,然后再调用其它函数。
**************************************************/
//void function I2C_init(void)
//{
//        SCL=LOW;
//        I2C_stop();
//}

/******************************************************************
*函数原形:bit function I2C_clock(void);
*功    能:提供I2C总线的时钟信号,并返回在时钟电平为高期间
*          SDA信号线上状态。本函数可用于数据发送,也可用于数据接收
******************************************************************/
bit function I2C_clock(void)
{
        bit sample1;
        SCL=HIGH;
        _nop_;
        _nop_;
        _nop_;
//        delay_10us();
        sample1=SDA;
        _nop_;
        SCL=LOW;
        _nop_;
        _nop_;
        _nop_;
//0412  delay_10us();
        return(sample1);
}

/****************************************************************
*函数原形:bit function I2C_send(byte I_data);
*功    能:向I2C总线发送8位数据,并请求一个应答信号ACK,如果收到
*          ACK应答信号则返回1,否则返回FALSE(0)
*****************************************************************/
bit function I2C_send(byte I_data)
{
byte i;
/*发送8位数据*/
for (i=0;i<8;i++)
    {
     SDA=(bit)(I_data & 0x80);
     I_data=I_data<<1;
     I2C_clock();
    }
    /*请求应答信号ACK*/
    SDA=HIGH;
    return(~I2C_clock());
}

/****************************************************************
*函数原形:byte function I2C_receive(void);
*功    能:从I2C总线上接收8位数据信号,并将接收到的8位数据作为一个
*          字节返回,不回送应答信号ACK。主函数在调用本函数之前应
*          保证SDA信号线处于浮置状态,即使8051的P1.7脚置1。
*****************************************************************/
byte function I2C_receive(void)
{
        byte I_data=0;
        byte i;
        for(i=0;i<8;i++)
         {
          I_data*=2;
          if (I2C_clock())
              I_data++;
         // endif
         }
         return(I_data);
}



/****************************************************************
*函数原形:void function I2C_ACK(void);
*功    能:向I2C总线发送一个应答信号ACK,一般用于连续数据读取时。
*
*****************************************************************/
void function I2C_ACK(void)
{
        SDA=LOW;
        I2C_clock();
        SDA=HIGH;
}
/*================================================================
=以上给出的是I2C总线基本的操作函数。
================================================================*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -