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

i2c讲解以及zyqn中的使用

文章目录

  • i2c讲解以及zyqn中的使用
    • 什么是i2c
      • 工作时序:
      • 总线速度
    • IIC的IO有什么特点
      • oc门和od门
        • oc门与od门的基础知识
      • oc门和od门的功能
        • 推挽电路
        • 开漏od和开集oc
    • i2c访问温度传感器芯片SI7021
    • 首先初始化i2c
    • 温度湿度寄存器的读操作

i2c讲解以及zyqn中的使用

什么是i2c

https://blog.csdn.net/qq_39829913/article/details/104718185
这个i2c讲的非常好

它是电平触发采集的,不是边沿,时钟为0的时候,数据可以发生变化,的一种同步通信,IIC使用两根信号线进行通信:一根时钟线SCL,一根数据线SDA。IIC将SCL处于高时SDA拉低的动作作为开始信号,SCL处于高时SDA拉高的动作作为结束信号;传输数据时,SDA在SCL低电平时改变数据,在SCL高电平时保持数据,每个SCL脉冲的高电平传递1位数据。

工作时序:

  1. 数据有效性
    在scl为高的时候,sda才有效
  2. 开始和结束
    开始:在scl为高的时候,sda从高变低
    结束:在scl为高的时候,sda从低变高
  3. 重复开始信号
    重复开始信号(ReSTART/Sr): 在结束时不给出STOP信号,而以一个时钟周期内再次给出开始信号作为替代
  4. 字节格式
    SDA数据线上的每个字节必须是8位,对于每次传输的字节数没有限制。每个字节(8位)数据传送完后紧跟着应答信号(ACK,第9位)。数据的先后顺序为:高位在前 。
  5. 应答信号
    协议规定数据传输过程必须包含应答(ACK)。接收器通过应答告知发送的字节已被成功接收,之后发送器可以进行下一个字节的传输。主机产生数据传输过程中的所有时钟,包括用于应答的第9个时钟。发送器在应答时钟周期内释放对SDA总线的控制,这样接收器可以通过将SDA线拉低告知发送器:数据已被成功接收。
      应答信号分为两种:
        1)当第9位(应答位)为 低电平 时,为 ACK  (Acknowledge)   信号
        2)当第9位(应答位)为 高电平 时,为 NACK(Not Acknowledge)信号
      主机发送数据,从机接收时,ACK信号由从机发出。当在SCL第9位时钟高电平信号期间,如果SDA仍然保持高电平,则主机可以直接产生STOP条件终止以后的传输或者继续ReSTART开始一个新的传输
      从机发送数据,主机读取数据时,ACK信号由主机给出。主机响应ACK表示还需要再接收数据,而当主机接收完想要的数据后,通过发送NACK告诉从机读取数据结束、释放总线。随后主机发送STOP命令,将总线释放,结束读操作。

总线速度

在这里插入图片描述

在这里插入图片描述

为什么双向最高位3.4Mbps?

  1. 电气特性: I2C总线使用开漏(open-drain)或开集(open-collector)方式驱动,需要通过上拉电阻来提供高电平。这种设计使得数据线可以被任何一个设备拉低,以实现多主机控制。然而,这也意味着信号边沿的上升时间受到了限制,特别是在总线负载较重(许多设备连接到总线上)或总线电容较大的情况下。较慢的上升时间限制了最高传输速度。

  2. 时序和容错: 为了确保通信的可靠性,I2C协议定义了一系列时序要求,包括起始条件、停止条件、数据有效性等。这些时序要求确保了数据的完整性和设备之间的同步,但也对传输速率造成了限制。此外,协议还必须容纳一定的电气噪声和信号退化,这意味着必须有足够的时序余量来应对这些问题。

  3. 标准和模式: I2C协议定义了几种不同的速率模式,包括标准模式(最高100kbps)、快速模式(最高400kbps)、快速模式加(Fast Mode Plus,最高1Mbps)和高速模式(High Speed Mode,最高3.4Mbps)。每种模式都有其电气特性和时序要求,以适应不同的应用场景和性能需求。3.4Mbps的限制是高速模式下的最大速率,是通过改进驱动能力和时序控制来实现的。

  4. 兼容性和通用性: I2C总线的设计考虑了广泛的兼容性和通用性,以支持各种不同性能级别的设备共存。这意味着总线协议和电气特性必须在保持低成本和简单设计的同时,提供足够的通信速度。过高的速度可能会增加设计的复杂性和成本,同时减少与低速设备的兼容性。

IIC的IO有什么特点

https://blog.csdn.net/jiangdf/article/details/72779046
IIC总线上所有器件的SDA、SCL引脚输出驱动都为 开漏(OD) 结构,通过外接上拉电阻实现总线上所有节点SDA、SCL信号的线与逻辑关系。
在这里插入图片描述

oc门和od门

