当前位置:首页 > 公众号精选 > 混说Linux
[导读]I2C(IIC)属于两线式串行总线,由飞利浦公司开发用于微控制器(MCU)和外围设备(从设备)进行通信的一种总线,属于一主多从(一个主设备(Master),多个从设备(Slave))的总线结构,总线上的每个设备都有一个特定的设备地址,以区分同一I2C总线上的其他设备。

I2C(IIC)属于两线式串行总线,由飞利浦公司开发用于微控制器(MCU)和外围设备(从设备)进行通信的一种总线,属于一主多从(一个主设备(Master),多个从设备(Slave))的总线结构总线上的每个设备都有一个特定的设备地址,以区分同一I2C总线上的其他设备

物理I2C接口有两根双向线,串行时钟线(SCL)串行数据线(SDA)组成,可用于发送和接收数据,但是通信都是由主设备发起,从设备被动响应,实现数据的传输。


I2C主设备与从设备的一般通信过程


一. 主设备给从设备发送/写入数据:

1. 主设备发送起始(START)信号

2. 主设备发送设备地址到从设备

3. 等待从设备响应(ACK)

4. 主设备发送数据到从设备,一般发送的每个字节数据后会跟着等待接收来自从设备的响应(ACK)

5. 数据发送完毕,主设备发送停止(STOP)信号终止传输


二. 主设备从从设备接收/读取数据

1. 设备发送起始(START)信号

2. 主设备发送设备地址到从设备

3. 等待从设备响应(ACK)

4. 主设备接收来自从设备的数据,一般接收的每个字节数据后会跟着向从设备发送一个响应(ACK)

5. 一般接收到最后一个数据后会发送一个无效响应(NACK),然后主设备发送停止(STOP)信号终止传输


注:具体通信过程需视具体时序图而定



I2C通信的实现


一. 使用I2C控制器实现

就是使用芯片上的I2C外设,也就是硬件I2C,它有相应的I2C驱动电路,有专用的IIC引脚,效率更高,写代码会相对简单,只要调用I2C的控制函数即可不需要用代码去控制SCL、SDA的各种高低电平变化来实现I2C协议,只需要将I2C协议中的可变部分(如:从设备地址、传输数据等等)通过函数传参给控制器,控制器自动按照I2C协议实现传输,但是如果出现问题,就只能通过示波器看波形找问题。

二. 使用GPIO通过软件模拟实现

软件模拟I2C比较重要因为软件模拟的整个流程比较清晰哪里出来bug很快能找到问题模拟一遍会对I2C通信协议更加熟悉


如果芯片上没有IIC控制器,或者控制接口不够用了,通过使用任意IO口去模拟实现IIC通信协议,手动写代码去控制IO口的电平变化,模拟IIC协议的时序,实现IIC的信号和数据传输,下面会讲到根据通信协议如何用软件去模拟


I2C通信协议


IIC总线协议无非就是几样东西:起始信号停止信号应答信号、以及数据有效性


一. 空闲状态


时钟线(SCL)和数据线(SDA)接上拉电阻默认高电平表示总线是空闲状态


二. 从设备地址


从设备地址用来区分总线上不同的从设备,一般发送从设备地址的时候会在最低位加上读/写信号,比如设备地址为0x50,0表示读,1表示写,则读数据就会发送0x50,写数据就会发送0x51。


三. 起始(START)信号


I2C通信的起始信号由主设备发起,SCL保持高电平,SDA由高电平跳变到低电平。

// 起始信号 void IIC_start(void)
{ // 1.首先把数据线设置为输出模式 // 总线空闲, SCL和SDA输出高 SCL = 1;  
    SDA = 1;
    delay_us(5); // SDA由高变低 SDA = 0;
    delay_us(5); // 拉低SCL开始传输数据 SCL = 0;
}


四. 停止(STOP)信号


I2C通信的停止信号由主设备终止,SCL保持高电平,SDA由低电平跳变到高电平。

// 停止信号 void IIC_stop(void)
{ // 1.首先把数据线设置为输出模式 // 拉高时钟线 SDA = 0;
    delay_us(5);
    SCL = 1;
    delay_us(5); // SDA由低变高 SDA = 1;
}


五. 数据有效性


I2C总线进行数据传送时,在SCL的每个时钟脉冲期间传输一个数据位,时钟信号SCL为高电平期间,数据线SDA上的数据必须保持稳定,只有在时钟线SCL上的信号为低电平期间,数据线SDA上的高电平或低电平状态才允许变化,因为当SCL是高电平时,数据线SDA的变化被规定为控制命令STARTSTOP,也就是前面的起始信号停止信号)。


六. 应答信号(ACK:有效应答,NACK:无效应答)


接收端收到有效数据后向对方响应的信号,发送端每发送一个字节(8位)数据,在第9个时钟周期释放数据线去接收对方的应答。

当SDA是低电平为有效应答(ACK),表示对方接收成功

当SDA是高电平为无效应答(NACK),表示对方没有接收成功

发送数据需要等待接收方的应答:

// 等待ACK   1-无效    0-有效 u8 IIC_wait_ack(void)
{
    u8 ack = 0; // 数据线设置为输入 // 拉高时钟线 SCL = 1;
    delay_us(5); // 获取数据线的电平 if(SDA)
    { // 无效应答 ack = 1;
        IIC_stop();
    } else { // 有效应答 ack = 0; // 拉低SCL开始传输数据 SCL = 0;
        delay_us(5);
    } return ack;
}

需要发送发送

void IIC_ack(u8 ack)
{ // 数据线设置为输出 SCL = 0;
    delay_us(5); if(ack)
        SDA = 1; // 无效应答 else SDA = 0; // 有效应答  delay_us(5);
    SCL = 1; // 保持数据稳定 delay_us(5); // 拉低SCL开始传输数据 SCL = 0;
}
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