0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于I2C总线的读写操作流程详解

电子设计 来源:硬件助手 作者:硬件助手 2020-11-29 09:38 次阅读

本文主要介绍I2C总线的读写操作流程。

I2C总线的操作包括读和写,具体的操作流程如下:

1、主机发送数据(I2C写)流程
I2C主机给从机写数据的操作流程如下:
Master发起START;
Master发送I2C ADDR(7bit)和W操作0(1bit),等待ACK;
Slave发送ACK(ACK=0);
Master发送reg addr(8bit),等待ACK(该地址为双方约定的需要写入数据的首地址,实际使用中随机写入时可以没有该地址数据);
Slave发送ACK;
Master收到Slave的ACK信号后开始发送第一个字节的数据(8bit),等待ACK;
Slave收到数据后发送ACK;
Master收到ACK后再发送下一个数据;
当Master发送完最后一个字节数据并收到Slave的ACK后,发起STOP。



★主机通过发送地址码与对应的从机建立了通信关系,而挂接在总线上的其它从机虽然同时也收到了地址码,但因为与其自身的地址不相符合,因此提前退出与主机的通信;
★主机的一次发送通信,其发送的数据数量不受限制。主机是通过STOP信号通知发送的结束,从机收到STOP信号后退出本次通信;
★主机的每一次发送后都是通过从机的ACK信号了解从机的接收状况,如果应答错误则重发(一般重发次数可以设置,但次数太多会影响效率);
★实际测试时,ACK信号会有一个毛刺,是因为数据和ACK是不同的角色发出的(当主机发送数据时,从机返回ACK;当从机发送数据时,主机返回ACK),这样ACK正好是方向切换的时候,毛刺的大小取决于主从之间的切换速度。

2、主机接收数据(I2C读)流程
I2C主机读取从机数据的操作流程如下:
Master发送START;
Master发送I2C ADDR(7bit)和R操作1(1bit),等待ACK;
Slave发送ACK;
Master发送reg addr(8bit),等待ACK;
Slave发送ACK;
Master发起START;
Master发送I2C addr(7bit)和r操作1(1bit),等待ACK;
Slave发送ACK;
Slave发送ACK后,紧接着向Master发送数据;
Master收到数据后发送ACK;
Slave接收到ACK后再向Master发送下一个数据;
当Master完成接收数据后,向Slave发送一个非应答信号(NAK=1),从机收到非应答信号后停止发送数据;
Master发送非应答信号后,再发送一个STOP信号。



★主机所接收数据的数量是由主机自身决定,当发送“非应答信号/A”时从机便结束传送并释放总线(非应答信号的两个作用:前一个数据接收成功,从机不再发送数据)。当从机收到NAK信号后如果没有停止信号,则从机会重发上一字节数据。

3、读写指定地址的方式
I2C读写指定地址有以下几种方式:
在从器件地址后面直接跟需要读写的寄存器首地址,然后直接跟数据,最后通过停止信号结束此次读写。

主从器件约定读写指令,在从器件地址后面直接跟读写指令,然后再跟需要读写的寄存器首地址,然后直接跟数据。

在发送完从器件地址后直接跟需要读写的寄存器地址,然后再通过重复开始信号(后跟从机地址)进行读写操作(数据直接写入或者读取相应的寄存器)。





★所有读写操作,都不会限定数据的长度,读写数据的长度由主机决定。不需要读写数据了就发送STOP信号。

4、复合传输实现方式
在传输过程中改变方向,开始条件和从机地址都要重复,而读写bit要取反。如果主机发送一个重复的开始条件,那么它在这之前要发送一个NAK。

★复合模式可以在比如控制串行寄存器时用到。在第一个数据字节时一定要写寄存器内部的地址。开始条件和从地址重复后,数据就开始传输了。
★自动增加或减少之前访问的寄存器地址都由设备的设计者决定。
★兼容I2C总线的设备在接收到开始条件或重复开始条件时都一定要重启它们的总线逻辑,即使开始条件都不是正确的格式,它们都期望发送从机地址。
★开始条件后马上跟着一个终止条件是不合法的格式。

以上就是针对I2C总线的主机发送、主机接收、读写指定地址数据、符合传输方式的操作流程介绍。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • I2C总线
    +关注

    关注

    8

    文章

    357

    浏览量

    60409
