通讯需要两根信号线

  • SDA:串行数据线
  • SCL:串行时钟线

开始信号

在SCL为高电平期间,SDL 由高电平变化为低电平--存在一个跳变的过程,即为开始信号

void IIC_Start(void)
{SDA_OUT();     //sda线输出IIC_SDA=1;       IIC_SCL=1;delay_us(4);IIC_SDA=0;//START:when CLK is high,DATA change form high to low delay_us(4);IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}   

结束信号

在SCL为高电平期间,SDL 由低电平变化为高电平--存在一个跳变的过程,即为开始信号

void IIC_Stop(void)
{SDA_OUT();//sda线输出IIC_SCL=0;IIC_SDA=0;//STOP:when CLK is high DATA change form low to highdelay_us(4);IIC_SCL=1; IIC_SDA=1;//发送I2C总线结束信号delay_us(4);
}

ACK信号

在SCL为高电平期间,SDL 是 低电平,即为ACK信后,在SCL变化为高电平以前已经就是低电平

//产生ACK应答
void IIC_Ack(void)
{IIC_SCL=0;SDA_OUT();IIC_SDA=0;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}

NACK信号 没回应

在SCL为高电平期间,SDL 是高电平,即为NACK信号

void IIC_NAck(void)
{IIC_SCL=0;SDA_OUT();IIC_SDA=1;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}

SDA数据线上的每个字节必须是8位,每次传输的字节数量没有限制。每个字节后必须跟一个响应位(ACK)。首先传输的数据是最高位(MSB),

SDA上的数据必须在SCL高电平周期时保持稳定,SDL数据的高低电平翻转变化发生在SCL低电平时期。

每个字节传输必须带响应位,相关的响应时钟也由主机产生,在响应的时钟脉冲期间(第9个时钟周期),发送端释放SDA线,

SCL第9位时钟高电平信号期间,SDA拉低其代表了有ACK响应位。

当在SCL第9位时钟高电平信号期间,SDA仍然保持高电平,这种情况定义为NACK非响应位。

7-bit 地址格式和读写位
一个7-bit的地址是从最高位(MSB) 开始发送的,这个地址后面会紧跟1-bit(R/W)的操作符,1表示读操作,0表示写操作。 接下来的一个bit是NACK/ACK,当这个帧中前面8 bit发送完后,接收端的设备获得SDA控制权,此时接收设备应该在第9个时钟脉冲之前回复一个ACK(将SDA拉低)以表示接收正常,如果接收设备没有将SDA拉低(收到了NACK),则说明接收设备可能没有收到数据(如寻址的设备不存在或设备忙)或无法解析收到的消息,如果是这样,则由master来决定如何处理(停止stop或重新开始repeated start condition)。

单次写(字节写)时序

连续写(页写)时序

当前地址读时序

随机地址读时序

随机地址读是没有发送数据的单次写操作和当前地址读操作的结合体

随机地址读发送完器件地址和字地址后,竟然又发送起始信号和器件地址,而且第一次发送器件地址时
后面的读写控制位为“ 0”,也就是命令,第二次发送器件地址时后面的读写控制位为“ 1”,也就是

为什么会有这样奇怪的操作呢?这是因为我们需要使从机内的存储单元地址指针指向我们想要读取的存储
单元地址处,所以首先发送了一次 Dummy Write 也就是虚写操作,只所以称为虚写,是因为我们并不是真
的要写数据,而是通过这种虚写操作使地址指针指向虚写操作中字地址的位置,等从机应答后,就可以以
当前地址读的方式读数据了,

顺序读时序

I2C 协议分析和学习相关推荐

  1. 从新手到入门,如何进入协议分析的世界

    " 协议分析与还原自学及入门指南." 有部分朋友给我发消息,说对协议还原很感兴趣,但苦于没人指导,希望得到我的帮助,问我如何进行协议分析的学习. 这篇文章从初学者的角度,编列了一个 ...

  2. TCP/IP协议分析

    一;前言 学习过TCP/IP协议的人多有一种感觉,这东西太抽象了,没有什么数据实例,看完不久就忘了.本文将介绍一种直观的学习方法,利用协议分析工具学习TCP/IP,在学习的过程中能直观的看到数据的具体 ...

  3. FPGA学习之路—接口(2)—I2C协议详解+Verilog源码分析

    FPGA学习之路--I2C协议详解+Verilog源码分析 定义 I2C Bus(Inter-Integrated Circuit Bus) 最早是由Philips半导体(现被NXP收购)开发的两线时 ...

  4. RTSP再学习 -- RTSP协议分析(转载)

    最近一直在看 RTSP,但是RTSP协议是个啥?还没有搞清楚. 首先流媒体百度百科上有这样一段,从基本的名字上或多或少可以理解一下这些传输协议的区别.这很重要!! 传输协议 1.RSVP:资源预留协议 ...

  5. NS2相关学习——可靠的MANET应用程序的Gossip协议分析

    好久不写,应该努力啦!老师把这篇论文给了我,现在还不知道它在讲什么,来边翻译边学习吧! 文章链接:https://www.researchgate.net/publication/316844643_ ...

  6. STM32学习之I2C协议(读写EEPROM)

    关于STM32学习分享 第七章 I2C协议(读写EEPROM) 文章目录 关于STM32学习分享 前言 二.代码 1.i2c.c 2.i2c.h 3.main.c 总结 前言 开始!开始!单片机的I2 ...

  7. 通过KXTF9-2050芯片分析I2C协议

    1.I2C协议 参见博客:<I2C通信协议详解和通信流程分析>. 2.I2C驱动的框架分析 (1)驱动框架分为两层:物理层和协议层.物理层是通用的,取决于主设备:协议层则每个从设备都不同. ...

  8. 《STM32从零开始学习历程》——I2C协议层

    <STM32从零开始学习历程>@EnzoReventon I2C理论部分--协议层 相关资料: I2C物理层介绍 I2C固件库介绍 STM32的I2C特性及架构介绍 参考资料: [野火Em ...

  9. I2C 协议抓包,学习,总结

    文章目录 I2C 调查 标准I2C协议介绍 I2C时序介绍 起始信号 停止信号 重启信号 总线闲信号 总线忙信号 读写信号 应答信号 非应答信号 标准I2C协议读写介绍 I2C写一个寄存器 I2C 读 ...

最新文章

  1. 17岁成研究生,20岁被劝退,38岁“神童”离世
  2. R语言使用ggplot2包使用geom_density()函数绘制基础密度图实战(density plot)
  3. java web一: xml
  4. Qt for ios 设置程序显示名称
  5. movie计算机英语作文,一篇“Movie Review英语作文
  6. vue -- 动态加载组件 (tap 栏效果)
  7. [leedcode 215] Kth Largest Element in an Array
  8. java空心字木塔_我国七个千年古塔:第四个空心没有塔顶,最后一个是木塔无钉无铆...
  9. tomcat 优化_浅谈Tomcat服务器优化方法
  10. 吐血整理!12种通用知识图谱项目简介
  11. LNMP环境--搭建Discuz论坛
  12. MySQL的常用SQL脚本
  13. 51nod 1050循环数组最大字段和
  14. mysql order by 自定义
  15. Flutter实战之底部导航栏 BottomNavigation
  16. oracle数据库论文参考文献,ORACLE数据库管理研究
  17. PDF、PMF、CDF是什么
  18. 计算机生物学美国直博,Nature:所有博士中,生物学博士收入垫底!
  19. 在阿里云CentOS7上搭建ftp服务器
  20. C#:DataGridView边框线、标题、单元格的各种颜色

热门文章

  1. php渲染nodejs api,nodejs通过响应回写渲染页面步骤详解
  2. faster-rcnn tensorflow windows demo运行
  3. hive随机抽取100条数据_用Excel进行随机抽取数据
  4. php jquery mysql,使用PHP / MySQL搜索并使用jQuery动态更新
  5. oracle_jdbc新建实例,JDBC的操作步骤和实例
  6. vega56刷64_Vega56刷入BIOS跑分直逼旗舰Vega64
  7. django实现上传文件并保存
  8. tcpdump/editcap等工具保存文件时名称中自定义添加日期/时间
  9. Ubuntu(elementary os)因为环境变量 /etc/profile 配置错误,导致登录界面无限循环,无法进入系统的解决方案
  10. pyplot 余弦函数_python如何画出三角函数