i2c_msg 標志位 - repeat-start


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM