0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux控制I2C/SMBus设备

CHANBAEK 来源:头条号科G栈 作者:头条号科G栈 2023-03-23 10:02 次阅读

平台:树莓派 bcm2835 Raspberry Pi 3 Model B Rev 1.2

I2C是Philips开发的一种两线通信协议,常用于一些对速度要求不高的小型器件上。SMBus是系统管理总线,基于I2C协议,大部分情况下二者兼容。

这次使用mpu6050作为I2C外设,学习Linux下I2C的应用开发。 树莓派默认I2C可能没有打开,需要配置重启,具体方法这里不赘述。最终会在/dev下生成i2c-1设备。

poYBAGQbsx-ABKsSAAA9S4ro0uE175.jpg

1、需要的头文件

pYYBAGQbsx-Ab_0RAABkaCBl-ic116.jpg

2、打开I2C设备

打开设备文件与打开普通文件没有区别,使用open函数以读写的方式打开,返回值是该设备文件的文件描述符。

poYBAGQbsyCAXYbNAABMK-_Z830958.jpg

3、设置从设备的地址

每个I2C设备都有一个设备地址,使用ioctl函数设置这个地址。

pYYBAGQbsyGADe-bAABMf-2pB4w668.jpg

4、读写设备

到这里就可以读写设备了,Linux提供两种方式。

a.使用write和read函数

poYBAGQbsyGAYdlFAACujYkU1BQ932.jpg

b.使用smbus提供的函数

pYYBAGQbsyKAQaunAAF6zsIlwMQ539.jpg

第一步的头文件就是给这里提供支持的。使用这种方式需要安装额外的库,网上说需要安装libi2c-dev,我没验证,请知道的指点一二。我这里安装了i2c-tools工具,并且下载了i2c-tools的源码并编译安装过,所以库和头文件都有了,现在也搞不清是哪一步操作安装的了。

Linux官方文档是推荐这种方式的,smbus提供了下面几个函数。

poYBAGQbsySARwjlAAKhvI_5U4Q681.jpg

5、编译

使用smbus编译需要额外的参数-Llib和-li2c,否则提示找不到smbus提供的函数。我用了makefile方便编译,当然使用gcc直接编也可以。

pYYBAGQbsyWASt3uAAAqnvtq21A305.jpg

其他:

i2c相关的头文件在/usr/include/linux下

pYYBAGQbsyaAObZyAABZIkPIcAw552.jpg

smbus相关的头文件在/usr/local/include/i2c下

poYBAGQbsyeAZprZAABWAIDgczA716.jpg

tips:学习如何使用Linux最好的资料应该是Documentation,至少从spi和i2c的应用开发角度看是这样,再结合man手册,很多问题都能解决。网上搜索的东西太乱太杂,作为辅助手段还行。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206733
  • 总线
    +关注

    关注

    10

    文章

    2706

    浏览量

    87206
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1346

    浏览量

    120814
  • SMBus
    +关注

    关注

    0

    文章

    70

    浏览量

    21721
  • 树莓派
    +关注

    关注

    113

    文章

    1639

    浏览量

    104733
收藏 人收藏

    评论

    相关推荐

    数字温度传感器系统接口:SPI、I2CSMBus如何选

    共存于同一系统总线上(系统冗余常会要求这一点),或者面向低功耗应用,这时I2CSMBus将是首选接口。图1:数字温度传感器简化框图下面几部分将介绍每种串行总线及其优缺点。1. SPISPI
    发表于 09-23 16:55

    树莓派系列教程11:I2C编程

    = wiringPiI2CSetup(0x20);初始化I2C设备,0x20为PCF8574的I2C地址,返回值是标准的Linux文件句柄
    发表于 03-28 13:56

    I2C设备驱动的开发

    linux3.2内核提供的I2C驱动都是主设备的,想让I2C做从设备,请教哪位大神做过I2C
    发表于 08-21 12:05

    增强型I2CSMbus主接口参考设计包括BOM及层图

    I2C 外设不支持 SMbus(...)主要特色支持 I2CSMbus 主接口连接 PRU-ICSS动态块模式读取和写入传输包含用于定制的 PRU-ICSS 源代码
    发表于 10-26 10:00

    I2CSMBus之间的技术差异

    所制订的先进组态与电源管理接口(AdvancedConfiguration& Power Interface;ACPI)规范中成为基础的管理讯息传递接口、控制传递接口。 虽然I2CSMBus
    发表于 11-21 19:49

    LinuxI2C体系结构

     在Linux 系统中,I2C 驱动由3 部分组成,即I2C 核心、I2C 总线驱动和I2C 设备
    发表于 08-06 06:53

    什么是基于嵌入式LinuxI2C设备驱动程序?

    由于I2C总线的通用性,Linux作为一款优秀的嵌入式操作系统,也必须要对其要有很好的支持。在Linux内核源码中对I2C总线的驱动是基于总线设备
    发表于 09-02 08:04

    如何使I2C主机成为SMBus主机?

    你好,我正在努力使I2C成为SMBUS的主人。我面临以下问题1。SMBus奴隶的删除插入使得S I2C接口被卡住。-原因-在ISR I2C
    发表于 09-19 07:57

    SMBusI2C有什么差别?

    系统管理总线(SMBus)是一个两线接口。通过它,各设备之间以及设备与系统的其他部分之间可以互相通信。它基于I2C操作原理。SMBus为系统
    发表于 03-20 09:01

    I2C简介

    SMBus 2.0 兼容。它可以用于多种用途,包括 CRC 生成和验证、 SMBus(系统管理总线)以及 PMBus(电源管理总线)。根据器件的不同,可利用 DMA 功能来减轻 CPU 的工作量二.IIC物理层它是一个支持多设备
    发表于 08-10 08:10

    如何仿照Linux内核去编写I2C驱动

    的设计思想很值得借鉴,本文将刨除设备、总线等复杂概念,单从I2C驱动实现角度仿照Linux内核编写I2C驱动。I2C协议
    发表于 08-23 08:03

    linux I2C子系统的相关资料分享

    文章目录linux I2C子系统框架在设备树中添加从设备信息,mpu5060I2C driver 程序的编写mpu6050
    发表于 02-10 06:06

    I2C设备驱动的相关资料下载

    I2C总线驱动加载到内核的过程3.2 I2C总线驱动如何操作硬件3.3 I2C设备 I2C驱动3.4
    发表于 02-10 06:39

    基于GD32F427开发板的硬件I2C与软件I2C驱动0.91OLED屛

    。  I2C 接口模块实现了 I2C 协议的标速模式,快速模式,具备 CRC 计算和校验功能、支持 SMBus(系统管理总线) 和 PMBus (电源管理总线) 和 SAM_V(验证安全控制
    发表于 12-14 16:42

    OpenHarmony:如何使用HDF平台驱动控制I2C

    子系统基础上创建)。 2.2.2.1、驱动实例化驱动入口 I2C控制器会出现很多个设备挂接的情况,因而在HDF框架中首先会为此类型的设备创建一个管理器对象,并同时对外发布一个管理器服务
    发表于 09-12 15:18