i2c

2023-10-27

I2C是由Philips公司发明的一种串行数据通信协议,仅使用两根信号线:SerialClock(简称SCL)和SerialData(简称SDA)。I2C是总线结构,1个Master,1个或多个Slave,各Slave设备以7位地址区分,地址后面再跟1位读写位,表示读(=1)或者写(=0),所以我们有时也可看到8位形式的设备地址,此时每个设备有读、写两个地址,高7位地址其实是相同的。

I2C数据格式如下:
无数据:SCL=1,SDA=1;
开始位(Start):当SCL=1时,SDA由1向0跳变;
停止位(Stop):当SCL=1时,SDA由0向1跳变;
数据位:当SCL由0向1跳变时,由发送方控制SDA,此时SDA为有效数据,不可随意改变SDA;
当SCL保持为0时,SDA上的数据可随意改变;
地址位:定义同数据位,但只由Master发给Slave;
应答位(ACK):当发送方传送完8位时,发送方释放SDA,由接收方控制SDA,且SDA=0;
否应答位(NACK):当发送方传送完8位时,发送方释放SDA,由接收方控制SDA,且SDA=1。

当数据为单字节传送时,格式为:
开始位,8位地址位(含1位读写位),应答,8位数据,应答,停止位。
当数据为一串字节传送时,格式为:
开始位,8位地址位(含1位读写位),应答,8位数据,应答,8位数据,应答,……,8位数据,应答,停止位。

需要注意的是:
1,SCL一直由Master控制,SDA依照数据传送的方向,读数据时由Slave控制SDA,写数据时由Master控制SDA。当8位数据传送完毕之后,应答位或者否应答位的SDA控制权与数据位传送时相反。
2,开始位“Start”和停止位“Stop”,只能由Master来发出。
3,地址的8位传送完毕后,成功配置地址的Slave设备必须发送“ACK”。否则否则一定时间之后Master视为超时,将放弃数据传送,发送“Stop”。
4,当写数据的时候,Master每发送完8个数据位,Slave设备如果还有空间接受下一个字节应该回答“ACK”,Slave设备如果没有空间接受更多的字节应该回答“NACK”,Master当收到“NACK”或者一定时间之后没收到任何数据将视为超时,此时Master放弃数据传送,发送“Stop”。
5,当读数据的时候,Slave设备每发送完8个数据位,如果Master希望继续读下一个字节,Master应该回答“ACK”以提示Slave准备下一个数据,如果Master不希望读取更多字节,Master应该回答“NACK”以提示Slave设备准备接收Stop信号。
6,当Master速度过快Slave端来不及处理时,Slave设备可以拉低SCL不放(SCL=0将发生“线与”)以阻止Master发送更多的数据。此时Master将视情况减慢或结束数据传送。

