当前位置: 首页 > news >正文

linux tmp75 /dev/i2c-* 获取数据 demo

/**********************************************************************
 *             linux tmp75 /dev/i2c-* 获取数据 demo
 * 说明:
 *     之前尝试过一次用这种方式来读EEPROM,结果以失败告终,也没找到原因,
 * 今天定位到问题是由于I2C_SLAVE、I2C_SLAVE_FORCE导致的,之前一直尝试
 * I2C_SLAVE,今天定位到问题是I2C总线忙,改成用I2C_SLAVE_FORCE就解决。
 * 还有就是测试程序的时候,竟然把不小心tmp75的连续转换给关了,导致获取到
 * 的数据总是固定的,一度怀疑人生。
 *
 *                                     2016-3-26 深圳 南山平山村 曾剑锋
 *********************************************************************/


// 参考文章:
//     1. MX6 i2C linux driver
//          https://community.freescale.com/thread/315690
//     2. Linux内核学习:I2C_SLAVE_FORCE
//          http://m.blog.csdn.net/article/details?id=8245226
//

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h> 
#include <unistd.h>
#include <sys/time.h>

#define I2C_DEV "/dev/i2c-3"

int main(void){

    int tmp75Fd;
    int ret;
    unsigned char slaveAddr = 0x4c;
    unsigned char buf[4] = {0};

    // 打开设备
    tmp75Fd = open(I2C_DEV, O_RDWR);        
    if ( tmp75Fd < 0 ){
        printf("faile to open the i2c bus: %s.\n", I2C_DEV);
        return -1;
    }

    // 设置7位地址
    if ( ioctl(tmp75Fd, I2C_TENBIT, 0) < 0) {
        printf("faile to set bits.\n");
        return -1;
    }
    // 强制设置地址
     //if ( ioctl(tmp75Fd, I2C_SLAVE, 0x4c) < 0 ) {
     if ( ioctl(tmp75Fd, I2C_SLAVE_FORCE, 0x4c) < 0 ) {
        perror("faile to set address.\n");
        return -1;
      }

    // 配置tmp75控制器
    buf[0] = 0x01;
    buf[1] =  (1 << 6) | (1 << 5);
    if ( write(tmp75Fd, buf, 2) != 2 ) {
        perror("faile to write config.\n");
        return -1;
    }    

    // 读取tmp75控制器中的值,保证配置正确
    buf[0] = 1;
    if ( write(tmp75Fd, buf, 1) != 1 ) {
        perror("faile to write Pointer register.\n");
        return -1;
    }
    buf[0] = 0;
    if ( read(tmp75Fd, buf, 1) != 1 ) {
        perror("faile to read back configure data.\n");
        return -1;
    }
    printf("tmp75 configure: 0x%x.\n", buf[0]);


    // 将tmp75内的寄存器指针指向地址0
    buf[0] = 0;
    if ( write(tmp75Fd, buf, 1) != 1 ) {
        perror("faile to write Pointer register.\n");
        return -1;
    }

    // 循环读取温度数据
    buf[0] = 0;
    buf[1] = 0;
    while ( 1 ) {

        if ( read(tmp75Fd, buf, 2) != 2 ) {
            perror("faile to read data.\n");
            return -1;
        }
        printf("tmp75 temperature: 0x%x%x.\n", buf[0], buf[1]);

        usleep(500000);
    }
    
    // 貌似是多余的
    close(tmp75Fd);

    return 0;
}

 

相关文章:

  • 《Thinking in Java》Forth 控制执行流程
  • Android学习笔记-----------广播
  • Ajax跨域访问
  • UILabel和Scrollview结合用,label高度自适应
  • Analytics.js简介
  • YII文件上传
  • Linux下ssh远程连接慢解决
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • 高项-3月30号培训作业
  • ThreadPoolExecutor运行机制
  • 循环创建按钮
  • python3-itertools模块和迭代器函数
  • Java字节码浅析(三)
  • swift学习笔记
  • Java静态代码分析工具——FindBugs插件的安装与使用
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • Angular数据绑定机制
  • centos安装java运行环境jdk+tomcat
  • Computed property XXX was assigned to but it has no setter
  •  D - 粉碎叛乱F - 其他起义
  • Kibana配置logstash,报表一体化
  • Mybatis初体验
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Sequelize 中文文档 v4 - Getting started - 入门
  • vue2.0项目引入element-ui
  • Yeoman_Bower_Grunt
  • 基于游标的分页接口实现
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 小试R空间处理新库sf
  • 用Canvas画一棵二叉树
  • 做一名精致的JavaScripter 01:JavaScript简介
  • gunicorn工作原理
  • Semaphore
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • #微信小程序(布局、渲染层基础知识)
  • (C#)获取字符编码的类
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (层次遍历)104. 二叉树的最大深度
  • (附源码)ssm高校实验室 毕业设计 800008
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (六)软件测试分工
  • (四)Android布局类型(线性布局LinearLayout)
  • (转)http协议
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .Net 8.0 新的变化
  • .NET MVC第三章、三种传值方式
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .net和jar包windows服务部署
  • /run/containerd/containerd.sock connect: connection refused
  • @AliasFor注解