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

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

3天内不再提示

fireflyAIO-3288C主板I2C简介

firefly 来源:firefly 作者:firefly 2019-12-16 14:23 次阅读
I2C 使用
前言

AIO-3288C 开发板上有 6 个片上 I2C 控制器。本文主要描述如何在该开发板上配置 I2C。

配置 I2C 可分为两大步骤:

  • 定义和注册 I2C 设备
  • 定义和注册 I2C 驱动

下面以配置 lt8641ex 为例。

定义和注册 I2C 设备

在注册I2C设备时,需要结构体 i2c_client 来描述 I2C 设备。然而在标准Linux中,用户只需要提供相应的 I2C 设备信息,Linux就会根据所提供的信息构造 i2c_client 结构体。

用户所提供的 I2C 设备信息以节点的形式写到 dts 文件中,如下所示:

&i2c1 { status = "okay"; lt8641ex@3f { compatible = "firefly,lt8641ex"; gpio-sw = <&gpio7 GPIO_B2 GPIO_ACTIVE_LOW>; reg = <0x3f>; }; rtc@51 { compatible = "nxp,pcf8563"; reg = <0x51>; }; };
定义和注册 I2C 驱动
定义 I2C 驱动

在定义 I2C 驱动之前,用户首先要定义变量 of_device_id 和 i2c_device_id 。of_device_id 用于在驱动中调用dts文件中定义的设备信息,其定义如下所示:

static const struct of_device_id of_rk_lt8641ex_match[]={ { .compatible = "firefly,lt8641ex" }, { /* Sentinel */ } };

定义变量 i2c_device_id:

static const struct i2c_device_id lt8641ex_id[] = { { lt8641ex, 0 }, { } }; MODULE_DEVICE_TABLE(i2c, lt8641ex_id);

i2c_driver 如下所示:

static struct i2c_driver lt8641ex_device_driver = { .driver = { .name = "lt8641ex", .owner = THIS_MODULE, .of_match_table = of_rk_lt8641ex_match, }, .probe = lt8641ex_probe, .remove = lt8641ex_remove, .suspend = lt8641ex_suspend, .resume = lt8641ex_resume, .id_table = lt8641ex_id,};

注:变量id_table指示该驱动所支持的设备。

注册 I2C 驱动

使用i2c_add_driver函数注册 I2C 驱动。

i2c_add_driver(&lt8641ex_device_driver);

在调用 i2c_add_driver 注册 I2C 驱动时,会遍历 I2C 设备,如果该驱动支持所遍历到的设备,则会调用该驱动的 probe 函数。

通过 I2C 收发数据

在注册好 I2 C 驱动后,即可进行 I2C 通讯。

  • 向从机发送信息
static int i2c_master_reg8_send(const struct i2c_client *client, const char reg, const char *buf, int count, int scl_rate) { struct i2c_adapter *adap=client->adapter; struct i2c_msg msg; int ret; char *tx_buf = (char *)kzalloc(count + 1, GFP_KERNEL); if(!tx_buf) return -ENOMEM; tx_buf[0] = reg; memcpy(tx_buf+1, buf, count); msg.addr = client->addr; msg.flags = client->flags; msg.len = count + 1; msg.buf = (char *)tx_buf; msg.scl_rate = scl_rate; ret = i2c_transfer(adap, &msg, 1); kfree(tx_buf); return (ret == 1) ? count : ret; }
  • 向从机读取信息
static int i2c_master_reg8_recv(const struct i2c_client *client, const char reg, char *buf, int count, int scl_rate) { struct i2c_adapter *adap=client->adapter; struct i2c_msg msgs[2]; int ret; char reg_buf = reg; msgs[0].addr = client->addr; msgs[0].flags = client->flags; msgs[0].len = 1; msgs[0].buf = ®_buf; msgs[0].scl_rate = scl_rate; msgs[1].addr = client->addr; msgs[1].flags = client->flags | I2C_M_RD;msgs[1].len = count; msgs[1].buf = (char *)buf; msgs[1].scl_rate = scl_rate; ret = i2c_transfer(adap, msgs, 2); return (ret == 2)? count : ret; }

注:msgs[0] 是要向从机发送的信息,告诉从机主机要读取信息。msgs[1] 是主机向从机读取到的信息。

至此,主机可以使用函数 i2c_master_reg8_send 和 i2c_master_reg8_recv 和从机进行通讯。

  • 实际通讯示例

例如主机和 LT8641EX 通讯,主机向 LT8641EX 发送信息,设置 LT8641EX 使用通道 1:

int channel=1; i2c_master_reg8_send(g_lt8641ex->client, 0x00, &channel,1, 100000);

注:通道寄存器的地址为0x00。 主机向从机 LT8641EX 读取当前使用的通道:

