• I2C 协议


    符号注解

    S

    Start 条件

    P

    Stop 条件

    Rd/Wr (1 bit)

    读/写位。Read等于1, Write等于0。

    A, NA (1 bit)

    确认(ACK)和不确认(NACK)位

    Addr (7 bits)

    I2C 7位地址。注意,这可以像往常一样进行扩展,以获得10位I2C地址。

    Comm (8 bits)

    命令字节,通常选择设备上的寄存器。

    Data (8 bits)

    一个普通数据字节。有时,对于16位数据写DataLow, DataHigh。

    Count (8 bits)

    包含块操作长度的数据字节。

    [..]

    由I2C设备发送的数据,而不是由主机适配器(adapter)发送的数据。

    简单的发送事务

    由 i2c_master_send() 实现:

    S Addr Wr [A] Data [A] Data [A] ... [A] Data [A] P

    API解释:

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

    在主传输模式下发出单个I2C消息。

    参数

    • const struct i2c_client *client:从设备的指针
    • const char *buf:将要写入从设备的数据
    • int count要写多少字节,必须小于64k,因为 msg.len 是u16

    描述

      返回负errno,否则返回写入的字节数。

    简单的接收事务

    由 i2c_master_recv() 实现:

    S Addr Rd [A] [Data] A [Data] A ... A [Data] NA P

    API解释:

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

    在主接收模式下发出单个I2C消息。

    参数

    • const struct i2c_client *client:从设备的指针
    • char *buf:存储从slave读取的数据
    • int count:要读取多少字节,必须小于64k,因为 msg.len 是u16

    描述

      返回负errno,否则返回读的字节数。

    合并事务

    由  i2c_transfer() 实现。

    它们就像上面的事务,但不是一个停止条件P,而是一个开始条件S被发送,事务继续。先读一个字节,再写一个字节的例子:

    S Addr Rd [A] [Data] NA S Addr Wr [A] Data [A] P

    API解释:

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

    执行单个或组合的I2C消息。

    参数

    • struct i2c_adapter *adap:i2c适配器的指针
    • struct i2c_msg *msgs:在发出STOP命令以终止操作之前要执行的一条或多条消息;每条消息都以START开头。
    • int num: 要执行的消息数。

    描述

      返回负errno,否则返回执行的消息数。

    注意,没有要求将每个消息发送到相同的从地址,尽管这是最常见的方式。

    修改后的事务

    通过为I2C消息设置这些标志,还可以生成对I2C协议的以下修改。除了I2C_M_NOSTART之外,它们通常只用于解决设备问题:

    • I2C_M_IGNORE_NAK: 

    正常情况下,如果客户端有[NA]消息,会立即中断。设置此标志将任何[NA]视为[A],并发送所有消息。这些消息可能会发送失败由于SCL lo->hi 超时。

    • I2C_M_NO_RD_ACK:

    在读消息中,跳过master a /NA位。

    • I2C_M_NOSTART:

    在一个合并事务中,在某个点没有' S Addr Wr/Rd [a] '生成。例如,在第二个部分消息上设置I2C_M_NOSTART将生成如下内容:

     S Addr Rd [A] [Data] NA Data [A] P 

    如果您为第一个部分消息设置I2C_M_NOSTART变量,我们不会生成Addr,但我们会生成启动条件s。这可能会混淆您总线上的所有其他客户端,所以不要尝试这样做。

    这通常用于收集来自系统内存中的多个数据缓冲区的传输,这些传输看起来像是向I2C设备的单个传输,但也可能在一些罕见设备的方向更改之间使用。

    • I2C_M_REV_DIR_ADDR:

    这将切换Rd/Wr标志。也就是说,如果你想写,但需要发出Rd而不是Wr,或者相反,你可以设置这个标志。例如:

     S Addr Rd [A] Data [A] Data [A] ... [A] Data [A] P 

    • I2C_M_STOP:

    在消息之后强制一个停止条件(P)。一些与I2C相关的协议,如SCCB,需要这样做。通常情况下,你真的不想在一次传输的消息之间被打断。

    本文来自博客园,作者:王楼小子,转载请注明原文链接:https://www.cnblogs.com/wanglouxiaozi/p/15146868.html

  • 相关阅读:
    react实现转盘动画
    a标签做锚点定位,有部分内容被置顶头部遮挡的解决方法
    react复制文案到剪切板
    MySQL Windows安装配置
    Qt编译MySQL驱动
    P8375 [APIO2022] 游戏 解题报告
    CF1687E Become Big For Me 出题报告
    解决 windows 10 WSL 安装Ubuntu后 屏幕亮度飙至最高 且屏幕亮度无法调节 外接显示器无法显示 的问题
    Dubbo3 源码系列 Dubbo“纠葛”(入门篇)
    windows监控进程死亡并拉起
  • 原文地址:https://www.cnblogs.com/wanglouxiaozi/p/15146868.html
Copyright © 2020-2023  润新知