最近需要操作24C02,封装了一下函数方便以后操作。

参考链接:

  https://my.oschina.net/handawei/blog/68526

  http://blog.csdn.net/onetwothreef/article/details/49488443

源码:

#include <stdio.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>#define I2C_DEFAULT_TIMEOUT     1
#define I2C_DEFAULT_RETRY       3/** fd       : 文件描述符* timeout  : 发送超时时间* retry    : 重复发送次数*/
//重复发送次数可以设多一点,在调试的时候,只设置了一次,导致有时候发送会失败。
int i2c_set(int fd, unsigned int timeout, unsigned int retry)
{if (fd == 0 )return -1;if (ioctl(fd, I2C_TIMEOUT, timeout ? timeout : I2C_DEFAULT_TIMEOUT) < 0)return -1;if (ioctl(fd, I2C_RETRIES, retry ? retry : I2C_DEFAULT_RETRY) < 0)return -1;return 0;
}
/** fd   : 文件描述符* addr : i2c的设备地址* reg  : 寄存器地址* val  : 要写的数据* 描述 :从指定地址写数据*/
int i2c_byte_write(int fd, unsigned char addr, unsigned char reg, unsigned char val)
{int ret = 0;unsigned char outbuf[2];struct i2c_rdwr_ioctl_data packets;struct i2c_msg messages;packets.nmsgs = 1;packets.msgs = &messages;//发送要读取的寄存器地址messages.addr = addr;messages.flags = 0;messages.len = 2;       //寄存器地址加数据,共发送2个字节messages.buf = outbuf;outbuf[0] = reg;outbuf[1] = val;ret = ioctl(fd, I2C_RDWR, (unsigned long)&packets);   //读出来if (ret < 0)ret = -1;return ret;
}/*  * fd   : 文件描述符* addr : i2c的设备地址* reg  : 寄存器地址* val  : 要写的数据* len  : 数据长度* 描述 :从指定地址写数据*        24c02以8字节为1个page,如果在一个page里面写,写的字节长度超过这个page的末尾,*        就会从page的开头写,覆盖开头的内容*/
int i2c_nbytes_write(int fd, unsigned char addr, unsigned char reg, unsigned char *val, int len)
{int ret = 0;struct i2c_rdwr_ioctl_data packets;struct i2c_msg messages;int i;packets.nmsgs = 1;packets.msgs = &messages;//发送要读取的寄存器地址messages.addr = addr;messages.flags = 0;         //writemessages.len = len + 1;     //数据长度//发送数据messages.buf = (unsigned char *)malloc(len+1);if (NULL == messages.buf){ret = -1;goto err;}messages.buf[0] = reg;for (i = 0; i < len; i++){messages.buf[1+i] = val[i];}ret = ioctl(fd, I2C_RDWR, (unsigned long)&packets);//读出来if (ret < 0){printf("write error!\n");return -1;}err:free(messages.buf);return ret;
}/*  * fd   : 文件描述符* addr : i2c的设备地址* val  : 保存读取数据* 描述 :从当前地址读取一个字节数据*/
int i2c_byte_read(int fd, unsigned char addr, unsigned char *val)
{int ret = 0;struct i2c_rdwr_ioctl_data packets;struct i2c_msg messages;packets.nmsgs = 1;              //数据帧类型只有一种,读操作,只需要发送一个起始信号,因此是1packets.msgs = &messages;//发送要读取的寄存器地址messages.addr = addr;           //i2c设备地址messages.flags = I2C_M_RD;      //读操作messages.len = 1;               //数据长度messages.buf = val;             //读取的数据保存在valret = ioctl (fd, I2C_RDWR, (unsigned long)&packets);  //发送数据帧if (ret < 0)ret = -1;return ret;
}/** fd   : 文件描述符* addr : i2c的设备地址* reg  : 寄存器地址* val  : 保存读取的数据* len  : 读取数据的长度* 描述 :读取达到eeprom的末尾时,会读取最开头的字节*/
int i2c_nbytes_read(int fd, unsigned char addr, unsigned char reg, unsigned char *val, int len)
{int ret = 0;unsigned char outbuf;struct i2c_rdwr_ioctl_data packets;struct i2c_msg messages[2];/* 数据帧类型有2种* 写要发送起始信号,进行写寄存器操作,再发送起始信号,进行读操作,* 有2个起始信号,因此需要分开来操作。*/packets.nmsgs = 2;           //发送要读取的寄存器地址messages[0].addr = addr;messages[0].flags = 0;              //writemessages[0].len = 1;                //数据长度messages[0].buf = &outbuf;          //发送寄存器地址outbuf = reg;//读取数据messages[1].len = len;                           //读取数据长度messages[1].addr = addr;                         //设备地址messages[1].flags = I2C_M_RD;                    //readmessages[1].buf = val;packets.msgs = messages;ret = ioctl(fd, I2C_RDWR, (unsigned long)&packets); //发送i2c,进行读取操作 if (ret < 0)ret = -1;return ret;
}

