#define MAX_17040_BATTERY_I2C_ADDR (0x36)
#define MAX_17040_BATTERY_WRITE_ADDR (MAX_17040_BATTERY_I2C_ADDR << 1)
#define MAX_17040_BATTERY_READ_ADDR ((MAX_17040_BATTERY_I2C_ADDR << 1) + 1)
一般給出i2c 寫地址就可以,讀地址i2c核心會去自己算出來。
ioctl函數的使用:原型:struct ioctl(struct file *file,unsigned int cmd,unsigned long arg); cmd有I2C_SLAVE,I2C_SLAVE_FORCE,I2C_TENBIT,I2C_S3C2410_SET_SPEED幾個選項; I2C_SLAVE:對應的arg取值為I2C從機地址,用來設定I2C從機地址;
I2C_SLAVE_FORCE:對應的arg取值為I2C從機地址,用來修改I2C從機地址;
I2C_TENBIT:對應的arg取值為0:從機地址為7 bit;對應的arg取值為1:從機地址為10bit。用來指定I2C從機地址的位數;
I2C_S3C2410_SET_SPEED:對應的arg取值為I2C總線控制器分頻值。用來設置I2C總線控制器時鍾頻率;
常用設置設置I2c從機地址為0xA0,如果選用at24c08設備,那么從機是7 bit地址,所以要右移1位,指定從機地址為7 bit,
ioctl(fd,I2C_TENBIT,0)。ioctl(fd,I2C_SLAVE,0xA0>>1);
read()與write()函數的使用 假設子地址為12,向有子地址的器件寫進7個字節:
unsigned char buf[8]={12,'s','j','s','u','n','n','y');/*第1個字節12為子地址*/write(fd,buf,9);/*寫進7個字節,第1個字節為子地址*/
從有子地址的I2C器件讀取7個字節: unsigned char suba=0;recbuf[20]; write(fd,buf,1);/*發送子地址0*/ read(fd,recbuf,7);/*從子地址12開始讀取7個字節*/
拿一個項目中的例子說,是一個CTP的i2c地址,
static const struct i2c_device_id tpd_id[] = {{TPD_DEVICE,0},{}};
unsigned short force[] = {0,0xb8,I2C_CLIENT_END,I2C_CLIENT_END}; //82 38 70
static const unsigned short * const forces_pixcir[] = { force, NULL };
static struct i2c_client_address_data addr_data = { .forces = forces_pixcir, };
根據其Datasheet來瞧,他的I2c地址是0x5C,但是你用這個地址在kernel中通過I2c控制器去訪問的時候是訪問不到的,
需要將這個5C 左移1位 ,得到I2c讀地址, 寫地址比讀地址大1 ,那寫地址就是(b8<<1)+1=B9,