嵌入式-iic通信的一些概念

简介: 嵌入式-iic通信的一些概念

IIC总线若干基本概念


总线信号:


SDA:串行数据线

SCL:串行数据时钟

总线空闲状态:


SDA:高电平

SCL:高电平

Uart协议:开始一个字节的传输时

IIC协议起始位


SCL为高电平时,SDA出现下降沿,产生一个起始位。

image.png

IIC协议结束位


SCL为高电平时,SDA出现上升沿,产生一个结束位。

image.png

IIC读写单bit时序


10100010

IIC主机对IIC从机写入数据时,SDA上的每一位数据在SCL的高电平期间被写入从机中。对于主机,在SCL的低电平期间改变要写入的数据。400k  2.5us/2  1.25us

image.png

IIC主机从IIC从机中读出数据时,从机在SCL的低电平期间将数据输出到SDA总线上,在SCL的高电平期间保持数据稳定。对于主机,在SCL的高电平期间将SDA线上的数据读取并存储。

数据接收方对数据发送方的响应


每当一个字节的数据或命令传输完成时,都会有一位的应答位。需要应答位时,数据发出方将SDA总线设置为3态输入,由于IIC总线上都有上拉电阻,因此此时总线默认为高电平,若数据接收方正确接收到数据,则数据接收方将SDA总线拉低,以示正确应答。

例如当IIC主机对IIC从机写入数据或命令时,每个字节都需要从机产生应答信号以告诉主机数据或命令成功被写入。所以,当IIC主机将8位的数据或命令传出后,会将SDA信号设置为输入,等待从机应答(等待SDA被从机拉低为低电平),若从机正确应答,表明当前数据或命令传输成功,可以结束或开始下一个命令/数据的传输,否则表明数据/命令写入失败,主机就可以决定是否放弃写入或者重新发起写入。

IIC器件地址


        每个IIC器件都有一个器件地址,有的器件地址在出厂时地址就设置好了,用户不可以更改

(ov7670:0x42),有的确定了几位,剩下几位由硬件确定(比如有三位由用户确定,就留有3个控制地址的引脚,最常见的为IIC接口的EEPROM存储器),此类较多;还有的有地址寄存器。


 严格讲,主机不是向从机发送地址,而是主机往总线上发送地址,所有的从机都能接收到主机发出的地址,然后每个从机都将主机发出的地址与自己的地址比较,如果匹配上了,这个从机就会向主机发出一个响应信号。主机收到响应信号后,开始向总线上发送数据,与这个从机的通讯就建立起来了。如果主机没有收到响应信号,则表示寻址失败。


 通常情况下,主从器件的角色是确定的,也就是说从机一直工作在从机模式。不同的器件定义地址的方式是不同的,有的是软件定义,有的是硬件定义。例如某些单片机的IIC接口作为从机时,其器件地址是可以通过软件修改从机地址寄存器确定的。而对于一些其他器件,如CMOS图像传感器、EEPROM存储器,其器件地址在出厂时就已经设定好了,具体值可以在对应的数据手册中查到。


对于AT24C64这样一颗EEPROM器件,其器件地址为1010加3位的片选信号。3位片选信号由硬件连接决定。例如SOIC封装的该芯片pin1、pin2、pin3为片选地址。当硬件电路上分别将这三个pin连接到GND或VCC时,就实现了设置不通的片选地址。


IIC协议在进行数据传输时,主机需要首先向总线上发出控制命令,其中,控制命令就包含了从机地址/片选信号+读写控制。然后等待从机响应。以下为IIC控制命令传输的数据格式。

image.png

IIC传输时,按照从高到低的位序进行传输。控制字节的最低位为读写控制位,当该位为0时表示主机对从机进行写操作,当该位为1时表示主机对从机进行读操作。例如,当需要对片选地址为100的AT24LC64发起写操作,则控制字节应该为CtrlCode = 1010_100_0。若要读,则控制字节应该为CtrlCode = 1010_100_1。

IIC存储器地址


