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

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

3天内不再提示

I2C先写后读是什么

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:嵌入式Linux系统开 2023-07-22 15:58 次阅读

I2C

图片

I2C 先写后读

其实所谓的 I2C 读,都是先写后读。

I2C spec 规定如下

图片

详细解析如下(详细看图)

图片

对从机进行读操作时,主设备发出开始标志 (S) 和读地址 (从机地址加一个 R/W 位,1 为读,0 为写)。等待从机产生应答信号。然后发送寄存器地址,告诉从机读哪一个寄存器。紧接着,收到应答信号后,主设备再发一个开始信号,然后发送从设备读地址。从机产生应答信号并开始发送寄存器数据。通信以主设备产生的拒绝应答信号 (NACK) 和结束标志 (P) 结束。

举例(例子进行了两次封装)

void ap3216c_readdata(struct ap3216c_dev *dev)
{
 unsigned char i =0;
    unsigned char buf[6];
 
 /* 循环读取所有传感器数据 */
    for(i = 0; i < 6; i++) 
    {
        buf[i] = ap3216c_read_reg(dev, AP3216C_IRDATALOW + i); 
    }
}

static unsigned char ap3216c_read_reg(struct ap3216c_dev *dev, u8 reg)
{
 u8 data = 0;

 ap3216c_read_regs(dev, reg, &data, 1);
 return data;
}

static int ap3216c_read_regs(struct ap3216c_dev *dev, u8 reg, void *val, int len)
{
 int ret;
 struct i2c_msg msg[2];
 struct i2c_client *client = (struct i2c_client *)dev- >private_data;

 /* msg[0]为发送要读取的首地址 */
 msg[0].addr = client- >addr;   /* ap3216c地址 */
 msg[0].flags = 0;     /* 标记为发送数据 */
 msg[0].buf = ®     /* 读取的首地址 */
 msg[0].len = 1;      /* reg长度*/

 /* msg[1]读取数据 */
 msg[1].addr = client- >addr;   /* ap3216c地址 */
 msg[1].flags = I2C_M_RD;   /* 标记为读取数据*/
 msg[1].buf = val;     /* 读取数据缓冲区 */
 msg[1].len = len;     /* 要读取的数据长度*/

 ret = i2c_transfer(client- >adapter, msg, 2);
 if(ret == 2) {
  ret = 0;
 } else {
  printk("i2c rd failed=%d reg=%06x len=%dn",ret, reg, len);
  ret = -EREMOTEIO;
 }
 return ret;
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 设备
    +关注

    关注

    2

    文章

    4504

    浏览量

    70626
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1487

    浏览量

    123690
收藏 人收藏

    评论

    相关推荐

    I2C总线—电平转换

    我们先来看一张图,熟悉I2C的人一看,这不是I2C的level shifter电路嘛,在Philip的I2C标准里面有,没有啥复杂的。
    的头像 发表于 11-02 12:32 4947次阅读
    <b class='flag-5'>I2C</b>总线—电平转换

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

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

    i2c总线的特点

    i2c总线的特点:2 I2C 总线使设计人员和厂商都得益.. 3 2.1 设计人员的得益.. 4 2.2 厂商的得益. 5 3 介绍I2C 总线规范 6 4
    发表于 08-05 09:05 26次下载

    I2C总线规范与I2C器件C51读写程序

    I2C总线规范与I2C器件C51读写程序:本文简要介绍了I2C总线,并给出了I2C器件的C51读
    发表于 08-22 17:51 93次下载

    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总线协议中文版 
    发表于 11-05 09:26 2921次阅读

    基于CPLD的I2C总线接口设计

    在电路设计中,I2C总线是比较常用的两线式串行通信方式,大多数的CPU都擅长于并口操作,不具备直接操作I2C总线接口的能力。为了使不具备I2C总线接口能力的CPU通过对并口的简单操作实现对I2
    发表于 02-12 16:11 95次下载
    基于CPLD的<b class='flag-5'>I2C</b>总线接口设计

    基于51的I2c总线

    I2c总线,基于51的I2c总线,程序学习。快来下载学习吧
    发表于 01-13 11:49 34次下载

    i2c

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

    I2C LCD 器件通过驱动带有 I2C 接口的 2 线式 16 字符 LCD

    I2C LCD 器件通过驱动带有 I2C 接口的 2 线式 16 字符 LCD
    发表于 10-10 08:22 13次下载
    <b class='flag-5'>I2C</b> LCD 器件通过驱动带有 <b class='flag-5'>I2C</b> 接口的 <b class='flag-5'>2</b> 线式 16 字符 LCD

    硬件I2C与模拟I2C

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

    ESP 12E I2c基卡的I2C IO卡设计

    电子发烧友网站提供《ESP 12E I2c基卡的I2C IO卡设计.zip》资料免费下载
    发表于 08-15 09:27 3次下载
    ESP 12E <b class='flag-5'>I2c</b>基卡的<b class='flag-5'>I2C</b> IO卡设计

    I2C子系统SW Architecture

    I2C SW Architecture 【driver 驱动层】由普通驱动工程师负责,【i2c 核心层】由 Linux 提供,【i2c 核心层】以下由芯片原厂负责。 I2C 子系统
    的头像 发表于 07-22 16:01 954次阅读
    <b class='flag-5'>I2C</b>子系统SW Architecture

    I2CI3C的区别有哪些

    I2CI3C 主要区别如下: I2C 虽然也是两条线,但是很多时候传感器需要一条额外的中断线,来告诉主控数据已经准备好。I3C 允许从设备直接在总线上产生中断,不再需要一条额外的
    的头像 发表于 07-22 16:20 6937次阅读
    <b class='flag-5'>I2C</b>和<b class='flag-5'>I3C</b>的区别有哪些

    i2c采样是上升沿吗?

    i2c采样是上升沿吗?  I2C采样是指在I2C总线上对数据进行采样。在I2C总线上,数据的传输是通过2条线传递。一条是时钟线(SCL),另
    的头像 发表于 09-19 17:16 2732次阅读