Linux在应用层上使用I2C

这篇具有很好参考价值的文章主要介绍了Linux在应用层上使用I2C。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Linux在应用层上使用I2C

通常情况下i2c读写一般是在kernel中使用,但是在应用层上一样可以使用。在应用上可以通过读写/dev/i2c-x这个节点从而控制i2c接口进行读写数据。
通常一个SOC有多个I2C控制器,假设有这个SOC有3个控制器,我们会在/dev目录下看到i2c-0、i2c-1、i2c-2,计数从0开始。

在应用层使用I2C步骤

1.首先使用的时候需要包含两个头文件。
#include <linux/i2c-dev.h>
#include <linux/i2c.h>
这个两个头文件作用是使用ioctrl的时候应用和驱动的结构体数据类型保持一致。这个两个头文件也是从内核中拷贝过来的。
文件在内核的目录是。
include/linux/i2c-dev.h
2、使用open函数打开/dev/i2c-x节点。
假设我们需要读写的是i2c0这个节点,在使用i2c控制器进行读写的时候,首先我们需要先open /dev/i2c-0这个节点,然后获得一个句柄,使用这个句柄去调用读写函数。

int fd = open(/dev/i2c-0, O_RDWR);	//open /dev/i2c-0这个节点,获得句柄fd。

3、I2C写函数实现。
前面我们已经获得了句柄fd,和我们在kernel中使用I2C一样,我们需要知道写的I2C设备的设备地址(slave address),还有你需要写的I2C的寄存器地址(register address)。有了这个三样东西我们就可以往I2C设备中进行写素具了。

struct i2c_rdwr_ioctl_data work_queue;  //分配一个struct i2c_rdwr_ioctl_data结构体变量,这个是用来存储我们要发送的数据的。

work_queue.nmsgs = 1;		  //因为是I2C的读函数,所以我们需要一个msg就够了,如果是读函数需要两个msg,这里的nmsgs设置为2
work_queue.msgs = (struct i2c_msg *)malloc(work_queue.nmsgs * sizeof(struct i2c_msg));   //msgs是一个指针,所以需要分配msg内存,用来保存msg的数据

buf[0] = register_address;   //保存寄存器地址

work_queue.msgs[0].len = 1 + size;  //1 + size 1表示的是register的长度,占一个字节,size表示的是我们要写的数据长度
work_queue.msgs[0].flags = 0; // I2C的读写标志位 0:write 1:read  (如果不清楚需要回去看I2C的基础知识)
work_queue.msgs[0].addr = slave_addr;   //要写的I2C设备地址
work_queue.msgs[0].buf[0] = buf;        //要发送的数据存储的地址

ioctl(fd, I2C_RDWR, (unsigned long)&work_queue);   //最后一步需要使用ioctl将数据发送出去。这里最后是调用到kernel的底层驱动,然后将数据通过I2C的控制器将数据传输出去。

4、I2C读函数实现。
I2C的读函数和写函数实现的方式类似,但是有两点不同
1、flags这个标志位在读的时候需要修改为1.
2、work_queue.nmsgs未2,因为根据I2C的标准协议,在发起读之前,需要先写寄存器地址,才能发起读操作。所以第一个msg是为了写寄存器地址,第二msg才是用来读的。文章来源地址https://www.toymoban.com/news/detail-784567.html

struct i2c_rdwr_ioctl_data work_queue; //分配一个struct i2c_rdwr_ioctl_data结构体变量,这个是用来存储我们要发送的数据的和读的数据。

work_queue.nmsgs = 2;
work_queue.msgs  = (struct i2c_msg *)malloc(work_queue.nmsgs * sizeof(struct i2c_msg));   //分配两个msg。

//第一个msg的配置
work_queue.msgs[0].len = 1;
work_queue.msgs[0].flags = 0; // 0:write 1:read  
work_queue.msgs[0].addr = slave_addr;
work_queue.msgs[0].buf = &reg; //reg addr

work_queue.msgs[1].len = size;	//要读的长度
work_queue.msgs[1].flags = 1; // 0:write 1:read  表示为读flag
work_queue.msgs[1].addr = slave_addr;  //设备地址
work_queue.msgs[1].buf = buf;   //buf:读取的数据保存的地址


ioctl(fd, I2C_RDWR, (unsigned long)&work_queue); //最后一步需要使用ioctl将数据发送出去和读回来。这里最后是调用到kernel的底层驱动,然后将数据通过I2C的控制器将数据传输出去和读回来。

