我科目四又挂了 2024-03-18 10:37 采纳率: 72.7%
浏览 3

I2C的流程讲解,I2C的流程讲解,

问一个I2C的问题:
write 0x3102=0x10, read 0x3102, if =10 ,pass 从机地址是0X60
这个传输的流程应该是怎么样的?我看我们之前的项目流程是这样的:
起始信号->丛机设备地址->写->ACK->寄存器地址->ACK->对应的寄存器地址数据->ACK->SR->丛机设备地址->读->寄存器地址数据->ACK->STOP

我的疑问是,在读数的那个后面不应该还有一个读寄存器地址的过程吗?

并且我看网上I2C的资料,这个流程有好多不一样

img

img


就例如这两个流程,下面的就没有写入寄存器地址,所以我现在对I2C的流程有点模糊

  • 写回答

5条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-03-18 10:37
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    对于这个问题,流程如下:
    1. 主设备发送起始信号(Start)
    2. 主设备发送从机设备地址(0x60)和写控制位
    3. 主设备发送寄存器地址(0x31, 0x02)并发送写数据(0x10)
    4. 主设备发送再次起始信号(Repeated Start)
    5. 主设备发送从机设备地址(0x60)和读控制位
    6. 从机设备发送寄存器地址数据(0x10)
    7. 从机设备发送应答信号(ACK)
    8. 主设备发送停止信号(Stop)
    9. 主设备判断读到的数据是否为0x10,如果是则pass,否则失败 关于流程中的疑问,读取数据的过程中只需要读取数据,不需要再读取寄存器地址。不同的I2C设备可能会有一些小的差别,但是基本流程是一致的。 以下是Python代码实现,仅供参考:
    import smbus
    # 创建I2C对象
    i2c = smbus.SMBus(1)
    # 发送写命令
    i2c.write_i2c_block_data(0x60, 0x31, [0x02, 0x10])
    # 发送读命令
    i2c.write_i2c_block_data(0x60, 0x31, [0x02])
    data = i2c.read_byte(0x60)
    # 判断读取的数据是否为0x10
    if data == 0x10:
        print("pass")
    else:
        print("fail")
    

    注:以上代码仅供参考,具体实现还需根据具体的硬件以及I2C设备进行调整。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月18日

悬赏问题

  • ¥30 YOLO检测微调结果p为1
  • ¥20 求快手直播间榜单匿名采集ID用户名简单能学会的
  • ¥15 DS18B20内部ADC模数转换器
  • ¥15 做个有关计算的小程序
  • ¥15 MPI读取tif文件无法正常给各进程分配路径
  • ¥15 如何用MATLAB实现以下三个公式(有相互嵌套)
  • ¥30 关于#算法#的问题:运用EViews第九版本进行一系列计量经济学的时间数列数据回归分析预测问题 求各位帮我解答一下
  • ¥15 setInterval 页面闪烁,怎么解决
  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题