每个支持IIC协议的器件,内部总会有一些可供读写的寄存器或存储器,例如,对于我们用到的EEPROM存储器,内部就是顺序编址的一系列存储单元。对于我们常接触的CMOS摄像头如OV7670(OV7670的该接口叫SCCB接口,其实质也是一种特殊的IIC协议,可以直接兼容IIC协议),其内部就是一系列编址的可供读写的寄存器。因此,我们要对一个器件中的存储单元(寄存器和存储器以下简称存储单元)进行读写,就必须要能够指定存储单元的地址。IIC协议设计了有从机存储单元寻址地址段,该地址段为一个字节或两个字节长度,在主机确认收到从机返回的控制字节响应后,由主机发出。地址段长度视不同的器件类型,长度不同,例如同是EEPROM存储器,AT24C04的址段长度为一个字节,而AT24C64的地址段长度为两个字节。具体是一个字节还是两个字节,与器件的存储单元数量有关。

AT24C01地址段:

image.png

AT24C64地址段:

image.png

IIC单字节写时序


1字节地址段器件单字节写时序


image.png

2字节地址段器件单字节写时序


image.png

从主机角度看一次写入过程

  1. 主机设置SDA为输出
  2. 主机发起起始信号
  3. 主机传输器件地址字节,其中最低为0,表明为写操作。
  4. 主机设置SDA为输入三态,读取从机应答信号。
  5. 读取应答信号成功,传输1字节地址数据
  6. 主机设置SDA为输入三态,读取从机应答信号。
  7. 对于两字节地址段器件,传输地址数据低字节,对于1字节地址段器件,传输待写入的数据
  8. 设置SDA为输入三态,读取从机应答信号。
  9. 对于两字节地址段器件,传输待写入的数据(2字节地址段器件可选)
  10. 设置SDA为输入三态,读取从机应答信号(2字节地址段器件可选)。
  11. 主机产生STOP位,终止传输。

IIC连续写时序(页写时序)


注:IIC连续写时序仅部分器件支持。image.png

2字节地址段器件多字节写时序


image.png

从主机角度看一次写入过程

  1. 主机设置SDA为输出
  2. 主机发起起始信号
  3. 主机传输器件地址字节,其中最低为0,表明为写操作。
  4. 主机设置SDA为输入三态,读取从机应答信号。
  5. 读取应答信号成功,传输1字节地址数据
  6. 主机设置SDA为输入三态,读取从机应答信号。
  7. 对于两字节地址段器件,传输低字节地址数据,对于1字节地址段器件,传输待写入的第一个数据
  8. 设置SDA为输入三态,读取从机应答信号。
  9. 写入待写入的第2至第n个数据并读取应答信号。对于AT24Cxx,一次可写入的最大长度为32字节。
  10. 主机产生STOP位,终止传输。

IIC单字节读时序


1字节地址段器件单节读时序


image.png

2字节地址段器件单节读时序


 image.png

从主机角度看一次读取过程

  1. 主机设置SDA为输出
  2. 主机发起起始信号
  3. 主机传输器件地址字节,其中最低为0,表明为写操作。
  4. 主机设置SDA为输入三态,读取从机应答信号。
  5. 读取应答信号成功,传输1字节地址数据
  6. 主机设置SDA为输入三态,读取从机应答信号。
  7. 对于两字节地址段器件,传输低字节地址数据,对于1字节地址段器件,无此段数据传输。
  8. 主机发起起始信号
  9. 主机传输器件地址字节,其中最低为1,表明为写操作。
  10. 设置SDA为输入三态,读取从机应答信号。
  11. 读取SDA总线上的一个字节的数据
  12. 产生无应答信号(高电平)(无需设置为输出高点片,因为总线会被自动拉高)
  13. 主机产生STOP位,终止传输。

IIC多字节连续读时序(页读取)


1字节地址段器件多字节读时序


image.png

2字节地址段器件多字节读时序


image.png