在实际应用中,并没有强制规定数据接收方必须对于发送的8位数据做出回应,尤其是在Master和Slave端都是用GPIO软件模拟的方法来实现的情况下,编程者可以事先约定数据传送的长度,slave不检查NACK,有时可以起到减少系统开销的效果。但是如果slave方是硬件i2c要求一定要标准的NACK,master方是GPIO软件模拟i2c并没有正确的发送NACK,就会出现“slave收不到stop”导致i2c挂死。

 

 在正常情况下,I2C总线协议能够保证总线正常的读写操作。但是,当I2C主设备异常复位时(看门狗动作,板上电源异常导致复位芯片动作,手动按钮复位等等)有可能导致I2C总线死锁产生。下面详细说明一下总线死锁产生的原因。

    在I2C主设备进行读写操作的过程中.主设备在开始信号后控制SCL产生8个时钟脉冲,然后拉低SCL信号为低电平,在这个时候,从设备输出应答信号,将SDA信号拉为低电平。如果这个时候主设备异常复位,SCL就会被释放为高电平。此时,如果从设备没有复位,就会继续I2C的应答,将SDA一直拉为低电平,直到SCL变为低电平,才会结束应答信号。而对于I2C主设备来说.复位后检测SCL和SDA信号,如果发现SDA信号为低电平,则会认为I2C总线被占用,会一直等待SCL和SDA信号变为高电平。这样,I2C主设备等待从设备释放SDA信号,而同时I2C从设备又在等待主设备将SCL信号拉低以释放应答信号,两者相互等待,I2C总线进人一种死锁状态。同样,当I2C进行读操作,I2C从设备应答后输出数据,如果在这个时刻I2C主设备异常复位而此时I2C从设备输出的数据位正好为0,也会导致I2C总线进入死锁状态。

 方法

    (1)尽量选用带复位输人的I2C从器件。

    (2)将所有的从I2C设备的电源连接在一起,通过MOS管连接到主电源,而MOS管的导通关断由I2C主设备来实现。
    (3)在I2C从设备设计看门狗的功能。

    (4)在I2C主设备中增加I2C总线恢复程序。

        每次I2C主设备复位后,如果检测到SDA数据线被拉低,则控制I2C中的SCL时钟线产生9个时钟脉冲(针对8位数据的情况,“9个clk可以激活”的方法来自NXP的文档,NXP(Philips)作为I2C总线的鼻祖,这样的说法是可信的),这样I2C从设备就可以完成被挂起的读操作,从死锁状态中恢复过来。

        这种方法有很大的局限性,因为大部分主设备的I2C模块由内置的硬件电路来实现,软件并不能够直接控制SCL信号模拟产生需要时钟脉冲。

        或者,发送I2C_Stop条件也能让从设备释放总线。

        如果是GPIO模拟I2C总线实现,那么在I2C操作之前,加入I2C总线状态检测I2C_Probe,如果总线被占用,则可尝试恢复总线,待总线释放后,再进行操作。要保证I2C操作最小单元的完整性,不被其他事件(中断、高优先级线程,等)打断。

  (5)在I2C总线上增加一个额外的总线恢复设备。这个设备监视I2C总线。当设备检测到SDA信号被拉低超过指定时间时,就在SCL总线上产生9个时钟脉冲,使I2C从设备完成读操作,从死锁状态上恢复出来。总线恢复设备需要有具有编程功能,一般可以用单片机或CPLD实现这一功能。

  (6)在I2C上串人一个具有死锁恢复的I2C缓冲器,如Linear公司的LTC4307是一个双向的I2C总线缓冲器,并且具有I2C总线死锁恢复的功能。LTC4307总线输入侧连接主设备,总线输出侧连接所有从设备。当LTC4307检测到输出侧SDA或SCL信号被拉低30ms时,就自动断开I2C总线输入侧与输出侧的连接.并且在输出侧SCL信号上产生16个时钟脉冲来释放总线。当总线成功恢复后,LTC4307会再次连接输入输出侧,使总线能够正常工作。

I2C:START Signal 
START signal is defined as a high-to-low transition of SDA while SCL is high.

I2C:Data Validity 
The data on SDA line must be kept stable when SDA is high, and the high or low 
change of SDA must only happen during clock low period. 

I2C:STOP Signal 
A STOP signal is defined as a low-to-high transition of SDA while SCL is at logical ‘1’.

I2C:Slave Address Transfer 
 This is a seven-bit calling address followed by a RW bit - a ‘0’ indicates a 
transmission (WRITE) and a ‘1’ indicates a request for data (READ).

 

 

I2C:Write 1 byte of data to a slave.Slave address = 0x51 (b”1010001”),Data to write = 0xAC
1) Generate start command 
2) Write slave address + write bit 
3) Receive acknowledge from slave 
4) Write data 
5) Receive acknowledge from slave 
6) Generate stop command 
Commands: 
1) Write 0xA225 to 0x86000004 (address + start bit + write cmd + iclr bit). 
2)  -- Wait for interrupt -- 
3) Read i2c_ack bit from 0x86000004, should be ‘0’. 
4) Write 0xAC15 to 0x86000004 (data + stop bit + write cmd + iclr bit) 
5)  -- Wait for interrupt -- 
6) Read i2c_ack bit from 0x86000004, should be ‘0’. 

 