收藏 人收藏

    评论

    相关推荐

    stm32f4软件模拟I2C读写EEPROM无器件响应是什么原因造成的?

    利用STM32F4软件模拟I2C读写EEPROM时,在检测I2C总线设备时,在等待应答阶段,CPU读取SDA线口状态值为1(GPIO_ReadInputDataBit(GPIOB,GP
    发表于 03-19 06:36

    STM32H7使用硬件I2C进行读写操作失败的原因?

    当Size为0时,在发出设备地址,寄存器地址后,重置I2C外设寄存器并退出函数,依然无法实现跟F4单片机同样的效果,通过逻辑分析仪查看,发现总线一直被占用,后续读取无法正常进行。 请问有没有别的方式实现我想要的效果。或者我只能使用寄存器直接
    发表于 03-11 08:12

    使用TC397实现I2C读写时候出发了Trap的原因?

    我这边使用TC397实现I2C 读写时候出发了Trap,对I2C操作分布在core0 与Core4 发生Trap 后对应的信息如下 DATR 寄存器的SBE 置位1 DEADD 寄存器
    发表于 02-02 16:20

    psoc6 i2c读写时死循环是什么原因导致的?

    我们的设备挂了一个i2c的传感器,psoc6当master,通过以下的示例代码来读写传感器的寄存器 { cy_stc_scb_i2c_master_xfer_config_t transfer
    发表于 02-02 11:02

    TC275操作I2C操作时陷入while循环无法退出怎么解决?

    写入TXD寄存器时,触发了SPB总线故障。 触发SPB总线故障的原因应该是手册里写的,FIFO还处于接收状态时写入TXD寄存器。 最终排查发现,由于在操作I2C时已经使能了CPU中断
    发表于 02-02 06:52

    如何配置TC38x I2C中断?

    我们的项目有 MCAL,但是 Loader 只是一个 while 循环,不要使用操作系统模块。 我们已经通过轮询模式实现了 I2C 通信,然后我们想切换到中断模式。 我们如何 CAN 通过寄存器
    发表于 01-29 07:42

    最简单的总线通讯!I2C通讯总线的原理原来这么好懂

    通讯I2C
    安泰仪器维修
    发布于 :2024年01月02日 11:16:31

    twi和i2c总线有什么区别?

    twi和i2c总线有什么区别,他们谁是不是兼容谁
    发表于 11-08 07:45

    i2c总线最多可以接多少设备?

    请问i2c总线最多可以接多少设备
    发表于 09-26 06:38

    I2C总线的使用与编程

    I2C总线是飞利浦公司在20世纪80年代初由S定义的一种二线制总线系统。I2C总线是一种双向的,专为简单但高效的控制应用而设计。 它广泛应用
    发表于 09-04 07:23

    80 第23.1讲 I2C实验-I2C协议和6U的I2C控制器详解 - 第2

    程序代码I2C协议
    充八万
    发布于 :2023年08月17日 10:03:33

    基于 FPGA 的模拟 I2C协议系统设计

    何时刻总线上只有一个主控器件(主节点)实现总线的控制操作,对总线上的其他节点寻址,可分时实现点-点的数据传送。因此总线上每个节点都有一个固定
    发表于 08-14 18:21

    stm32f4软件模拟I2C读写EEPROM无器件响应是什么原因造成的?

    利用STM32F4软件模拟I2C读写EEPROM时,在检测I2C总线设备时,在等待应答阶段,CPU读取SDA线口状态值为1(GPIO_ReadInputDataBit(GPIOB,GP
    发表于 08-07 06:32

    STM32CubeMx入门教程(7):I2C读写应用

    导语“本次 教程使用CubeMx配置I2C进行I2C总线设备的数据读写操作,使用EEPROM作为实验对象”
    发表于 07-12 11:34 1610次阅读
    STM32CubeMx入门教程(7):<b class='flag-5'>I2C</b>的<b class='flag-5'>读写</b>应用

    LPC55xx为I2C总线配置非“真正的开漏”引脚,还需要考虑什么?

    我在 LPC5528、Flexcomm1 和 Flexcomm4 上使用两个 I2C 总线接口。 关于 Flexcomm1,数据表指出 P0_13 和 P0_14 是“真正的漏极开路引脚。符合
    发表于 05-16 07:21