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;
}

 

时间: 2024-08-24 12:18:51

linux tmp75 /dev/i2c-* 获取数据 demo的相关文章

I.MX6 Android Linux shell MMPF0100 i2c 获取数据

#!/system/bin/busybox ash # # I.MX6 Android Linux shell MMPF0100 i2c 获取数据 # 说明: # 本文主要记录通过shell脚本来获取MMPF0100的数据,更多的是为了更为 # 方便的获取到数据,在进行一些调试的时候能够更有效. # # 2016-4-1 深圳 南山平山村 曾剑锋 # # 检查参数个数 if [ $# -lt 3 ]; then echo "USAGE:" echo " i2cData.sh

I.MX6 Android Linux shell MMPF0100 i2c 设置数据

#!/system/bin/busybox ash # # I.MX6 Android Linux shell MMPF0100 i2c 设置数据 # 说明: # 本文主要记录通过shell脚本来设置MMPF0100的数据. # # 2016-4-6 深圳 南山平山村 曾剑锋 # # 检查参数个数 if [ $# -lt 3 ]; then echo "USAGE:" echo " i2cSetData.sh <curPage> <address(hex)&

linux网络实现分析(2)——数据包的接收(从链路层到ip层)

linux网络实现分析(2)--数据包的接收(从链路层到ip层) --lvyilong316 任何数据包在由驱动接收进入协议栈都会经过netif_receive_skb函数,可以说这个函数是协议栈的入口.在分析这个函数前,首先介绍下三层协议在内核中的组织方式.     在Linux内核中,有两种不同目的的3层协议: (1) ptype_all管理的协议主要用于分析目的,它接收所有到达第3层协议的数据包. (2) ptype_base管理正常的3层协议,仅接收具有正确协议标志符的数据包,例如,In

linux网络实现分析(3)——数据包的发送(IP层到链路层)

二层(链路层)数据包发送过程分析         当上层准备好一个包之后,交给链路层,链路层数据包发送主要通过dev_queue_xmit函数处理.数据包的发送可分为两种,一种是正常的传输流程,即通过网卡驱动,另一种是通过软中断(见注3).为了理解方便,首先看一下dev_queue_xmi函数的整体调用关系图.     dev_queue_xmit     本函数用来将带发送的skb加入一个dev的队列(Queue),调用这个函数前必须设置好skb的device和priority,本函数可以在中

linux网络实现分析(1)——数据包的接收(从网卡到协议栈)

linux网络实现分析(1)--数据包的接收(从网卡到协议栈) --lvyilong316 说明:源码参考2.6.32 从网卡到协议栈的skb接收有两种方式:NAPI和非NAPI.其中有公共逻辑,也有区别.首先看下用到的基本数据结构. 1. 基本数据结构 l   softnet_data    每cpu数据 struct softnet_data {     struct Qdisc        *output_queue;  //发送帧队列     struct sk_buff_head

Linux系统下mysqlcheck修复数据库命令(详解)_Mysql

mysqlcheck客户端工具可以检查和修复MyISAM表,还可以优化和分析表. 实际上,它集成了mysql工具中check.repair.analyze.optimize的功能. 有3种方式来调用mysqlcheck: shell> mysqlcheck[options] db_name [tables] shell> mysqlcheck[options] ---database DB1 [DB2 DB3...] shell> mysqlcheck[options] --all--d

linux下/dev/shm的大小引发ORA-00845: MEMORY_TARGET not supported on this system 2015-06-16 08:55:50

Linux操作系统,oracle 11.2.0.4 启动实例时出现如下错误: SQL> startup nomount pfile=/u03/app/oracle/11.2.0/db/dbs/initcssb.ora ORA-00845: MEMORY_TARGET not supported on this system 查看错误帮助信息 [oracle11@oracle11g dbs]$ oerr ora 845 00845, 00000, "MEMORY_TARGET not sup

网络编程-求教C语言能申请GET或CGI连接后如何获取数据。

问题描述 求教C语言能申请GET或CGI连接后如何获取数据. 本人现在在公司实习中,做的这个方向公司里只有一个人在研究.希望各位大神不吝帮助. 我们现在需要连接一个网络摄像头,用的是LINUX系统的ARM核心的板子.网络摄像头的API只有WINDOWS平台的,LINUX平台下只能通过浏览器的GET或CGI连接在网页中显示视频.该视频为RTP连接.这本来是浏览器的工作,现在要在自己的APP中实现提取视频的数据,之后做相关处理. 请问如何直接用应用程序获得GET或CGI申请后的那个RTP连接? 谢谢

Linux自带i2c工具使用

I2C总线被全球超过50个公司的1000+个ICs所使用,已然是一个世界标准.另外,I2C总线与多种不同的控制总线是兼容的,比如SMBus(系统管理总线),PMBus(电源管理总线),IPMI(智能平台管理总线),DDC(显示数据通道)以及ATCA(高级电信架构).如果没记错的话,linux中的I2C框架是完全支持SMBus的. 要全面了解I2C,可以从<I2C-bus specification and user manual>看起.I2C最初是由Philips提出的,那么这文档就是由NXP