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

    文章

    1774

    浏览量

    64382
  • API
    API
    +关注

    关注

    2

    文章

    1470

    浏览量

    61725
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1472

    浏览量

    122944
收藏 人收藏

    评论

    相关推荐

    关于数据传输接口

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

    I2C 总线协议图解

    时,从设备将回传一否 定应答位。数据传输的过程如图所示: 在前面我们还提到过,I2C总线上的每一设备都对应一唯一的地址,主从设备之间的
    发表于 08-01 16:12

    I2C总线支持几种传输模式

    I2C 总线提供了一种串行通信方式,用在 MCU 与 EEPROM,LCD模块,温度传感器等等之间控制。I2C 用两条线 (数据线SDA 和时钟线 SCL) 在设备间传输
    发表于 02-11 07:05

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

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

    imx8mp i2c数据传输速度慢怎么处理?如何加速?

    时钟的 i2c 加载相同的二进制数据需要大约 5.2 秒。 我们可以做些什么来加速 i2c 数据传输?我们使用了 yocto/hardnott 和 kirkstone,两者都很慢。
    发表于 05-16 06:28

    如何将USB HID连接到EEPROM设备控制NUC240的I2C数据传输

    控制NUC240的I2C数据传输。 您可以在下列时间下载样本代码http://www.nuvoton.com/resources-downlo. 1227151637。 nuvoton 核
    发表于 08-22 08:08

    如何控制USB HID连接到EEPROM设备上来控制NUC240的I2C数据传输

    控制NUC240的I2C数据传输。 您可以在下列时间下载样本代码http://www.nuvoton.com/resources-downlo. 1227151637。 nuvoton 核
    发表于 08-30 06:47

    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 715次阅读

    互联IC总线(I2C)

    I2C(Inter-Integrated Circuit,互联IC)总线通过两线制设计(串行数据线SDA和串行时钟线SCL)来提供双向的数据传输,可连接到外部I2C器件,例如串行存储器
    发表于 01-13 16:38 13次下载

    Arduino教程之I2C模块使用教程资料免费下载

    为什么叫I2C模块?和一元硬币差不多大小的一块PCB上放了三个芯片,分管三个功能:时间计算、温度侦测、数据存储。这三个芯片都是通过
    发表于 01-22 16:59 9次下载
    Arduino教程之<b class='flag-5'>I2C</b>模块使用教程资料免费下载

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

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

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

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