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信號,我想這就是這個標志起這個名的原因。我們可以猜想,
- msgs序列第一個數據必須是地址,同時必須不定義這個標志位
- 在進行讀數據,要從寫操作轉變為讀操作時,會發重復start信號和器件地址時,必須不定義這個標志位
- 其它情況下一的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一起使用,否則會導致讀位依然是寫位;
變成以下類型: