首页 > 编程语言 >i2c与从设备通讯编程示例之i2c编写程序

i2c与从设备通讯编程示例之i2c编写程序

时间:2024-11-01 10:46:38浏览次数:3  
标签:编写程序 msgs 示例 work 写入 queue i2c 设备

对于我们ELF 1板卡来说,我们前面看到的i2c-0、i2c-1总线对应着CPU的两个i2c适配器,作为主设备,而总线上挂载的设备作为从设备。如/dev/i2c-1对应的适配器作主设备,其上面挂载的光线传感器就作为从设备。

前面我们了解了i2c的通讯协议,也初步用i2c-tools尝试着读写了一个从设备寄存器。下面我们进入代码,看一下如何用代码读取光线传感器的光照值。

注意:在读取光线传感器的数据寄存器之前,需要先开启ADC电源和启动ADC测量,即在CONTROL寄存器写入0x03这个数据,CONTROL的寄存器地址为0x00,由于bh1726的寄存器地址需要加上0x80的偏移地址,所以CONTROL的地址为0x80。也就是将0x03这个数据写入到0x80中。

查看i2c总线节点

在Linux内核代码文件include/linux/i2c-dev.h中针对每个i2c总线生成一个设备节点,实现了文件操作接口,用户空间可以通过i2c设备节点访问i2c适配器。适配器的编号从0开始,和适配器的设备节点的次设备号相同。

通过代码操控i2c适配器,必须包含以下头文件:

查看i2c设备节点:

 i2c设备节点是/dev/i2c-x,其中x是数字,代表i2c总线的编号。

打开设备

需要用到open()函数打开主设备i2c适配器,并获得文件描述符:

使用open()打开/dev/i2c-1总线,如果打开节点失败,会返回节点名称并输出"Can't Open i2c device"。

写寄存器

①创建消息结构体

i2c控制器和从设备之间通讯的消息,通常是储存在一个结构体中,首先,定义了一个i2c_rdwr_ioctl_data结构体,用于存储i2c通信相关的消息,我们需要规定好消息的数量,以及给这个消息申请一块空间。

②设置i2c参数

设置要写入数据的相关信息:

(一)work_queue.nmsgs被设置为1,表示只有一个消息要发送;

(二)(work_queue.msgs[0]).len被设置为2,表示要写入的数据长度;

(三)(work_queue.msgs[0]).flags被设置为0,表示写操作;

(四)(work_queue.msgs[0]).addr被设置为devaddr,表示要写入数据的设备地址。

(五)(work_queue.msgs[0]).buf通过动态内存分配了足够的空间,并将数据写入其中。首先在第一个字节位置(work_queue.msgs[0]).buf[0]写入设备地址reg,然后使用memcpy函数将要写入的数据buf拷贝到后续的字节位置。

③写入数据

调用ioctl函数执行i2c写操作,并将返回值赋给ret。如果返回值小于0,则打印错误信息。

释放动态分配的内存,因为前面有两处调用了malloc(),所以这里需要释放两次内存,包括(work_queue.msgs[0]).buf和work_queue.msgs,然后返回ret。

读寄存器

①创建消息结构体

i2c控制器和从设备之间通讯的消息,通常是储存在一个结构体中,首先,定义了一个i2c_rdwr_ioctl_data结构体,用于存储i2c通信相关的消息,我们需要规定好消息的数量,以及给这个消息申请一块空间。

②写寄存器地址

设置要写入数据的相关信息:

(一)work_queue.nmsgs被设置为1,表示只有一个消息要发送;

(二)(work_queue.msgs[0]).len被设置为1,表示要写入的数据长度;

(三)(work_queue.msgs[0]).flags被设置为0,表示写操作;

(四)(work_queue.msgs[0]).addr被设置为devaddr,表示要写入数据的设备地址。

(五)(work_queue.msgs[0]).buf通过动态内存分配了足够的空间,并将寄存器地址写入其中。

调用ioctl函数执行i2c写操作,并将返回值赋给ret。如果返回值小于0,则打印错误信息。

③读寄存器

储存的i2c通讯所需信息

设置要写入数据的相关信息:

(一)(work_queue.msgs[0]).len被设置为1,表示要写入的数据长度

(二)(work_queue.msgs[0]).flags被设置为0,表示写操作;

(三)(work_queue.msgs[0]).addr被设置为devaddr,表示要写入数据的设备地址。

调用ioctl函数执行i2c读操作,并将返回值赋给ret。如果返回值小于0,则打印错误信息。

