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

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

文章首发微信公众号:混说Linux,欢迎大家关注获取更多相关文章。

IIC通信协议,搞懂这篇就够了https://mp.weixin.qq.com/s?__biz=MzIwNDQwMjIwNQ==&mid=2247484368&idx=1&sn=0af552051a01299b9e23db15b0e7f602&chksm=96c1f8a2a1b671b496fc2d0de57275d70f22b2fa8f308e8b3b4742938517976b877e62cdaca9#rd

物理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; // 无效应答elseSDA = 0; // 有效应答      delay_us(5);SCL = 1;// 保持数据稳定delay_us(5);// 拉低SCL开始传输数据SCL = 0;
}

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

微信公众号:混说Linux

点击原文:《IIC通信协议,搞懂这篇就够了》

IIC通信协议,搞懂这篇就够了相关推荐

  1. 想要网上赚钱,看懂这篇就够了

    ​最近更文频率明显变慢了,不是懒,而是新上的两个项目着实有太多的东西需要去布局.引流方法需要去实践,引流软件需要去测试,引流视频需要去录制,项目相关的方方面面的资源都需要去搜集.进来的学员需要去辅导, ...

  2. SPI全双工通信--看懂这篇就够

    对于生活中大家普遍常用到的一些基本通信总线协议,也是成为大家关注的焦点,那么今天小易就同大家在知识海洋中进行一次比较深入的探讨,同时也希望小易的这篇文章能给大家带来一定的帮助.  SPI通信原理: S ...

  3. “欧内的手,好汉?”,降噪、反相人声、制作消音伴奏,看懂这篇就够了

    FL studio 20中那些"花里胡哨"的效果器(三) 本文经验主要来自于B站爱编曲网官方正版快速入门教程,链接如下: 爱编曲网官方正版快速入门教程 文章目录 FL studio ...

  4. 使用分层网络模型的两个优点是什么_从零开始学网络|搞懂OSI参考模型和TCP/IP分层模型,看这篇文章就够了...

    从零开始学网络|搞懂OSI参考模型和TCP/IP分层模型,看这篇文章就够了​mp.weixin.qq.com 前言 今天和大家一起谈谈"网络",之前写的文章可能不太通俗易懂,有人就 ...

  5. 一下子搞懂JDBC,看这篇就够了--以MySQL为例。

    一下子搞懂JDBC,看这篇就够了–以MySQL为例. 文章目录 一下子搞懂JDBC,看这篇就够了--以MySQL为例. 一.什么是JDBC? 二.JDBC的使用步骤 三.jdbc进阶--上述各个类或接 ...

  6. C++两个函数可以相互递归吗_[算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进

    [算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进 从学习写代码伊始, 总有个坎不好迈过去, 那就是遇上一些有关递归的东西时, 看着简短的代码, 怎么稀里糊涂就出来了. ...

  7. 搞懂RTK定位,看这一篇就够了

    搞懂RTK定位,看这一篇就够了! [导读]说到定位,相信大家一定不会觉得陌生.如今我们所处的信息时代,人人都有手机.每天,我们都会用到与地图和导航有关的APP. 这些APP,就是基于定位技术的.说到定 ...

  8. [算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进

    [算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进 从学习写代码伊始, 总有个坎不好迈过去, 那就是遇上一些有关递归的东西时, 看着简短的代码, 怎么稀里糊涂就出来了. ...

  9. 想要彻底搞懂“异地多活”,看完这篇就够了

    在软件开发领域,「异地多活」是分布式系统架构设计的一座高峰,很多人经常听过它,但很少人理解其中的原理. 异地多活到底是什么?为什么需要异地多活?它到底解决了什么问题?究竟是怎么解决的? 这些疑问,想必 ...

最新文章

  1. PHP支付宝接口RSA验证
  2. VTK修炼之道55:图形基本操作进阶_表面重建技术(等值面提取)
  3. 【渝粤题库】国家开放大学2021春1078复变函数题目
  4. Vijos CoVH之再破难关(搜索+hash)
  5. face_recognition 安装报错问题解决
  6. iOS-常用宏定义大全
  7. java中this有什么作用_Java中this有什么用
  8. 自由曲面透镜设计matlab,实现LED台灯均匀照明的自由曲面透镜仿真设计
  9. Google 2018 更新内容
  10. 移动化之后,BAT下一步走向何方?我们又该走向何方?
  11. 手机 android.downloader病毒,downloader病毒是什么
  12. 新产品内测!来体验超低延时的 H5 实时直播
  13. 统一协同工作平台用户管理、单点登录以及任务集成接口说明
  14. Pycharm打开Project(工程)时停留在preparing workspace时间过长,导致打开很慢的解决方法...
  15. 设备中LPC2368芯片个例参数问题导致故障的分析
  16. 测试画面帧率及帧延时一种方法
  17. [渝粤教育] 南京工业大学 有机化学实验 参考 资料
  18. 排列组合---隔板法
  19. Adobe Flash Lite
  20. Java后端社招3年

热门文章

  1. 魅蓝u10Android版本,魅蓝系列的颜值担当—魅蓝U10测评
  2. 漫画:有趣的“分苹果”问题
  3. Python---密码生成器
  4. 人工智能当“古玩鉴定”,人类鉴定师会被取代吗?
  5. php 邮箱验证正则表达式,php邮箱地址正则表达式验证
  6. 通过python生成表格
  7. 转载:地图采集车的那些事 | 惯性导航
  8. UEditor富文本编辑器上传图片打不开,提示“后端配置项没有正常加载,上传插件不能正常使用”
  9. POJ 1185 [NOI2001 D2T?] 炮兵阵地
  10. s5pv210 android 4.0.4 设置固定ip移植