IIC通信协议,搞懂这篇就够了
注:公众号后台发送 “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的变化被规定为控制命令(START或STOP,也就是前面的起始信号和停止信号)。
六. 应答信号(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通信协议,搞懂这篇就够了相关推荐
- 想要网上赚钱,看懂这篇就够了
最近更文频率明显变慢了,不是懒,而是新上的两个项目着实有太多的东西需要去布局.引流方法需要去实践,引流软件需要去测试,引流视频需要去录制,项目相关的方方面面的资源都需要去搜集.进来的学员需要去辅导, ...
- SPI全双工通信--看懂这篇就够
对于生活中大家普遍常用到的一些基本通信总线协议,也是成为大家关注的焦点,那么今天小易就同大家在知识海洋中进行一次比较深入的探讨,同时也希望小易的这篇文章能给大家带来一定的帮助. SPI通信原理: S ...
- “欧内的手,好汉?”,降噪、反相人声、制作消音伴奏,看懂这篇就够了
FL studio 20中那些"花里胡哨"的效果器(三) 本文经验主要来自于B站爱编曲网官方正版快速入门教程,链接如下: 爱编曲网官方正版快速入门教程 文章目录 FL studio ...
- 使用分层网络模型的两个优点是什么_从零开始学网络|搞懂OSI参考模型和TCP/IP分层模型,看这篇文章就够了...
从零开始学网络|搞懂OSI参考模型和TCP/IP分层模型,看这篇文章就够了mp.weixin.qq.com 前言 今天和大家一起谈谈"网络",之前写的文章可能不太通俗易懂,有人就 ...
- 一下子搞懂JDBC,看这篇就够了--以MySQL为例。
一下子搞懂JDBC,看这篇就够了–以MySQL为例. 文章目录 一下子搞懂JDBC,看这篇就够了--以MySQL为例. 一.什么是JDBC? 二.JDBC的使用步骤 三.jdbc进阶--上述各个类或接 ...
- C++两个函数可以相互递归吗_[算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进
[算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进 从学习写代码伊始, 总有个坎不好迈过去, 那就是遇上一些有关递归的东西时, 看着简短的代码, 怎么稀里糊涂就出来了. ...
- 搞懂RTK定位,看这一篇就够了
搞懂RTK定位,看这一篇就够了! [导读]说到定位,相信大家一定不会觉得陌生.如今我们所处的信息时代,人人都有手机.每天,我们都会用到与地图和导航有关的APP. 这些APP,就是基于定位技术的.说到定 ...
- [算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进
[算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进 从学习写代码伊始, 总有个坎不好迈过去, 那就是遇上一些有关递归的东西时, 看着简短的代码, 怎么稀里糊涂就出来了. ...
- 想要彻底搞懂“异地多活”,看完这篇就够了
在软件开发领域,「异地多活」是分布式系统架构设计的一座高峰,很多人经常听过它,但很少人理解其中的原理. 异地多活到底是什么?为什么需要异地多活?它到底解决了什么问题?究竟是怎么解决的? 这些疑问,想必 ...
最新文章
- PHP支付宝接口RSA验证
- VTK修炼之道55:图形基本操作进阶_表面重建技术(等值面提取)
- 【渝粤题库】国家开放大学2021春1078复变函数题目
- Vijos CoVH之再破难关(搜索+hash)
- face_recognition 安装报错问题解决
- iOS-常用宏定义大全
- java中this有什么作用_Java中this有什么用
- 自由曲面透镜设计matlab,实现LED台灯均匀照明的自由曲面透镜仿真设计
- Google 2018 更新内容
- 移动化之后,BAT下一步走向何方?我们又该走向何方?
- 手机 android.downloader病毒,downloader病毒是什么
- 新产品内测!来体验超低延时的 H5 实时直播
- 统一协同工作平台用户管理、单点登录以及任务集成接口说明
- Pycharm打开Project(工程)时停留在preparing workspace时间过长,导致打开很慢的解决方法...
- 设备中LPC2368芯片个例参数问题导致故障的分析
- 测试画面帧率及帧延时一种方法
- [渝粤教育] 南京工业大学 有机化学实验 参考 资料
- 排列组合---隔板法
- Adobe Flash Lite
- Java后端社招3年
热门文章
- 魅蓝u10Android版本,魅蓝系列的颜值担当—魅蓝U10测评
- 漫画:有趣的“分苹果”问题
- Python---密码生成器
- 人工智能当“古玩鉴定”,人类鉴定师会被取代吗?
- php 邮箱验证正则表达式,php邮箱地址正则表达式验证
- 通过python生成表格
- 转载:地图采集车的那些事 | 惯性导航
- UEditor富文本编辑器上传图片打不开,提示“后端配置项没有正常加载,上传插件不能正常使用”
- POJ 1185 [NOI2001 D2T?] 炮兵阵地
- s5pv210 android 4.0.4 设置固定ip移植