从主机角度看一次读取过程

  1. 主机设置SDA为输出
  2. 主机发起起始信号
  3. 主机传输器件地址字节,其中最低为0,表明为写操作。
  4. 主机设置SDA为输入三态,读取从机应答信号。
  5. 读取应答信号成功,传输1字节地址数据
  6. 主机设置SDA为输入三态,读取从机应答信号。
  7. 对于两字节地址段器件,传输低字节地址数据,对于1字节地址段器件,无此段数据传输。
  8. 主机发起起始信号
  9. 主机传输器件地址字节,其中最低为1,表明为写操作。
  1. 设置SDA为输入三态,读取从机应答信号。
  2. 读取SDA总线上的n个字节的数据(对于AT24Cxx,一次读取长度最大为32字节)
  3. 产生无应答信号(高电平)(无需设置为输出高点片,因为总线会被自动拉高)

主机产生STOP位,终止传输。

目录
相关文章
|
Java Linux Shell
linux自动部署jar包,注册系统服务(基于Centos7)
linux自动部署jar包,注册系统服务(基于Centos7)
549 0
|
3月前
|
存储 运维 Kubernetes
《聊聊分布式》从Paxos到Raft:分布式共识算法的演进与突破
共识算法是分布式系统的“大脑”,确保多节点协同工作。Paxos理论严谨但工程复杂,而Raft以可理解性为核心,通过清晰的角色划分和流程设计,显著降低实现与运维难度,成为etcd、Consul等主流系统的基石,体现了从理论到工程实践的成功演进。
|
云安全 缓存 监控
什么是CC攻击,有什么办法防御CC攻击
CC攻击的前身是一个名为Fatboy的攻击程序,而之所以后来人们会称之为CC,是因为DDoS攻击发展的初期阶段,绝大部分DDoS攻击都能被业界熟知的“黑洞”(Collapsar,一种安全防护产品)所抵挡,CC攻击的诞生就是为了直面挑战黑洞,所以Challenge Collapsar(挑战黑洞).
什么是CC攻击,有什么办法防御CC攻击
|
SQL 搜索推荐 Android开发
AB测试实战(一)
AB测试是一种数据驱动的产品优化方法,用于比较不同版本的网页、应用界面或营销策略的效果。
|
运维 监控 应用服务中间件
自动化运维:如何利用Python脚本提升工作效率
【10月更文挑战第30天】在快节奏的IT行业中,自动化运维已成为提升工作效率和减少人为错误的关键技术。本文将介绍如何使用Python编写简单的自动化脚本,以实现日常运维任务的自动化。通过实际案例,我们将展示如何用Python脚本简化服务器管理、批量配置更新以及监控系统性能等任务。文章不仅提供代码示例,还将深入探讨自动化运维背后的理念,帮助读者理解并应用这一技术来优化他们的工作流程。
|
消息中间件 存储 API
|
数据可视化 数据处理 Python
使用Pandas实现Excel中的数据透视表功能
本文介绍了如何使用Python的Pandas库实现Excel中的数据透视表功能,包括环境准备、创建模拟销售数据、代码实现及输出等步骤。通过具体示例展示了按地区和销售员汇总销售额的不同方法,如求和、平均值、最大值等,帮助读者掌握Pandas在数据处理上的强大能力。
473 12
|
存储 缓存 Shell
Transformers 4.37 中文文档(一)(3)
Transformers 4.37 中文文档(一)
1697 1
Transformers 4.37 中文文档(一)(3)
|
机器学习/深度学习 人工智能 自然语言处理
【机器学习】python之人工智能应用篇——3D生成技术
在Python中,人工智能(AI)与3D生成技术的结合可以体现在多个方面,比如使用AI算法来优化3D模型的生成、通过机器学习来预测3D模型的属性,或者利用深度学习来生成全新的3D内容。然而,直接通过AI生成完整的3D模型(如从文本描述中生成)仍然是一个活跃的研究领域。 3D生成技术是一种通过计算机程序从二维图像或文本描述自动创建三维模型的过程。这一技术在近年来得到了飞速的发展,不仅为游戏、动画和影视行业带来了革命性的变革,还在虚拟现实、增强现实以及工业设计等多个领域展现出了巨大的应用潜力
489 2
|
算法 调度 决策智能
Python高级算法——模拟退火算法(Simulated Annealing)
Python高级算法——模拟退火算法(Simulated Annealing)
1696 1