到了这里,关于Linux在应用层上使用I2C的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [linux--->应用层网络通信协议]

    协议本质是收发端双方约定好格式的数据,常见协议是用结构体或者类的方式来表达,结构化的数据是为了方便被应用层解读,这个结构体中可能包括发送者ip和端口号以及主机名,还有通信信息,应用层可以用结构体区分并使用信息;使用结构体直接传递,但是可能会因为系统的不同

    2024年02月15日
    浏览(27)
  • 【Linux】应用层之HTTP协议

    在应用层,需要我们传递应用层所需特殊的数据格式,这种数据可能是连续数据,例如int类型的整形变量,也可能是string类型的字符串,也可能是多个变量构成的结构体,那么就意味着我们发送的数据可能是连续的,也可能是不连续的,这时为了统一数据的解析方法,我们对

    2024年02月12日
    浏览(32)
  • Linux网络:应用层之HTTP协议

    我们程序员写的一个个解决实际问题,满足日常需求的网络程序,都是在应用层。 协议是一种约定。网络协议是计算机网络中通信双方都必须遵守的一组约定。 在网络通信中,都是以 “字符串” 的方式来发送和接收数据的。 如果要发送和接收一些结构化的数据,就需要序

    2023年04月26日
    浏览(42)
  • 【Linux】应用层协议:HTTP和HTTPS

    每个人都可以很喜欢每个人,但喜欢治不了病,喜欢买不了东西,喜欢不能当饭吃,喜欢很廉价… 1.1 URL的组成 1. 在之前的文章中我们实现了一个网络版本的计算器,在那个计算器中揉合了协议定制以及序列化反序列化的内容,我们当时也自己定制了一套协议标准,比如请求

    2024年02月10日
    浏览(33)
  • 【Linux】【驱动】应用层和驱动层传输数据

    Linux一切皆文件! 文件对应的操作有打开,关闭,读写设备节点对应的操作有打开,关闭,读写 当我们在应用层 read 设备节点的时候,就会触发我们驱动里面read 这个函数 当我们在应用层 write 设备节点的时候,就会触发我们驱动里面 write 这个函数 如下两个代码实现了数据的

    2024年02月12日
    浏览(30)
  • Linux 内核线程启动以及内核调用应用层程序

    #include linux/kthread.h //内核线程头文件   static task_struct *test_task; test_task = kthread_run(thread_function, NULL, \\\"test_thread_name\\\"); if(IS_ERR(test_task)) {         pr_err(\\\"test_thread_name create failn\\\"); } static int thread_function(void *arg) {     char *envp[3];     char *argv[3];     int ret= 0;     argv[0] = \\\"/bin/sh\\\";  

    2024年02月12日
    浏览(36)
  • 【Linux网络】网络应用层的 http 和 https协议

    在之前学习序列化和反序列化的时候,认识到主机之间传输结构数据的时候,最好是通过某种约定将结构数据序列化成一串字符串,接收方再通过反序列化将字符串转换成结构数据。以上说的这种约定,其实可以看成是用户层通信的一种协议,是由程序猿自己定的。   实际

    2024年02月02日
    浏览(43)
  • 【Linux】应用层协议序列化和反序列化

    欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:题目解析 🌎推荐文章:C++【智能指针】 前言 在正式代码开始前,会有一些前提知识引入 在网络应用层中,序列化(Serialization)和反序列化(Deserialization)是将数据转换为可在网络上传输的格式,并从网络接

    2024年04月23日
    浏览(28)
  • Linux C/C++实现SSL的应用层VPN (MiniVPN)

    SSL协议和VPN(虚拟私人网络)原理是网络安全领域中的两个重要概念。 SSL协议,全称安全套接层(Secure Sockets Layer),是一种广泛应用于互联网的安全协议,主要在两个通信端点之间建立安全连接,以保护数据的传输安全。具体来说,SSL通过使用公钥加密算法实现数据的加密

    2024年02月08日
    浏览(36)
  • 【应用层协议】初始Http,fiddler的使用

    Http全称是超文本传输协议,是一种常用的应用层协议。它是Web的基础,用于在客户端和服务器之间传递数据和请求网页资源。 例如 :当我们搜索一个网站时,就相当于向网站的服务器发送一个http请求,当网站的服务器收到请求后就会进行响应。 HTTP 往往是基于传输层的 T

    2024年02月07日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包