I2C:Read a byte of data from a peripheral memory device.
1) Generate start signal 
2) Write slave address + write bit 
3) Receive acknowledge from slave 
4) Write memory location 
5) Receive acknowledge from slave 
6) Generate repeated start signal 
7) Write slave address + read bit 
8) Receive acknowledge from slave 
9) Read byte from slave 
10)  Write no acknowledge (NACK) to slave, indicating end of transfer 
11)  Generate stop signal 
Commands: 
1) Write 0x9C25 to 0x86000004 (slave address (W bit) + start bit + write bit + iclr bit). 
2)  -- Wait for interrupt -- 
3) Read i2c_ack bit from 0x86000004, should be ‘0’. 
4) Write 0x2005 to 0x86000004 (memory address + write bit + iclr bit). 
5)  -- Wait for interrupt -- 
6) Read i2c_ack bit from 0x86000004, should be ‘0’. 
7) Write 0x9D25 to 0x86000004 (slave address(R bit) + start bit + write bit + iclr 
bit). 
8)  -- Wait for interrupt -- 
9) Write 0x001B to 0x86000004 (stop bit + read bit + tx_ack + iclr bit). 
10)  Read 0x86000004 to get the read data D7 to D0; 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

i2c 的相关文章

  • 机器人基础知识三

    边缘特征提取 在边缘检测中 常用的一种模板是Sobel 算子 Sobel 算子有两个 一个是检测水平边缘的 另一个是检测垂直边缘的 Laplacian算子也是计算图像梯度的一个利器 它相当于二阶Sobel算子的导数 scharr滤波器主要是
  • 基于Dockerfile部署mysql主从复制,rabbitmq一主两从和Redis一主两从哨兵集群

    实验环境 三台机器 主机名 IP 容器IP server1 10 8 161 76 172 15 0 2 server2 10 8 161 112 172 16 0 2 server3 10 8 161 114 172 17 0 2 实验过
  • 【网络基础】

    目录 前言 网络发展 认识协议 网络协议初始 协议分层 OSI七层协议 TCP IP五层 或四层 模型 系统和网络的关系 网络传输基本流程 网络传输流程图 封装 解包和分用 网络中的地址管理 认识IP地址 认识MAC地址 前言 打怪升级 第
  • gitlab 8.13 80 8080端口冲突问题

    部署gitlab的时候 一启动 发现80和8080端口已经被占用 无奈 只得先将监听80端口的nginx和监听8080端口的jenkins停止 这会儿有空 琢磨一下如何修改gitlab的默认端口 修改主要分为两部分 一部分是gitlab总的

