iic通信协议一分钟搞懂

注:公众号后台发送 “IIC” 即可获取基于STM32上实现软件模拟IIC的完整代码。

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

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

IIC通信协议,搞懂这篇就够了

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

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

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

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

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

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

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

IIC通信协议,搞懂这篇就够了

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

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

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

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

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

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

IIC通信协议,搞懂这篇就够了

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

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由高电平跳变到低电平。

IIC通信协议,搞懂这篇就够了

// 起始信号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由低电平跳变到高电平。

IIC通信协议,搞懂这篇就够了

// 停止信号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,也就是前面的起始信号停止信号)。

IIC通信协议,搞懂这篇就够了

六. 应答信号(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;}

注:公众号后台发送 “IIC” 即可获取基于STM32上实现软件模拟IIC的完整代码。

原创不易,觉得文章不错,收藏的同时,麻烦点个赞~~~~~

关注微信公众号『混说Linux

你也可以继续阅读 点击 以下文章,下面是我推荐给大家的几篇文章:

  1. 《竟然把通信协议讲的如此通俗?》
  2. 《看完还不会c语言指针,锤自己》
  3. 《Linux为什么使用内核模块?》
  4. 《Linux为什么区分内核空间和用户空间?》

本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:dandanxi6@qq.com

(0)
上一篇 2023-10-31 12:07
下一篇 2023-10-31 12:55

相关推荐

  • 生活污水和工业废水的区别,生活污水和工业污水能一起排放吗

    在城镇化率、工业化率的提升,污水提质增效的要求以及水环境综合治理的市场共同刺激下,污水处理市场空间仍将会有所扩张。当前国家大力发展环保事业,提出“绿水青山就是金山银山”的发展理念,…

    2023-09-18
  • 五角大楼证实ufo真实性,五角大楼发布的ufo真实

    周一,美国国防部正式公开和解密了三段著名的UFO视频,并承认这段视频是由美国海军飞行员拍摄的。 美国星条旗报4月27日报道,该部门在周一的一份声明中表示,在联邦官员认定公布这些视频…

    2023-08-03
  • 佛教在生活中的体现

    佛教从汉代传入中国,当时汉朝的强盛我们也称为汉人,文化的大交流。丝绸之路对中国的文化输入和经济向外发展的贡献。 佛教是古印度的释迦牟尼佛涅槃后,由佛陀十大弟子“多闻第一”的阿难尊者…

    2024-02-03
  • 蝙蝠是长寿的象征吗(蝙蝠自古是吉祥福气的象征)

    蝙蝠:曾经儿时游戏里的玩伴 说到蝙蝠,想起了我的童年时代,那时生活在农村,小伙伴们常常玩儿脱下鞋子捕捉蝙蝠的游戏。80年代的农村,多数家庭没有电视,收音机也很少,就连课外读物都很缺…

    2023-02-03
  • 战国四大名将中被称为人屠的是,先秦兵家简介

    诸子百家,是对中国春秋战国这段历史时期各种学术流派的一种总称。此时周王朝式微,礼制奔溃,秩序混乱,人民普遍渴求社会的大一统,于是这个时代的智者挺身而出,纷纷著书立说、周游列国,提出…

    2023-01-09
  • 非企竞价返点开户秘诀

    有朋友应该还没听过非企竞价开户,我先简单举例解释下, 比如你是一个卖茶叶的老板,你想在百度卖你的茶叶,但是直接找代理开户要花一万多,如果嫌贵,你就可以找个非企开户的,只需要2000…

    2023-06-10
  • 贴春联左右如何区分上下联

    [闽南网] 今年春联怎么贴?春联怎么贴左右才正确 春联如何分上下联 春节到了,每年我都发现有的人家,甚至文化单位,将对联贴反,那么春联正确的贴法是怎样的呢?一起来看看小编的分享吧!…

    用户投稿 2023-08-23
  • 酿酒常识关于酿酒出酒率

    关于出酒率:影响出酒率的因素有很多种,如果不知道问题出在哪里就很难下手,大部分朋友都是做酒卖酒的,如果出酒很低会大大增加生产成本,造成利润损失,甚至还会亏本,出酒不好酒质也会到影响…

    2023-01-26
  • 系统架构复杂系统的产品设计与开发 pdf

    架构设计如何应对复杂度不断增加的系统,既实际又至关重要 一、作者简介 Edward Crawley是俄罗斯莫斯科斯科尔科沃科学与技术学院的校长,也是麻省理工学院航空航天学及工程系统…

    2023-11-19
  • 鸡蛋好坏的鉴别方法(用灯光照鸡蛋分辨鸡蛋好坏)

    本想做个水蒸蛋,准备了4个鸡蛋,一一打入碗中,当最后一个落入碗中后,好心情没有了,因为最后一个是坏蛋,又没办法把最后这个坏蛋捞出来,碰上这种状况能有好心情吗?后来怕出现这种情况就先…

    2023-02-19