u8 ch = 0xfe; i2c_master_reg8_recv(g_lt8641ex->client, 0x00, &ch,1, 100000);

注:ch用于保存读取到的信息。


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

    关注

    87

    文章

    11222

    浏览量

    208890
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6085

    浏览量

    35206
  • Firefly
    +关注

    关注

    2

    文章

    538

    浏览量

    6983
收藏 人收藏

    评论

    相关推荐

    i2c总线ppt(I2C总线器件应用)

    I2C总线器件应用第一节 I2C总线器件应用概述I2C总线工作原理I2C总线系统结构I2C总线系统结构如图7-1所示。其中,SCL是时钟线,
    发表于 08-13 17:34 0次下载

    I2C Guid I2C指南

    I2C Guid  I2C指南 The I2C bus is used in a wide rangeof applications because it is simpleand
    发表于 04-23 13:55 36次下载

    i2c

    单片机i2c总线操作;单片机i2c总线操作;单片机i2c总线操作;
    发表于 05-17 11:09 35次下载

    英创信息技术JAVA操作英创主板I2C接口简介

    资源,英创提供了Java硬件支持包,主要支持的工控接口有:以太网、串口、CAN、GPIO、SPI、I2C、RTC等。本文主要介绍使用Java语言调用英创Java硬件支持包,操作英创主板I2C接口的过程
    的头像 发表于 02-06 11:06 1649次阅读
    英创信息技术JAVA操作英创<b class='flag-5'>主板</b><b class='flag-5'>I2C</b>接口<b class='flag-5'>简介</b>

    fireflyAIO-3288C主板安装指导

    AIO-3288C 的标准套装包含以下配件
    的头像 发表于 11-05 15:58 1377次阅读
    <b class='flag-5'>fireflyAIO-3288C</b><b class='flag-5'>主板</b>安装指导

    Firefly-RK3288--I2C主板的使用介绍

    Firefly-RK3288 开发板上有 6 个片上 I2C 控制器。本文主要描述如何在该开发板上配置 I2C
    的头像 发表于 11-26 17:00 2659次阅读
    Firefly-RK<b class='flag-5'>3288--I2C</b><b class='flag-5'>主板</b>的使用介绍

    fireflyAIO-3288C PWM 输出介绍

    AIO-3288C 开发板上有 4 路 PWM 输出,分别为 PWM0 ~ PWM3, 本章主要描述如何配置 PWM。
    的头像 发表于 12-16 15:22 1345次阅读

    fireflyAIO-3288C--LED简介

    AIO-3288C 开发板上有 2 个 LED 灯
    的头像 发表于 12-16 14:21 1729次阅读

    fireflyAIO-3288C主板IR 简介

    AIO-3288C 开发板上可以接红外收发传感器 IR 实现遥控功能。
    的头像 发表于 12-16 14:22 1473次阅读
    <b class='flag-5'>fireflyAIO-3288C</b><b class='flag-5'>主板</b>IR <b class='flag-5'>简介</b>

    fireflyAIO-3288C主板ADC接口介绍

    AIO-3288C 开发板上的 AD 接口分为:高速 ADC 流接口 (High-speed ADC Stream Interface)、温度传感器 (Temperature Sensor)、
    的头像 发表于 12-16 15:27 1758次阅读

    fireflyAIO-3288C主板启动模式简介

    AIO-3288C 有灵活的启动方式。
    的头像 发表于 12-16 15:43 1393次阅读
    <b class='flag-5'>fireflyAIO-3288C</b><b class='flag-5'>主板</b>启动模式<b class='flag-5'>简介</b>

    fireflyAIO-3288J主板I2C简介

    AIO-3288J 开发板上有 6 个片上 I2C 控制器。
    的头像 发表于 12-20 10:05 1322次阅读

    fireflyAIO-3399J主板I2C使用介绍

    AIO-3399J 开发板上有 9 个片上 I2C 控制器,
    的头像 发表于 12-24 10:34 1884次阅读
    <b class='flag-5'>fireflyAIO</b>-3399J<b class='flag-5'>主板</b><b class='flag-5'>I2C</b>使用介绍

    硬件I2C与模拟I2C

    硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,因而效率要远高于软件模拟的I2C;一般也较为稳定,但
    发表于 12-28 19:14 81次下载
    硬件<b class='flag-5'>I2C</b>与模拟<b class='flag-5'>I2C</b>

    ESP32 之 ESP-IDF 教学(六)——I2C数据总线(I²C

    ESP32 之 ESP-IDF 学习笔记(六)【I2C数据总线(I²C)】文章目录ESP32 之 ESP-IDF 学习笔记(六)【I2C数据总线(I
    发表于 12-28 19:25 22次下载
    ESP32 之 ESP-IDF 教学(六)——<b class='flag-5'>I2C</b>数据总线(<b class='flag-5'>I</b>²<b class='flag-5'>C</b>)