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

简介: /********************************************************************** * linux tmp75 /dev/i2c-* 获取数据 demo * 说明: * 之前尝试过一次用这种方式来读EEPROM,结果以失败告终,也没找到原因, * 今天定位到问题是由于I2C_SLAVE、I2C_SLAVE_FORCE导致的,之前一直尝试 * I2C_SLAVE,今天定位到问题是I2C总线忙,改成用I2C_SLAVE_FORCE就解决。
/**********************************************************************
 *             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;
}

 

目录
相关文章
|
11天前
|
存储 缓存 Linux
Linux IO的奥秘:深入探索数据流动的魔法
Linux I/O(输入/输出)系统是其核心功能之一,负责处理数据在系统内部及与外界之间的流动。为了优化这一流程,Linux进行了一系列努力和抽象化,以提高效率、灵活性和易用性。🚀
Linux IO的奥秘:深入探索数据流动的魔法
|
27天前
|
存储 Shell Linux
【Shell 命令集合 磁盘管理 】Linux读取、转换并输出数据 dd命令使用教程
【Shell 命令集合 磁盘管理 】Linux读取、转换并输出数据 dd命令使用教程
31 0
|
1月前
|
存储 弹性计算 人工智能
|
2月前
|
传感器 Linux 开发工具
Linux应用开发基础知识——I2C应用编程(十三)
Linux应用开发基础知识——I2C应用编程(十三)
56 0
Linux应用开发基础知识——I2C应用编程(十三)
|
27天前
|
算法 Shell Linux
【Shell 命令集合 备份压缩 】⭐Linux 压缩 恢复bzip2损坏数据 bzip2recover命令 使用指南
【Shell 命令集合 备份压缩 】⭐Linux 压缩 恢复bzip2损坏数据 bzip2recover命令 使用指南
31 0
|
3月前
|
Linux Windows
Linux中/dev/null和/dev/zero的作用
Linux中/dev/null和/dev/zero的作用
40 2
|
3月前
|
Shell Linux Perl
linux逐行逐列(分号分隔)读取数据shell
linux逐行逐列(分号分隔)读取数据shell
22 3
|
4月前
|
存储 关系型数据库 MySQL
Linux的dev/vda1文件满了导致MySQL无法写入
今天查看两个月前上线的小项目,发现运行非常慢,而且增删改查失效了(吓我一大跳),急急忙忙的就开始了我的线上问题排查之路。/dev/vda1是 Linux 系统中的一个设备文件,它表示第一个虚拟磁盘(vda)的第一个分区(1)。在大多数 Linux 发行版中,这是系统根分区的默认位置。如果您要对/dev/vda1进行操作(例如挂载、格式化、备份等),则需要具有足够的权限。一般来说,只有 root 用户或具有 sudo 权限的用户才能进行这些操作。当Linux的/dev/vda1。
116 0
|
6天前
|
缓存 运维 监控
Linux系统监控利器:探索常用命令及数据保存技巧
Linux系统监控利器:探索常用命令及数据保存技巧
23 4
Linux系统监控利器:探索常用命令及数据保存技巧
|
11天前
|
存储 缓存 安全
Linux IO:打开数据之窗的魔法
Linux I/O(输入/输出)是操作系统中一个至关重要的组成部分,它涉及到数据在内存🧠、存储设备💾、网络接口🌐等之间的传输过程。在Linux中,I/O操作不仅仅是文件读写那么简单,它包括了一系列复杂的机制和策略,旨在提高数据处理的效率,保证系统的稳定性和性能。📊
Linux IO:打开数据之窗的魔法