下面介绍一下I2C程序的框架。
IIC控制器不知道数据的含义,它只负责数据的传输,主要是读和写功能的实现。
下图是IIC传输数据的结构。
下图是AT24cxx的写时序图。
下图是AT24cxx的读时序图。
我们的程序应该分为两层,上层是I2C设备,比如AT24cxx,下层是I2C控制器,比如2440。
I2C控制器有很多种,比如2440的I2C控制器,Ti的I2C控制器,他们都分到下层的I2C控制器一层,上层的I2C设备则将I2C的功能进行封装,这样在使用不同芯片的I2C控制器时,我们就直接通过调用设备函数而不关心底层的控制器类型。
通过i2c_transfer函数来调用I2C设备,第一个参数是I2C message,第二个是message的数量。I2C message是一个结构体,其中的元素类型参考uboot中的I2C message来设置。
下图是uboot中的i2c message,参考uboot中的i2c_msg来编写我们自己驱动的I2C message,我们不需要那么复杂,只需要实现读写功能即可。
- addr,表明设备地址;
- flags,表明是读还是写,写设为0,读设为1;
- len,表示要读或写的数据的数量;
- buf,数据的缓冲区,对于写,用来指向数据;对于读,用来存取数据。
对于写操作,需要使用两个i2c message,一个用来写地址,一个用来读数据。看要几个message,可以通过start信号的个数来判断,几个s信号就表示需要使用几个message
综上所述,底层共用三个文件。
- at24cxx.c,主要存放at24cxx的读写函数;
- i2c_controller.c,主要实现i2c控制器的功能,供上层调用。
- s3c2440_i2c_controller.c,实现2440的i2c控制器功能,i2c_controller.c会来这里调用相关函数。