i2c設備的讀寫地址換算


 #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,






免責聲明!

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



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