2012-03-26 97 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