I2C系统的重要结构体
参考资料:
- Linux驱动程序: 
drivers/i2c/i2c-dev.c - I2CTools: 
https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/ 
1. I2C硬件框架

2. I2C传输协议

3. Linux软件框架

4. 重要结构体
使用一句话概括I2C传输:APP通过I2C Controller与I2C Device传输数据。
 在Linux中:
- 怎么表示I2C Controller 
  
-  
一个芯片里可能有多个I2C Controller,比如第0个、第1个、……
 -  
对于使用者,只要确定是第几个I2C Controller即可
 -  
使用i2c_adapter表示一个I2C BUS,或称为I2C Controller
 -  
里面有2个重要的成员:
- nr:第几个I2C BUS(I2C Controller)
 - i2c_algorithm,里面有该I2C BUS的传输函数,用来收发I2C数据
 
 -  
i2c_adapter

 -  
i2c_algorithm

 
 -  
 - 怎么表示I2C Device 
  
- 一个I2C Device,一定有设备地址
 - 它连接在哪个I2C Controller上,即对应的i2c_adapter是什么
 - 使用i2c_client来表示一个I2C Device

 
 - 怎么表示要传输的数据 
  
-  
在上面的i2c_algorithm结构体中可以看到要传输的数据被称为:i2c_msg
 -  
i2c_msg

 -  
i2c_msg中的flags用来表示传输方向:bit 0等于I2C_M_RD表示读,bit 0等于0表示写
 -  
一个i2c_msg要么是读,要么是写
 -  
举例:设备地址为0x50的EEPROM,要读取它里面存储地址为0x10的一个字节,应该构造几个i2c_msg?
-  
要构造2个i2c_msg
 -  
第一个i2c_msg表示写操作,把要访问的存储地址0x10发给设备
 -  
第二个i2c_msg表示读操作
 -  
代码如下
 
 -  
 
 -  
 
  u8 data_addr = 0x10;
  i8 data;
  struct i2c_msg msgs[2];
  
  msgs[0].addr   = 0x50;
  msgs[0].flags  = 0;
  msgs[0].len    = 1;
  msgs[0].buf    = &data_addr;
  
  msgs[1].addr   = 0x50;
  msgs[1].flags  = I2C_M_RD;
  msgs[1].len    = 1;
  msgs[1].buf    = &data;
 
5. 内核里怎么传输数据
使用一句话概括I2C传输:
- APP通过I2C Controller与I2C Device传输数据
 - APP通过i2c_adapter与i2c_client传输i2c_msg
 - 内核函数i2c_transfer 
  
- i2c_msg里含有addr,所以这个函数里不需要i2c_client

 
 - i2c_msg里含有addr,所以这个函数里不需要i2c_client
 



















