网页设计做音乐网站,潍坊网站设计制作,u钙网logo设计影视剪辑,wordpress 做下载站Linux下读写芯片的I2C寄存器
2012-01-10 11:40:18 标签#xff1a;Linux 寄存器 驱动 读写 I2C 原创作品#xff0c;允许转载#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://ticktick.blog.51cto.com/823160/76096…Linux下读写芯片的I2C寄存器
2012-01-10 11:40:18
标签Linux 寄存器 驱动 读写 I2C 原创作品允许转载转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://ticktick.blog.51cto.com/823160/760965 要想在Linux下读写芯片的I2C寄存器一般需要在Linux编写一份该芯片的I2C驱动关于Linux下如何编写I2C驱动前一篇文章《手把手教你写Linux I2C设备驱动》已经做了初步的介绍并且留下了两个疑问尚未解决第一个是如何对Linux提供的I2C操作函数进行进一步封装实现对芯片寄存器的读写另一个是如何在用户空间调用该I2C驱动代码。本文将讨论前一个问题。 首先我们要了解Linux系统提供的I2C操作函数怎么使用上篇文章已经提到过对I2C设备的读写Linux系统提供了多种接口这些接口可以在内核的 i2c.h 中找到这里我主要介绍下面这组读写接口 extern int i2c_master_send(struct i2c_client *,const char* ,int); extern int i2c_master_recv(struct i2c_client *,char* ,int); 第一个参数是 i2c_client 对象指针第二个参数是要传输的数据buffer指针第三个参数为buffer的大小。 接口函数已经有了下面我们要解决的问题就是以何种形式/规则去使用这些接口才能正确地读写芯片的相关寄存器。 首先我们需要查询芯片手册找到芯片手册中关于寄存器的I2C读写时序其实大多数芯片的I2C寄存器的读写时序都是一样的下面我还是以手头的TVP5158芯片为例。 首先分析写操作该芯片的手册中给出的I2C寄存器写时序图如下 从上图可以看出真正需要执行写操作的有两处Step4 和 Step6 Step4首先写入寄存器的偏移地址而Step6则是写入到该寄存器的值。由此已经很清楚了对于写I2C寄存器我们需要做的就是给 i2c_master_send 函数传入两个字节的数据即可第一个字节为寄存器的地址第二个字节为要写入寄存器的数据。示例如下 static int tvp5158_i2c_write( struct i2c_client* client,uint8_t reg,uint8_t data) { unsigned char buffer[2]; buffer[0] reg; buffer[1] data; if( 2! i2c_master_send(client,buffer,2) ) { printk( KERN_ERR tvp5158_i2c_write fail! \n ); return -1; } return 0; } 其实挺简单的没有什么复杂的代码。下面再看看读时序。 由上图可以读时序需要做的操作是先向I2C总线上写入需要读的寄存器地址然后读I2C总线上的值。代码写起来也不难示例如下 static int tvp5158_i2c_read( struct i2c_client* client,uint8_t reg,uint8_t *data) { // write reg addr if( 1! i2c_master_send(client,reg,1) ) { printk( KERN_ERR tvp5158_i2c_read fail! \n ); return -1; } // wait msleep(10); // read if( 1! i2c_master_recv(client,data,1) ) { printk( KERN_ERR tvp5158_i2c_read fail! \n ); return -1; } return 0; } 到此为止Linux下具体如何封装读写芯片寄存器的方法已经介绍完毕其实并不复杂希望对初学者有所帮助文中有什么讲述不正确的地方欢迎留言或者来信lujun.hustgmail.com交流。