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

     最近一直在做有关I2C控制方面的工作。主要内容就是控制I2C,实现通过I2C对其上面挂载的从设备的相关操作,即对从设备的指定寄存器进行读写。

     我实现了在三个层面上控制I2C对其从设备进行读写的操作,分别是基于uboot环境,基于内核态环境和在用户空间环境的。下面做一下简单的介绍。

1.在uboot环境下:

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

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

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

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

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

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

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

    首先,添加头文件声明,即#include ;其次,使用两个相关的函数,即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的时间还是比较短,理解上还是存在很多偏差的,暂且写到这里。

你可能感兴趣的:(嵌入式相关)