当前位置: 首页 > news >正文

stm32中IIC通讯协议

参考资料:大部分均引用b站江协科技课程、GPT及网络资料

        什么是IIC(i2C)通讯协议?

关键字:SCL、SDA、半双工、同步、串行。

        IIC(Inter-Integrated Circuit),也称为I2C(Inter-Integrated Circuit),是一种由Philips公司(现为NXP)开发的用于在集成电路之间进行短距离通信的串行总线协议。IIC协议非常适合低速设备之间的数据传输,具有简单、低成本和易于实现的特点。

      其中有几个问题:为什么是短距离?什么是串行总线?这个等学完概念后再进行解答。

概念:

IIC总线基本特性
  1. 双线结构:IIC总线采用两根双向线路进行通信:

    • SCL(串行时钟线):由主设备产生的时钟信号,用于同步数据传输。
    • SDA(串行数据线):用于传输数据,数据在时钟信号的控制下进行传输。
  2. 多主从结构:支持总线挂载多设备(一主多从、多主多从)。每个设备都有一个唯一的地址

  3. 地址分配IIC设备使用7位或10位地址来唯一标识每个设备。在传输数据时,主设备通过地址帧选择目标从设备

  4. 同步,半双工

数据传输
  • 数据帧:每次传输的数据帧由8位数据组成,从高位(MSB)到低位(LSB)传输
  • 应答位(Acknowledge Bit):在每个数据帧传输之后,由接收方发送一个应答位。若应答位为低电平,表示接收成功;若应答位为高电平,表示接收失败。
数据读写过程
  1. 写操作

    • 主设备发送起始条件。
    • 主设备发送从设备地址以及读写控制位(0表示写,1表示读)。
    • 从设备发送应答位。
    • 主设备发送要写入的数据。
    • 从设备发送应答位。
    • 重复数据传输和应答,直到所有数据传输完毕。
    • 主设备发送停止条件。
  2. 读操作

    • 主设备发送起始条件。
    • 主设备发送从设备地址以及读写控制位。
    • 从设备发送应答位。
    • 主设备切换到接收模式,读取数据。
    • 主设备发送应答位。
    • 重复数据读取和应答,直到所有数据读取完毕。
    • 主设备发送停止条件。

IIC时序:

1.起始和终止

        起始条件:SCL高电平期间,SDA从高电平切换到低电平

        终止条件:SCL高电平期间,SDA从低电平切换到高电平

2.发送和接收

          发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节

        接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)

3.应答

        发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答

         接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)

        了解了这些基本知识,再回到开头,IIC其只需要两根线控制,一根时钟线(SCL)控制同步,一根数据线(SDA)传输数据,因为只有一根数据线,数据逐个传输,因此是串行通讯。

        其中还提到了半双工,这里来解释下:

        半双工:数据可以在两个方向上传输,但不能同时进行,如iic,rs485

        全双工:数据可以在两个方向上同时进行传输。发送和接收可以同时进行,不会互相干扰,

如RS-232。

        单工:数据只能在一个方向上传输。发送方只能发送,接收方只能接收,如电视广播。

iic在长距离的环境中,容易受到干扰造成电平跳变,会严重影响数据的准确性,且IIC协议依赖于时钟线(SCL)和数据线(SDA)的同步工作。长距离可能导致信号延迟不一致,因此其适合短距离通讯。

相关文章:

  • Xilinx FPGA:vivado关于真双端口的串口传输数据的实验
  • Spring Boot与Spring Batch的深度集成
  • iOS开发中用到的自定义UI库
  • 【Kubernetes学习】
  • Python容器 之 字典--字典的遍历
  • 性能测试、负载测试、压力测试、稳定性测试简单区分【超详细】
  • Solr安装IK中文分词器
  • 【Linux开发实战指南】基于TCP、进程数据结构与SQL数据库:构建在线云词典系统(含注册、登录、查询、历史记录管理功能及源码分享)
  • 使用PowerShell开启防火墙端口
  • 在C++中内存泄露的几种情况及解决内存泄露和指针越界有哪些方法?
  • leetcode 403周赛 包含所有1的最小矩形面积||「暴力」
  • 玄机——第七章 常见攻击事件分析--钓鱼邮件 wp
  • AI绘画Stable Diffusion 解锁精美壁纸创作:利用SD与LLM定制你的专属壁纸,AI副业变现指南!
  • 使用LabVIEW报告生成工具包时报错97
  • 解决pip默认安装位置在C盘方法
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • Angular4 模板式表单用法以及验证
  • Docker容器管理
  • echarts花样作死的坑
  • extjs4学习之配置
  • GraphQL学习过程应该是这样的
  • HTTP--网络协议分层,http历史(二)
  • HTTP中GET与POST的区别 99%的错误认识
  • Java 网络编程(2):UDP 的使用
  • Java教程_软件开发基础
  • JS题目及答案整理
  • Mocha测试初探
  • OSS Web直传 (文件图片)
  • socket.io+express实现聊天室的思考(三)
  • springboot_database项目介绍
  • 大整数乘法-表格法
  • 来,膜拜下android roadmap,强大的执行力
  • 类orAPI - 收藏集 - 掘金
  • 中文输入法与React文本输入框的问题与解决方案
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • #《AI中文版》V3 第 1 章 概述
  • #预处理和函数的对比以及条件编译
  • (4) PIVOT 和 UPIVOT 的使用
  • (C语言)逆序输出字符串
  • (第一天)包装对象、作用域、创建对象
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (力扣题库)跳跃游戏II(c++)
  • (三分钟)速览传统边缘检测算子
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (一)WLAN定义和基本架构转
  • (转) ns2/nam与nam实现相关的文件
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)大道至简,职场上做人做事做管理
  • (转)视频码率,帧率和分辨率的联系与区别
  • (转载)虚函数剖析
  • ./和../以及/和~之间的区别
  • .net 微服务 服务保护 自动重试 Polly
  • .NetCore 如何动态路由
  • .NET连接数据库方式