释放动态分配的内存,因为前面有两处调用了malloc(),所以这里需要释放两次内存,包括(work_queue.msgs[0]).buf和work_queue.msgs,然后返回ret。

关闭设备

需要用到close()函数关闭主设备i2c适配器。

i2c简单读取寄存器简单代码

标签:编写程序,msgs,示例,work,写入,queue,i2c,设备
From: https://blog.csdn.net/2301_76587520/article/details/143406189

相关文章

  • stm32f1——OLED(I2C版)显示屏
    I2C版的oled显示屏为四针引脚,VCC,GND,SCL,SDA。1.I2C概念(1)接口SCL(时钟线),SDA(数据线)    SCL:I2C中的时钟线,SCL由主设备提供,用于同步I2C总线上所有设备的数据传输。SCL信号的变化边沿用于定时数据的传输和接收。    SDA:I2C中的数据线,SDA信号可通过主设备......
  • nltest 是一个 Windows 命令行工具,用于测试和管理 Windows 域的信任和连接状态。以下
    Nltest|MicrosoftLearnnltest是一个Windows命令行工具,用于测试和管理Windows域的信任和连接状态。以下是一些常用的nltest命令示例:1.查询域信任关系bashCopyCodenltest/domain_trusts该命令显示当前计算机与其域和其他信任域之间的信任关系。2.验证域控制器b......
  • 自动化滑动极验v3示例
    importrandomimportddddocrfromplaywright.sync_apiimportsync_playwrightimporttimeimportrequestswithsync_playwright()asp:det=ddddocr.DdddOcr(det=False,ocr=False)browser=p.chromium.launch(headless=False,args=['-......
  • 如何用pbootcmsAPI接口开发微信小程序UNIAPP示例
    1.准备工作在开始开发小程序之前,你需要:搭建好PbootCMS环境,确保其正常运行。注册小程序并获取AppID和AppSecret。配置PbootCMS与小程序的接口。2.封装API//获取站点信息exportconstpostSite=(config={})=>http.post('/cms/site',config)//获取自定义标签ex......
  • uniapp - 详细实现移动端公众号 H5 网页授权登录流程及示例代码,申请测试公众号全流程
    前言Vue版本,请访问这篇文章。在uni-appH5网站平台开发中,详解微信公众号网页接入微信授权登录示例代码,附带申请测试公众号全流程及配置教程,提供前端h5页面公众号网页实现授权登陆并获取用户昵称头像数据的示例源码,用自己项目跑出来的本地局域网IP段就可以拉起公众......
  • Java - 文字识别 ;示例代码基于SpringAI和国产大模型
    文字识别在Java开发中的应用在Java开发中,将图像中的文字进行识别能力被广泛应用于多种场景,比如自动审核图片内容、商品搜索分析等。过去,这类需求主要通过OCR(光学字符识别)技术来实现,但其对于复杂图像的处理效果往往不尽人意。如今,随着大模型技术的发展,利用这些先进的AI模型......
  • RCountDownLatch 分布式计数器锁的使用示例
    RCountDownLatch是Redisson提供的一种分布式计数器锁,类似于Java的CountDownLatch。它允许一个或多个线程等待其他操作完成后再执行,适用于分布式环境中需要协调多任务的场景。以下示例设计来自ChatGPT。1.示例场景假设有5个任务,主线程需要等这5个任务全部完成后再继......
  • Redisson 使用示例
    Redisson是一个Java的Redis客户端,基于Redis实现了许多分布式数据结构和功能,例如分布式锁、缓存、限流器、布隆过滤器等。以下是一些常见的Redisson使用示例,来自ChatGPT,用于自学。Redisson提供了 RLock 接口用于实现分布式锁,适用于需要同步访问共享资源的分布式应用......
  • 表格转文字如何实现-表格文字识别接口集成示例-快速提取表格中的文字​
    在当今信息化与智能化日新月异的时代,企业和组织面临着海量数据的处理需求,特别是在金融、法律、教育等领域,复杂而繁琐的表格数据成为一种重要的信息来源。如何快速、准确地提取表格中的文字信息,提升数据处理效率,成为越来越多企业关注的焦点。随着OCR(光学字符识别)技术的迅速发展......
  • 表格转文字如何实现-表格文字识别接口集成示例-快速提取表格中的文字​
    在当今信息化与智能化日新月异的时代,企业和组织面临着海量数据的处理需求,特别是在金融、法律、教育等领域,复杂而繁琐的表格数据成为一种重要的信息来源。如何快速、准确地提取表格中的文字信息,提升数据处理效率,成为越来越多企业关注的焦点。随着OCR(光学字符识别)技术的迅速......