oc门与od门的基础知识

https://zhuanlan.zhihu.com/p/555471581
这个视频讲的挺好
https://www.bilibili.com/video/BV1EJ411T76A/?spm_id_from=333.337.search-card.all.click&vd_source=4a58493d16f50229c3283d2be2c272ba

oc门和od门的功能

在这里插入图片描述

推挽电路

推挽输出两个管子始终处在一个导通另一个截止的状态。
在这里插入图片描述

但是推挽不能实现线与功能。

开漏od和开集oc

开漏和开集差不多,一个是cmos管,一个是三极管,现在就以三极管的oc来说,具体看知乎连接
在这里插入图片描述

因为 OC/OD 门电路不具备输出高电平的能力,所以在一般应用中,是需要外接上拉电阻的。 接上上拉电阻之后,输出是1就是三极管截止,输出是0就是三极管导通接地,不同的带上拉电阻的oc门都可以输出端相连,实现线与功能

i2c访问温度传感器芯片SI7021

已经是硬核的i2c,arm直接调用函数即可

首先初始化i2c

int InitialIic(XIicPs *iic, XIicPs_Config *config)
{int Status;//查找外设设备的配置结构体;config = XIicPs_LookupConfig(IIC_DEVICE_ID);//判断指针是否为空if (NULL == config) {return XST_FAILURE;}//通过配置结构体进行初始化外设;Status = XIicPs_CfgInitialize(iic, config, config-> BaseAddress);if (Status != XST_SUCCESS) {return XST_FAILURE;}//设置 IIC速率;Status = XIicPs_SetSClk(iic, IIC_SCLK_RATE);//这里设置的是100kif (Status != XST_SUCCESS) {return XST_FAILURE;}return XST_SUCCESS;
}

温度湿度寄存器的读操作

读寄存器时序(分两个步骤),
在这里插入图片描述

  1. 通过写命令设置准备读的寄存器地址,i2c读之前要先写设备id+写命令、温湿度寄存器地址,
    在这里插入图片描述

这里用封装好的函数来

	status = XIicPs_MasterSendPolled(iic, &HumCmd,ByteCount_part1,IIC_SLAVE_ADDR);//IIC_SLAVE_ADDR为设备id,HumCmd为寄存器地址,ByteCount_part1是要写入的字节数(因为寄存器地址为1个字节所以设置为1)if (status != XST_SUCCESS) {return XST_FAILURE;}
  1. 然后再启动读数据,7个设备id+1个读命令
    在这里插入图片描述

这里用封装好的函数来

	status = XIicPs_MasterRecvPolled(iic, Hdata, ByteCount_part2, IIC_SLAVE_ADDR);//ByteCount_part2为2,因为要读2个字节出来,IIC_SLAVE_ADDR还要给进去,但寄存器地址不给了,满足i2c时序if (status != XST_SUCCESS) {return XST_FAILURE;}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • vue的diff算法的【双端比较】策略
  • C++中如果函数a的参数是class v,class z是v的子类,可否将z的对象当参数传给函数a,可以
  • SystemUI plugin 开发
  • 2024年中职语文统编教材线上培训答案
  • 多线程 02:线程实现,创建线程的三种方式,通过多线程下载图片案例分析异同(Thread,Runnable,Callable)
  • python 文件打开、读、关闭练习
  • 【物联网】微信小程序ios如何自动打开蓝牙
  • Django Rest Framework -解析器
  • Linux中如何复制贴贴删除
  • C++速学day2
  • All-Reduce通信原语;Reduce+LayerNorm+Broadcast算子;gRPC:远程过程调用(RPC)框架;
  • ElementUI 事件回调函数传参技巧与自定义参数应用
  • TypeScript基础【学习笔记】
  • Rabbit高级特性 - 消息重试机制(两种实现)
  • nextjs 实现TodoList网页应用案例
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • Git初体验
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • js学习笔记
  • node入门
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • Zsh 开发指南(第十四篇 文件读写)
  • 闭包,sync使用细节
  • 从0实现一个tiny react(三)生命周期
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 机器学习 vs. 深度学习
  • 解析带emoji和链接的聊天系统消息
  • 让你的分享飞起来——极光推出社会化分享组件
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 数据科学 第 3 章 11 字符串处理
  • 数据库巡检项
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • #{}和${}的区别是什么 -- java面试
  • #Linux(make工具和makefile文件以及makefile语法)
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • $(selector).each()和$.each()的区别
  • (12)目标检测_SSD基于pytorch搭建代码
  • (4) PIVOT 和 UPIVOT 的使用
  • (9)STL算法之逆转旋转
  • (第二周)效能测试
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (七)Activiti-modeler中文支持
  • (十八)SpringBoot之发送QQ邮件
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (转)LINQ之路
  • .net Stream篇(六)
  • .net 连接达梦数据库开发环境部署
  • .net 受管制代码