随机推荐

  • 盲运动去模糊之Deblur GAN网络专题前言

    前言 这篇Blog将随着进度持续更新 目录 通过Keras回调函数和Tensorboard来检查并监控深度学习模型 利用Tensorflow2搭建CNN网络 Tensorflow2入门 在去模糊领域 从非盲去模糊到盲去模糊 这个领域发展的很
  • .md即markdown文件常用语法

    参阅cmd版官网 markdown 参考博文 Markdown语法介绍 详细 1 标题 使用 符号包起来 符号和内容中间空格可省略 尾部 号可省略 依次1 6级标题 对应html中的h1 6标签 会使上一行成为一级标题 上一行二级标题 若要
  • opencv之绘制多边形----cv2.polylines, cv2.fillPoly

    代码展示 coding utf 8 import cv2 import numpy as np img np zeros 200 200 3 dtype np uint8 pts np array 10 10 100 10 100 100
  • 表达式求值(课程设计,含讲解)

    include
  • Vscode 使用插件 code runner 运行php 配置方法

    1 Vscode 插件中心搜索插件Code Runner 正常安装 2 打开设置页面 快捷键 Ctrl 直接打开 设置搜索输入 code runner map 打开settings json 配置 3 图中红框处的php配置修改为你电脑ph
  • css自定义属性/css变量

    css自定义属性 css变量 由自定义属性标记设定值 由 var 函数来获取值 属性名需要以两个减号 开始 全局变量 在 root伪类上定义自定义属性 可以在 HTML 文档中全局应用它 局部变量 在选择器中定义的变量 或 在标签中定义的变
  • Raspberry Pi Pico使用MicroPython---(4)

    这一次我们使用Raspberry pi pico点亮ST7735驱动的1 8寸RGB的TFT屏幕 网络的资料比较少 通过bing com能查到使用Arduino写的例程 这里我们还是采用熟悉的Micropython编程 这里主要参考的是 G
  • python 文件查找性能对比 python与powershell

    目录 6万行的文本文件 python遍历查找和powerchell 查找方式对比 代码 结论
  • 【计算机网络】网络数据传输流程详解

    目录 1 基础知识 1 1 IP地址 1 2 子网掩码 1 3 MAC地址 1 4 网络传输遇到的设备 1 4 1 集线器 1 4 2 交换机 1 4 3 主机 1 4 5 路由器 1 5 冲突域 1 6 广播域 2 局域网数据传输流程 2
  • PandoraBox 挂载不上摄像头,求大佬指导!

    PandoraBox 挂载不上摄像头 求大佬指导 安装好驱动 以及mjpg streamer Base on LEDE OpenWrt 19 09 r5054 2019 09 07 git b7ad7d224 更新一下 root Pando
  • Vue - 项目中使用iconfont(阿里图标库)

    项目中如何使用iconfont 阿里图标库 一 登陆iconfont官网 https www iconfont cn 二 创建一个图标项目 1 点击 图标管理 子目录中的子目录 我的项目 进入个人图标项目 2 点击创建一个图标项目 三 将需
  • 走进包装类

    引入 Java认为一切皆对象 引用数据类型就是对象 但是在Java中8中基本数据类型不是对象 只是表示一种数据的类型形式 Java为了一切皆对象的思想统一 把8中基本数据类型转换成对应的类 这个类称为基本数据类型的包装类 基本数据类型 包装
  • vue运行后没有显示内容

    运行成功没有报错但是就是不显示内容 进浏览器看到控制台的报错信息 vue runtime esm js c320 4573 Vue warn Property or method yzmStr is not defined on the i
  • 如何使用cookie信息,完成自动登录

    在做爬虫任务的时候 我们常常会遇到很多网页必须登录后 才可以开放某些页面 所以登录是爬取网页的第一步 但是 通过post表单 包含用户名和密码 的方法 对于那些不需要输入比较复杂的验证码的网页 可以使用正则表达式将验证码和验证码的ID匹配得
  • MMEditing环境配置

    MMEditing环境配置 MMEditing is an open source image and video editing toolbox based on PyTorch It is a part of the OpenMMLab
  • ZynqMP Petalinux2021.1设置工程离线编译

    前言 Ubuntu18 04安装Petalinux 2021 1 sudaroot的博客 CSDN博客 介绍 PetaLinux基于Yocto 每次创建或者编译工程下载都需要联网下载工程所需文件 且下载的文件非常庞大 这就导致编译速度还受网
  • 《Python量化投资》01 量化投资之单因子测试(概述,Pandas的适用)

    一 股票aplha多因子策略介绍 量化投资是指通过数量化方式及计算机程序化发出买卖指令 以获取稳定收益为目的的交易方式 在海外的发展已有30多年的历史 其投资业绩稳定 市场规模和份额不断扩大 得到了越来越多投资者认可 从全球市场的参与主体来
  • C#简单操作MongoDB

    新建一个窗体程序 使用Nuget安装mongodb driver 或者直接引用dll如下 代码 using System using System Collections Generic using System ComponentMode
  • Shader编程学习笔记(二)—— Shader和渲染管线

    http www cnblogs com maple share p 5395097 html Shader和渲染管线 什么是Shader Shader 中文翻译即着色器 是一种较为短小的程序片段 用于告诉图形硬件如何计算和输出图像 过去由
  • i2c

    I2C是由Philips公司发明的一种串行数据通信协议 仅使用两根信号线 SerialClock 简称SCL 和SerialData 简称SDA I2C是总线结构 1个Master 1个或多个Slave 各Slave设备以7位地址区分 地址