zoukankan      html  css  js  c++  java
  • i2c_msg 标志位

    i2c_msg标志位
         路径:linux-2.6.38/include/linux/i2c.h

    • I2C_M_IGNORE_NAK:

    设置这个标志意味当前i2c_msg忽略I2C器件的ack和nack信号。

    • I2C_M_NOSTART:

    设置这个标志意味当前i2c_msg不发送start信号。注意,其实调用bit_xfer的一开始就已经发了start信号了(程序第10行),这个标记无非就是标志是否发送地址第18行。其次,如果一个i2c_msg没有定义I2C_M_NOSTART而且又不是msgs序列里的第一个i2c_msg,则回发送重复start信号,我想这就是这个标志起这个名的原因。我们可以猜想,

    1. msgs序列第一个数据必须是地址,同时必须不定义这个标志位
    2. 在进行读数据,要从写操作转变为读操作时,会发重复start信号和器件地址时,必须不定义这个标志位
    3. 其它情况下一的i2c_msg必须定义这个标志

    以上只是我看完这个函数的理解,不一定正确。同时1和2总结下来就是发器件地址(注意,是器件地址,不是像EEPROM那样的EEPROM地址,这个地址是当数据发的)时会不设置I2C_M_NOSTART, 发数据时就设置I2C_M_NOSTART这个标志。

    • I2C_M_NO_RD_ACK:

    这个标识表示在正行读操作时不去ACK,我不知道其它芯片如果,如果是AT24C04则一定不能设这个标志位了。

    (下面三个标志为均为bit_doAddress函数使用,结合上面的说明,也就是这时I2C_M_NOSTART一定没有设置。)

    • I2C_M_RD:
      表示这是一个读操作,默认是把相应的位置1
    • I2C_M_REV_DIR_ADDR:
      表示把读写标志位反转,也就是读是把相应位置0
    • I2C_M_TEN:
      表示这个器件的器件地址是10Bit的。一定要搞清,这是器件地址,不是指EEPROM的ROM地址。24C02等芯片真正的器件地址只有4位永远有效(0xA),低4位用来放其它东西了(根据容量有可能是器件地址的低3位,或ROM地址的高3位)。也是说,无论什么容量,这类器件的地址只是器件地址我们只选7位模式(内核只区分10位模式和其它模式)

    如果要发送以下的序列的话:

    则必须用I2C_M_NOSTART | I2C_M_RD一起使用,否则会导致读位依然是写位;

    变成以下类型:

    参考文章:

    Linux I2C framework(2)_I2C provider

  • 相关阅读:
    最简单的 Java内存模型 讲解
    Chrome快捷键吐血整理
    【并发编程】InheritableThreadLocal使用详解
    【并发编程】Object的wait、notify和notifyAll方法
    【并发编程】Thread类的详细介绍
    【软件工具】easyExcel简明使用指南
    【并发编程】实现多线程的几种方式
    【并发编程】Java并发编程传送门
    CODING 研发管理系统上线全球加速,助力企业跨区域协作
    上帝的归上帝,凯撒的归凯撒—— CODING 权限管理更新
  • 原文地址:https://www.cnblogs.com/linhaostudy/p/11866012.html
Copyright © 2011-2022 走看看