2020-11-26 Android 应用程序直接调用I2C控制器实现的设备驱动实例测试

    Android 应用程序直接调用I2C控制器实现的设备驱动实例测试

 

一、涉及到以下的函数和结构体。

1  打开要调用的控制器设备文件
    int fd = open("/dev/i2c-0", O_RDWR);


2  设置超时和传输失败时的重试次数(非必须作)
    ioctl(fd, I2C_TIMEOUT, 10);
    ioctl(fd, I2C_RETRIES, 2);


3  准备好需要传输的数据. 

    struct i2c_msg {
        __u16 addr; /* slave address            */
        __u16 flags;  //写为0, 读为I2C_M_RD
        __u16 len;      /* msg length               */
        __u8 *buf;      /* pointer to msg data          */
    };

    struct i2c_rdwr_ioctl_data {
            struct i2c_msg *msgs;  /* ptr to array of simple messages */
            int nmsgs;             /* number of messages to exchange */
    };

    ioctl(file, I2C_RDWR, struct i2c_rdwr_ioctl_data *msgset); 
        //调用此ioctl函数类似设备驱动里调用i2c_transfer函数。调用一次,只会在完成时发出一个停止信号,不管发出了多少个i2c_msg。 而且每一个i2c_msg都会有一个开始信号.

二、测试实例代码,读写RTC 的时间。

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>

#define HYM8563_ADDR  0x51

int main(void)
{
    int fd, i;
    char addr = 0, data[0X0F];

    fd = open("/dev/i2c-0", O_RDWR);
    if (fd < 0)
        return 1;

    ioctl(fd, I2C_TIMEOUT, 10);
    ioctl(fd, I2C_RETRIES, 10);


    struct i2c_msg msgs[2] = {
        {HYM8563_ADDR, 0, 1, &addr},
        {HYM8563_ADDR, I2C_M_RD, 0X0F, data},
    };

    struct i2c_rdwr_ioctl_data idata = {
        .msgs = msgs,
        .nmsgs = 2,
    };

    if (ioctl(fd, I2C_RDWR, &idata) < 0)
    {
        perror("ioctl");
        return 2;
    }

    for (i = 0; i < 0X0F; i++)
        printf("0x%02x ", data[i]);
    
	printf("\r\n");
    close(fd);
    return 0;
}

三、测试结果。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
I2C控制器驱动程序是用于与I2C设备进行通信的软件模块。它允许应用程序通过I2C总线与外部设备进行数据交换。根据引用和引用的描述,I2C控制器驱动程序可以分为两种模式:用户模式设备驱动和普通设备驱动。 用户模式设备驱动是一种依赖于i2c-dev驱动驱动程序。它要求应用程序员具备一定的硬件知识,了解I2C设备的时序、地址等信息。使用用户模式设备驱动时,应用程序员需要直接调用I2C控制器实现设备的读写操作。 普通设备驱动是一种更简单的驱动程序,应用程序员可以像读写文件一样使用它。普通设备驱动隐藏了底层I2C控制器的细节,提供了一组简单的API供应用程序使用。应用程序员不需要了解I2C设备的底层细节,只需要调用相应的API来进行数据交换。 下面是一个示例,演示了如何使用普通设备驱动程序进行I2C设备的读写操作: ```c #include <linux/i2c-dev.h> #include <fcntl.h> #include <unistd.h> int main() { int file; char *filename = "/dev/i2c-0"; // I2C设备文件路径 int addr = 0x50; // I2C设备地址 // 打开I2C设备文件 if ((file = open(filename, O_RDWR)) < 0) { printf("Failed to open the bus.\n"); return 1; } // 设置I2C设备地址 if (ioctl(file, I2C_SLAVE, addr) < 0) { printf("Failed to acquire bus access and/or talk to slave.\n"); return 1; } // 向I2C设备写入数据 char buffer[2] = {0x01, 0x02}; if (write(file, buffer, 2) != 2) { printf("Failed to write to the I2C device.\n"); return 1; } // 从I2C设备读取数据 char data[2]; if (read(file, data, 2) != 2) { printf("Failed to read from the I2C device.\n"); return 1; } // 关闭I2C设备文件 close(file); return 0; } ``` 这是一个使用C语言编写的简单示例,演示了如何使用普通设备驱动程序进行I2C设备的读写操作。在示例中,我们首先打开I2C设备文件,然后设置I2C设备地址。接下来,我们向I2C设备写入数据,并从I2C设备读取数据。最后,我们关闭I2C设备文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值