Tony Liu

2016-9-23, Shenzhen

linux i2c 设备节点读写相关推荐

  1. Linux I2C设备驱动编写(二)

    I2C对外API I2C client的注册 i2c_register_board_info具体实现 i2c_new_device I2C driver 关于I2C设备驱动的小总结 I2C adapt ...

  2. linux I2c设备注册

    OMAP3630 I2C device驱动     在Linux内核中,I2C device驱动位于drivers/i2c/chips目录下,可以看到该目录下有很多相关的device驱动,这里以xxx ...

  3. Linux I2C 设备注册

    OMAP3630 I2C device驱动     在Linux内核中,I2C device驱动位于drivers/i2c/chips目录下,可以看到该目录下有很多相关的device驱动,这里以xxx ...

  4. linux下i2c设备驱动程序,Linux I2C 设备驱动

    I2C 设备驱动要使用 i2c_driver 和 i2c_client 数据结构并填充其中的成员函数.i2c_client 一般被包含在设备的私有信息结构体yyy_data 中,而 i2c_drive ...

  5. 手把手教你写Linux I2C设备驱动

    手把手教你写Linux I2C设备驱动 标签:Linux 设备 驱动 详解 i2c 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http:/ ...

  6. linux探测i2c设备连接状态,手把手教你写Linux I2C设备驱动

    Linux I2C驱动是嵌入式Linux驱动开发人员经常需要编写的一种驱动,因为凡是系统中使用到的I2C设备,几乎都需要编写相应的I2C驱动去配置和控制它,例如 RTC实时时钟芯片.音视频采集芯片.音 ...

  7. 手把手教你写Linux I2C设备驱动 tvp5158

    Linux I2C驱动是嵌入式Linux驱动开发人员经常需要编写的一种驱动,因为凡是系统中使用到的I2C设备,几乎都需要编写相应的I2C驱动去配置和控制它,例如 RTC实时时钟芯片.音视频采集芯片.音 ...

  8. linux i2c detect函数,手把手教你写Linux I2C设备驱动

    Linux I2C驱动是嵌入式Linux驱动开发人员经常需要编写的一种驱动,因为凡是系统中使用到的I2C设备,几乎都需要编写相应的I2C驱动去配置和控制它,例如 RTC实时时钟芯片.音视频采集芯片.音 ...

  9. Linux添加一个i2c设备,手把手教你写Linux I2C设备驱动

    Linux I2C驱动是嵌入式Linux驱动开发人员经常需要编写的一种驱动,因为凡是系统中使用到的I2C设备,几乎都需要编写相应的I2C驱动去配置和控制它,例如 RTC实时时钟芯片.音视频采集芯片.音 ...

最新文章

  1. 生产环境:Nginx高可用方案
  2. 科技部部长:基础研究是科技创新“总开关”
  3. 009_Spring Data JPA一对一关系
  4. 有关中断唤醒源的思考
  5. c#匿名方法用途_C#的匿名方法
  6. 【Unity】Planar Shadows平面阴影的实现
  7. 《剑指offer》构建乘积数组
  8. 如何用FineReport制作一张报表(一)
  9. 代码编辑器sublime text 4使用小技巧--快捷键说明
  10. Hadoop真的适合你吗?
  11. RandomAccessFile类的简单介绍,以及代码演示
  12. pandas数据聚合与分组
  13. python 百度网盘下载提速_教你如何百度网盘的提高下载速度?
  14. Java并发笔记-未完待续待详解
  15. java 生成二维码,带logo,底部文字
  16. 网线测试报告软件,网线检测报告.doc
  17. 台式电脑怎么组装步骤_台式电脑组装教程图解,手把手教您组装(零基础也能搞定)...
  18. html 页面文字不能复制粘贴,网页无法复制文字怎么办
  19. Branches ‘develop‘ and ‘origin/develop‘ have diverged. Fatal: And branch ‘develop‘ may be fast-forwa
  20. kettle- linux定时执行ktr shell脚本

热门文章

  1. 图解C# Console 输出和Console相关编程复习总结
  2. Spring.Net官网翻译
  3. 数据库中的约束和三大范式
  4. Java 学习笔记 反射与迭代器
  5. MAC下 Apache服务器配置
  6. 选择排序的思想及其实现
  7. 代码编译delphi条件编译
  8. mySql完全手册2011031401
  9. 在SQL Server中sqlserver,access,excel之间数据如何使用sql语句直接操作
  10. 求职过程记录(5)——黎明到来