【通信方式】I2C总线

    xiaoxiao2022-07-05  189

    文章目录

    一、I2C相关介绍二、I2C时序图三、GPIO简单模拟I2C程序

    一、I2C相关介绍

    I2C由 荷兰Philips(飞利浦) 公司推出I2C Bus——Inter-Integrated Circuit 即集成电路总线速率:普通模式 - 100Kbps;高速模式 - 400KbpsI2C总线端口为漏开结构,因此一般需要加上拉电阻Rp,通常选用5K~10KΩI2C总线以字节为单位收发数据,一个字节为一帧,数据传输的次序为从最高位到最低位I2C应答位遵循“谁接收谁产生”的原则若还需要继续接收就需要产生应答位I2C器件地址的分配由I2C总线委员会协调确定

    I2C器件的从机地址由4位器件地址,2~3位引脚地址和1位方向位(读写位)【0写1读】

    以AT24cxx芯片为例:

    I2C由 数据线(SDA)与时钟线(SCL)组成

    SDA:Synchronous Data Adapter (同步数据衔接器)SCL:Serial Communication Loop(串行通讯环路)

    二、I2C时序图

    三、GPIO简单模拟I2C程序

    //产生IIC起始信号 void IIC_Start(void) { SCL = 1; SDA = 1; //首先SDA、SCL为高电平 delay_us(5); //起始条件建立时间大于 4.7us SDA = 0; //START:when SCL is high,SDA change form high to low delay_us(5); //起始条件锁定时间大于 4us SCL = 0; //钳住I2C总线,准备发送或接收数据 } //产生IIC停止信号 void IIC_Stop(void) { SDA = 0; SCL = 1; delau_us(5); //结束总线时间大于 4us SDA = 1; //STOP:when CLK is high DATA change form low to high delau_us(5); //停止信号时间大于 4.7us } //产生ACK应答 void IIC_Ack(void) { SDA = 0; delay_us(2); SCL = 1; delay_us(5); SCL = 0; } //不产生ACK应答 void IIC_NAck(void) { SDA = 1; delay_us(2); SCL = 1; delay_us(5); SCL = 0; } //IIC读取1个字节,ack=1时,发送ACK,ack=0,发送nACK //若还需要继续接收就需要产生应答位 unsigned char IIC_Read_Byte(unsigned char ack) { unsigned char data = 0; SDA = 1; for(char i = 0;i < 8;i++) { SCL = 0; //SCL低电平 SDA数据线才能变化 delay_us(2); SCL = 1; //SCL高电平,读取SDA数据线 data <<= 1; //数据左移(先接收到的数据为高位) data |= SDA; } if(ack) IIC_Ack(); //发送ACK else IIC_NAck();//发送NACK return data; } //IIC发送一个字节 void IIC_Send_Byte(unsigned char data) { SCL = 0; for(char i = 0;i < 8;i++) { SCL = 0; delay_us(2); SDA = (data & 0x80) >> 7; data <<= 1; SCL = 1; delay_us(2); } }
    最新回复(0)