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

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

3天内不再提示

I2C数据传输的三个主要API

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:嵌入式Linux系统开 2023-07-22 15:04 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

I2C Data Transfer

I2C 数据传输主要有三个 API

int i2c_master_send(const struct i2c_client *client,const char *buf,int count)

client:I2C 设备对应的 i2c_client。
buf:要发送的数据。
count:要发送的数据字节数,要小于 64KB,以为 i2c_msg 的 len 成员变量是一个 u16(无符号 16 位)类型的数据。
返回值:负值,失败,其他非负值,发送的字节数。

int i2c_master_recv(const struct i2c_client *client,char *buf,int count)
client:I2C 设备对应的 i2c_client。
buf:要接收的数据。
count:要接收的数据字节数,要小于 64KB,以为 i2c_msg 的 len 成员变量是一个 u16(无符号 16 位)类型的数据。
返回值:负值,失败,其他非负值,发送的字节数。

int i2c_transfer(struct i2c_adapter *adap,struct i2c_msg *msgs,int num)

adap:所使用的 I2C 适配器,i2c_client 会保存其对应的 i2c_adapter。
msgs:I2C 要发送的一个或多个消息。
num:消息数量,也就是 msgs 的数量。
返回值:负值,失败,其他非负值,发送的 msgs 数量。

i2c_master_send 和 i2c_master_recv 都是对 i2c_transfer 的封装。因此我们重点研究 i2c_transfer。

图片

其中,adap->algo->master_xfer 由芯片原厂提供。在 MTK 平台,是 mtk_i2c_transfer 函数,不同平台命名不同。

