2012-03-26 102 views
0

我需要寫一個I2C程序,它可以使用I2C_RDWR ioctl將數據寫入32位和16位寄存器地址。將32位寄存器地址傳遞給I2C_RDWR

據我所知,設備地址和數據被一起傳遞到使用在結構i2c_msg同一緩衝區buf在linux I2C驅動定義的設備:

struct i2c_msg { 
     __u16 addr;  slave address 
     __u16 flags; 
#define I2C_M_TEN  0x10  we have a ten bit chip address 
#define I2C_M_RD  0x01 
#define I2C_M_NOSTART 0x4000 
#define I2C_M_REV_DIR_ADDR  0x2000 
#define I2C_M_IGNORE_NAK  0x1000 
#define I2C_M_NO_RD_ACK   0x0800 
     __u16 len;    msg length 
     __u8 *buf;    pointer to msg data 
}; 

目前我傳球32位寄存器地址如下:

buf[3] = reg_addr & 0xff; 
    buf[2] = (reg_addr >> 8) & 0xff; 
    buf[1] = (reg_addr >> 16) & 0xff; 
    buf[0] = (reg_addr >>24) & 0xff; 
//buf[4,5...] = data; 
    msg.buf = buf; 

如果16位,下面的代碼被執行寄存器地址:

buf[1] = (reg_addr & 0xff); 
    buf[0] = (reg_addr >> 8); 
    buf[2] = data; 
// buf[2,3...] = data; 

如何讓設備知道有多少個緩衝區數組包含地址?

此外,這段代碼是否正確?

不幸的是我目前沒有任何I2C設備來測試。

任何幫助,歡迎。

Thanx。

回答

1

I2C命令將發送一個字節流到由I2C地址選擇的設備。它完全取決於設備如何解釋這些設備,並且您需要閱讀設備數據表以瞭解詳情。

例如,考慮Atmel I2C EEPROM。 512kBit或更少的設備使用固定的16位地址,而1MBit AT24C1024B使用17位地址。其中的16位出現在I2C命令流中,並且MSB被編碼到I2C設備地址中。

+0

保存了我的一天。很多謝謝。 – zacurry 2012-03-26 12:41:53