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

    文章

    4172

    浏览量

    69260
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1346

    浏览量

    120818
收藏 人收藏

    评论

    相关推荐

    80 第23.1讲 I2C实验-I2C协议和6U的I2C控制器详解 - 第2

    程序代码I2C协议
    充八万
    发布于 :2023年08月17日 10:03:33

    80 第23.1讲 I2C实验-I2C协议和6U的I2C控制器详解 - 第3节 #硬声创作季

    程序代码I2C协议
    充八万
    发布于 :2023年08月17日 10:04:23

    80 第23.1讲 I2C实验-I2C协议和6U的I2C控制器详解 - 第4节 #硬声创作季

    程序代码I2C协议
    充八万
    发布于 :2023年08月17日 10:05:14

    80 第23.1讲 I2C实验-I2C协议和6U的I2C控制器详解 - 第7节 #硬声创作季

    程序代码I2C协议
    充八万
    发布于 :2023年08月17日 10:07:44

    全面掌握面试必考题I2C协议 - 第6节

    I2C协议
    充八万
    发布于 :2023年09月01日 19:02:42

    全面掌握面试必考题I2C协议 - 第10节

    I2C协议
    充八万
    发布于 :2023年09月01日 19:06:03

    全面掌握面试必考题I2C协议 - 第11节

    I2C协议
    充八万
    发布于 :2023年09月01日 19:06:53

    全面掌握面试必考题I2C协议 - 第12节

    I2C协议
    充八万
    发布于 :2023年09月01日 19:07:43

    最简单的总线通讯!I2C通讯总线的原理原来这么好懂

    通讯I2C
    安泰仪器维修
    发布于 :2024年01月02日 11:16:31

    I2C规范,I2C总线原理

    I2C规范,I2C总线原理1 序言
    发表于 04-09 18:34

    求问:proteus的i2c主模式的问题。

    最近我用proteus仿真pic16f1828单片机,用i2c功能写入一串数据给24c02c,然后读出来。波形和显示都是正常的,就是时钟频率有点蹊跷:设置的sspadd=9,晶振时钟4m。按照公式
    发表于 12-09 22:28

    I2C

    在看数据手册的时候看到I2C Boot Device Configuration中有这么一个选项  10       address                               0
    发表于 06-24 01:28

    什么是软件I2C和硬件I2C

    学习I2C总线通信协议,完成基于I2C硬件协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出。具体任务:1)解释什么是“软件I2C”和“硬件I2C”? (阅读野
    发表于 08-23 06:19

    I2C使用步骤

    文章目录一、I2C简介软件I2C硬件I2C软件I2C和硬件I2C的区别二、使用步骤1.引入库2.
    发表于 08-23 06:22

    I2C怎么使用

    硬件I2C(中断方式)以STC8F2K08S2单片机为例一、I2C相关的寄存器STC8系列单片机硬件I2C使用教程(一)二、I2C中断相关的
    发表于 12-02 08:16