您的位置:首页 > 其它

不同层面上操控I2C进行读写操作

2011-12-01 12:37 387 查看
最近一直在做有关I2C控制方面的工作。主要内容就是控制I2C,实现通过I2C对其上面挂载的从设备的相关操作,即对从设备的指定寄存器进行读写。
我实现了在三个层面上控制I2C对其从设备进行读写的操作,分别是基于uboot环境,基于内核态环境和在用户空间环境的。下面做一下简单的介绍。

1.在uboot环境下:

在uboot中,实现对I2C的控制,主要方法有两种:

1)在开发板上启动uboot后,直接使用uboot的I2C操作的命令。

对相关寄存器的写命令:imw 从设备地址 寄存器号 要写入的数值

对相关寄存器的读命令:imw 从设备地址 寄存器号 要读取的数据量个数

注意:这里的地址都是十六进制的,寄存器号和数据也是十六进制的。

2)在编译uboot的时候,添加自己的命令来实现控制I2C的读写操作。具体的在uboot中添加自己设置的命令方法在之前的文章中介绍过的。

主要是在命令处理文件中添加部分函数操作就可以了。

首先,添加头文件声明,即#include <i2c.h>;其次,使用两个相关的函数,即i2c_reg_write(address,reg,value),address是设备的从地址,reg是对应的寄存器,value是要写入的数值。对应的读操作函数与其类似的,即i2c_reg_read();调用这两个函数就可以实现读写寄存器操作了。

2.在内核空间中:

最常用的方法就是编写一个驱动模块,再动态加载进内核了。至于内核模块的编写不再多说了。在函数中,调用相关的函数接口就能实现目的了。

相应的函数是:i2c_sambus_write_byte_data()和i2c_sambus_write_word_data()。前者是向寄存器中写八位的数据,而后者是向寄存器中写十六位的数据。这两个函数都有三个参数,分别是i2c_client结构体的指针,寄存器号和数据。而相关的从设备地址,是在i2c_client的结构体成员变量中设定的。





至于相关的读操作,与之类似的。

3.在用户空间中:

这里主要会用到相关的系统调用函数的。

首先,是利用文件操作函数,打开i2c设备节点进行操作。





其次,使用ioctl函数进行系统调用操作。





这是用来设定相关的设备从地址。

然后,利用我们最为熟悉的文件写函数,对该从设备的寄存器进行读写就可以了。





参数分别是所打开文件的返回值,要发送的数据,写操作的数据数量。这里要注意的是,我们必须对第二个参数进行处理,其实际是一个指针。我们是将从设备的寄存器号和相应的数据都封装到这个参数之中了。这样,整体的传了进来。熟悉I2C的读写协议的话就很好理解了。

由于学习I2C的时间还是比较短,理解上还是存在很多偏差的,暂且写到这里。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: