I2C知识大全系列六 —— I2C应用之Linux下的I2C

Linux中分为驱动层和应用层,在这里列举两个Linux下的I2C应用程序,分别为通过read()write()接口和通过ioctl()接口读写I2C设备的例程。

Linuxi2c应用程序(readwrite方式)

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

int main(int argc, char **argv)
{
    unsigned int fd;
    unsigned short mem_addr;
    unsigned short size;
    unsigned short idx;
#define BUFF_SIZE    32
    char buf[BUFF_SIZE];
    char cswap; 
    union
    {
        unsigned short addr;
        char bytes[2];
    } tmp;

    if (argc < 3) {
        printf(“Usage:\n%s /dev/i2c-x mem_addr size\n”, argv[0]);
        return 1;
    }
    sscanf(argv[2], “%d”, &mem_addr);
    sscanf(argv[3], “%d”, &size);
    if (size > BUFF_SIZE)
        size = BUFF_SIZE;

    fd = open(argv[1], O_RDWR);
    if (!fd) {
        printf(“error on opening the device file\n”);
        return -1;
    }
    ioctl(fd, I2C_SLAVE, 0x50); // 设置EEPROM地址
    ioctl(fd, I2C_TIMEOUT, 1); // 设置超时
    ioctl(fd, I2C_RETRIES, 1); // 设置重试次数

    for (idx=0; idx<size; ++idx, ++mem_addr) {
        tmp.addr = mem_addr;
        cswap = tmp.bytes[0];
        tmp.bytes[0] = tmp.bytes[1];
        tmp.bytes[1] = cswap;
        write(fd, &tmp.addr, 2);
        read(fd, &buf[idx], 1);
    }
    buf[size] = 0;
    close(fd);
    printf(“read %d char: %s\n”, size, buf);

    return 0;
}

Linuxi2c应用程序(ioctl方式)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <assert.h>
#include <linux/types.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>

int main(int argc, char **argv)
{
    struct i2c_rdwr_ioctl_data work_queue;
    unsigned int idx;
    unsigned int fd;
    unsigned int slave_address, reg_address;
    unsigned char val;
    int i;
    int ret;

    if (argc < 4) {
        printf(“Usage:\n%s /dev/i2c-x start_addr reg_addr\n”, argv[0]);
        return 1;
    }

    fd = open(argv[1], O_RDWR);
    if (!fd) {
        printf(“error on opening the device file\n”);
        return -1;
    }
    sscanf(argv[2], “%x”, &slave_address);
    sscanf(argv[3], “%x”, &reg_address);

    work_queue.nmsgs = 2;
    work_queue.msgs = (struct i2c_msgs *)malloc(work_queue.nmsgs * sizeof(struct i2c_msg));
    if (!work_queue.msgs) {
        printf(“memory alloc error\n”);
        close(fd);
        return 1;
    }

    ioctl(fd, I2C_TIMEOUT, 2); // 设置超时
    ioctl(fd, I2C_RETRIES, 1); // 设置重试次数

    for (i=reg_address; i<reg_address+16; i++) {
        val = i;
        (work_qurue.msgs[0]).len = 1;
        (work_queue.msgs[0]).addr = slave_address;
        (work_queue.msgs[0]).buf = &val;

        (work_qurue.msgs[1]).len = 1;
        (work_queue.msgs[1]).flags = I2C_M_RD;
        (work_queue.msgs[1]).addr = slave_address;
        (work_queue.msgs[1]).buf = &val;

        ret = ioctl(fd, I2C_RDWR, (unsigned long) &work_queue);
        if (ret < 0)
            printf(“error during I2C_RDWR ioctl with error code: %d\n”, ret);
        else
            printf(“reg:%02x val:%02x\n”, i ,val);
    }
    close(fd);

    return 0;
}

i2c-tools

i2c-tools是一个专门调试I2C的工具,开源,可获取挂载的设备及设备地址,还可以在对应的设备指定寄存器设置值或者获取值等功能。

下载和安装

方法一  源码编译安装

1)下载地址: Index of /pub/software/utils/i2c-tools/

选择某一版本,进行下载(压缩包)。

2)解压,并进入解压后的目录,然后编译。

例如:

$ cd i2c-tools-4.1

$ make

3)安装

$ sudo make install

方法二  通过apt命令直接安装

$ sudo apt install i2c-tools

使用

终端输入“i2c”按两次Tab键会出现可选命令。举例如下:

i2c-detect

显示所有可用的I2C总线。

注:如果出现权限错误“Error: Could not open file `/dev/XXX`: Permission denied”,需要在命令前面加“sudo”运行。下同。

使用-y 总线号或总线名选项,查看该总线下所有设备及设备地址

i2ctransfer

其它命令

i2cdumpi2cgeti2cset命令只适用于读写8位的寄存器地址, 功能完全可由i2ctransfer代替, 故在此不做详细介绍。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝天居士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值