static int mtk_i2c_transfer(struct i2c_adapter *adap,struct i2c_msg msgs[], int num)
{
 int ret;
 int left_num = num;
 struct mtk_i2c *i2c = i2c_get_adapdata(adap);

  //打开时钟
 ret = mtk_i2c_clock_enable(i2c);
 if (ret)
  return ret;

  //初始化硬件
 mtk_i2c_init_hw(i2c);

 i2c- >auto_restart = i2c- >dev_comp- >auto_restart;

 if (i2c- >auto_restart && num == 2) {
  if (!(msgs[0].flags & I2C_M_RD) && (msgs[1].flags & I2C_M_RD) &&
      msgs[0].addr == msgs[1].addr) {
   i2c- >auto_restart = 0;
  }
 }

 if (i2c- >auto_restart && num >= 2 && i2c- >speed_hz > MAX_FS_MODE_SPEED)
  i2c- >ignore_restart_irq = true;
 else
  i2c- >ignore_restart_irq = false;

 while (left_num--) {
  if (!msgs- >buf) {
   dev_dbg(i2c- >dev, "data buffer is NULL.n");
   ret = -EINVAL;
   goto err_exit;
  }

  if (msgs- >flags & I2C_M_RD)
   i2c- >op = I2C_MASTER_RD;
  else
   i2c- >op = I2C_MASTER_WR;

  if (!i2c- >auto_restart) {
   if (num > 1) {
    /* combined two messages into one transaction */
    i2c- >op = I2C_MASTER_WRRD;
    left_num--;
   }
  }

  /* always use DMA mode. */
  ret = mtk_i2c_do_transfer(i2c, msgs, num, left_num);
  if (ret < 0)
   goto err_exit;

  msgs++;
 }
 /* the return value is number of executed messages */
 ret = num;

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

    关注

    9

    文章

    2076

    浏览量

    67173
  • API
    API
    +关注

    关注

    2

    文章

    2149

    浏览量

    66241
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1547

    浏览量

    130488
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于FPGA的USB数据传输

    你也许会有疑问,明明有这么多通信方式和数据传输(SPI、I2C、UART、以太网)为什么偏偏使用USB呢?
    的头像 发表于 08-06 14:47 4582次阅读
    基于FPGA的USB<b class='flag-5'>数据传输</b>

    飞凌嵌入式ElfBoard ELF 1板卡-I2C设备驱动之Linux下的I2C驱动简介

    I2C协议的基本功能的软件或硬件实现。它通常包括对I2C总线的初始化、数据传输、时序控制和错误处理等功能的支持。I2C核心提供了一组API
    发表于 04-15 10:19

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-I2C设备驱动之Linux下的I2C驱动简介

    I2C协议的基本功能的软件或硬件实现。它通常包括对I2C总线的初始化、数据传输、时序控制和错误处理等功能的支持。I2C核心提供了一组API
    发表于 04-15 10:39

    关于数据传输接口

    单片机用于数据传输的外设有哪些?原谅在下孤陋寡闻,我所知道的有SPI、I2C,不知还有哪些?谁的数据传输速度最快?
    发表于 09-02 12:22

    VEML6040颜色传感器是如何利用I2C总线进行数据传输

    VEML6040是什么?VEML6040颜色传感器的外围电路是怎样的?VEML6040颜色传感器是如何利用I2C总线进行数据传输呢?
    发表于 02-14 06:35

    HT45R37使用I2C进行数据传输的方法 (C语言)

    HT45R37使用I2C进行数据传输的方法 (C语言)HT45R37 提供SIM 串行传输功能,分别是SPI 功能和I2C 功能,本文介绍H
    发表于 03-27 08:36 12次下载

    HT56R678使用I2C进行数据传输的方法

    HT56R678使用I2C进行数据传输的方法 HT56R678 内建有SIM 功能,其中包括了SPI 和I2C 两种通信接口,本文以HT56R678 为母体,介绍使用I2C 进行
    发表于 03-27 09:25 16次下载

    HT56R678使用I2C进行数据传输的方法

    HT56R678使用I2C进行数据传输的方法HT56R678 内建有SIM 功能,其中包括了SPI 和I2C 两种通信接口,本文以HT56R678 为母体,介绍使用I2C 进行
    发表于 03-28 22:39 7次下载

    什么是IrDa/I2C管理总线

    什么是IrDa/I2C管理总线 IrDa:(Infrared Data:红外数据传输)是利用红外线方式实现电脑之间的数据传输。它也需要一界面,即红外线接
    发表于 02-05 11:47 795次阅读

    I2C隔离器如何实现双向数据传输

    观看此视频,了解ADuM1250/ADuM2250 iCoupler®数字隔离器如何利用Philips针对I2C开发的电平逻辑系统来实现双向数据传输
    的头像 发表于 08-01 06:06 6668次阅读

    i2c总线用来做什么_i2c总线数据传输过程

    I2C总线控制器为微控制器或微处理器提供控制I2C总线的接口,它控制所有I2C总线的特殊序列、协议、仲裁、时序,这里指MPC8250提供的I2C总线控制接口。
    发表于 11-24 14:16 7707次阅读

    I2C总线数据传输速度要求

    Semiconductors)在1980年代初期开发。I2C总线因其简单性和灵活性而被广泛应用于各种电子设备中,如传感器、显示器、存储器等。 I2C总线数据传输速度 I2C总线的
    的头像 发表于 01-17 15:15 3586次阅读

    I2C总线与Arduino的接口示例

    基础 I2C总线由两条线组成:数据线(SDA)和时钟线(SCL)。SDA用于传输数据,而SCL用于同步数据传输
    的头像 发表于 01-17 15:34 2360次阅读

    I2C总线数据包结构详解

    。以下是I2C总线数据包结构的详解: 一、I2C总线数据包的基本组成 I2C总线上的数据传输
    的头像 发表于 01-17 15:46 1391次阅读

    iic协议的数据传输速率标准

    I2C协议定义了多种数据传输速率标准,以适应不同的应用需求。以下是I2C协议的主要数据传输速率标准: 标准模式(Standard-mode)
    的头像 发表于 02-05 13:40 4362次阅读