【Linux 驱动】IMX6ULL I2C参考手册翻译

1. 概述

        I2C是一种双线双向串行总线,它提供了一种简单有效的数据交换方法,最大限度地减少了设备之间的互连。这种总线适用于需要在许多设备之间偶尔进行短距离通信的应用。灵活的I2C标准允许将其他设备连接到总线上,以进行扩展和系统开发。请参阅下图中的连接图:

        I2C接口速度取决于I2C总线负载和时序特性。有关引脚要求的详细信息,请参见12C总线规格。I2C系统是一个真正的多主总线,包括仲裁和碰撞检测,如果多个设备试图同时控制总线,可以防止数据损坏。该功能支持具有多处理器控制的复杂应用程序,并可通过外部连接到装配线计算机,用于快速测试和对最终产品进行校准。下图是I2C的框图:
 

 1.1 特征

I2C具有以下主要特征:

  • 兼容I2C总线标准
  • 多主站操作
  • 软件可编程的64个不同的串行时钟频率之一
  • 软件可选择的确认位
  • 仲裁丢失中断与自动模式切换从主到从
  • 呼叫地址识别中断
  • 启动和停止信号生成/检测
  • 重复起动信号产生
  • 确认位生成/检测
  • 总线忙检测

1.2 模式和操作 

I2C主要在两种功能模式下工作:标准模式和快速模式:

  • 在标准模式下,I2C支持的数据传输速率最高可达100kbits /s。
  • 在Fast模式下,数据传输速率可达400kbits /s。对于每个块操作,快速或标准模式不需要特殊配置。它是区分标准模式和快速模式的数据传输速率

 2. 外部信号

        对于I2C合规性,连接到I2Cn_SCL和I2Cn_SDA信号的所有设备必须 具有开漏或开集电极输出。逻辑与功能在 上实现,两条线都带有外部上拉电阻。
I2Cn_SCL和I2Cn_SDA的输入也需要在选择相应pad为I2C功能后,通过在IOMUX中设置 SION位手动使能。

 3. 时钟

I2C有两个输入时钟。

I2C的时钟源说明如下表所示。请参阅时钟控制器 模块(CCM)时钟设置,配置和门控信息。

  • 外围时钟:这个时钟用于外围总线寄存器读/写
  • 模块时钟:这是I2C的功能时钟。串行位时钟频率来源于模块时钟。模块时钟与外设时钟是同步的。模块时钟的最小频率应为12.8 MHz用于快速模式,以实现400-kbps的操作

4. 功能描述

本节提供了该块的完整功能描述。

4.1 I2C系统配置

复位后,I2C默认为Slave Receive操作。因此,当不作为 主设备或响应从设备发送地址时,I2C默认为从设备接收状态。

4.2 仲裁过程

        如果多个设备同时请求总线,则总线时钟由 同步过程确定,其中低周期等于设备中最长的时钟周期 ,高周期等于最短的时钟周期。数据仲裁程序 决定了竞争设备的相对优先级

        如果一个设备发送高逻辑而另一个发送低逻辑,则失去仲裁;它 立即切换到Slave Receive模式并停止驱动I2Cn_SDA。在这种情况下, 从主模式到从模式的转换不会产生Stop条件。同时, 硬件在I2C状态寄存器(I2C_I2SR[IAL]表示仲裁丢失)中设置仲裁丢失位。

4.3 时钟同步

         由于使用了线与逻辑,SCL上的高到低转换会影响连接到总线上的设备。当主机驱动SC低时,设备开始计数它们的低周期。当一个设备时钟变低时,它保持SCL低,直到时钟高状态达到。但是,如果另一个设备时钟仍处于低周期,则该设备时钟从低到高的变化可能不会改变SCL的状态 。因此,低周期最长的设备保持同步时钟SCL低。

        低周期较短的设备在此期间进入高等待状态(如图 31-3所示)。当所有涉及的设备都计算出它们的低周期时,同步的时钟SCL被释放并拉高。然后,设备时钟 和SCL状态之间没有区别,因此所有设备都开始计算它们的高周期。第一个完成高周期的设备再次将SCL拉低。

 4.4 握手

        时钟同步机制可以用作数据传输中的握手机制。从 设备可以在完成一个字节传输(9位)后保持SCL低。在这种情况下, 时钟机制停止总线时钟,并迫使主时钟进入等待状态,直到 从服务器释放SCL。

4.5 时钟延长

        从机可以使用时钟同步机制来降低传输比特率。在主服务器将SCL调低之后,从服务器可以将SCL调低至所需的时间 ,然后释放它。如果从SCL低周期比主SCL低周期长, 由此产生的SCL总线信号低周期被拉长。

4.6 外围总线访问

        I2C是一个16位块。应该只对块执行半字访问

4.7 在IP总线上产生传输错误

        如果在外设从总线接口上收到一个地址,但没有实现,则会产生访问错误

4.8 复位

        I2C有以下几种复位方式:

  • 全局复位:整个I2C的硬异步复位
  • 软件复位:整个I2C (I2C_IADR和I2C_IFDR除外)的内部复位通过置位I2C_I2CR[IEN]位发起

4.9 中断

        块中只有一个中断,它可以通过设置 I2C_I2CR[IIEN]位来启用

        在下列任何一种情况下都会产生中断:

  • 一个字节传输完成(中断被设置在第九个时钟的下降沿)。
  • 在Slave Receive模式下,接收到与自己的特定地址匹配的地址
  • 仲裁丢失

5. 初始化

5.1 初始化过程

        在接口能够传输串行数据之前,必须初始化寄存器,如下所列:

  1. 设置数据采样率(I2C_IFDR[IC]),从系统总线时钟获取SCL频率
  2. 更新(I2C_IADR)中的地址以定义其从地址(地址范围从0到0x7f)
  3. 设置I2C使能位(I2C_I2CR[IEN]),使能I2C总线接口系统
  4. 修改I2C_I2CR中的位,使其选择“主从模式”、“收发模式”和“中断使能”

5.2 产生开始信号

        初始化过程完成后,可以通过选择主传输模式传输串行数据。在多主总线系统上,必须测试繁忙总线 (I2C_I2SR[IBB]),以确定串行总线是否空闲,如果总线空闲(IBB = 0),则可以发送Start信号和第一个字节(从地址)。写入数据寄存器的数据 包括所需的从机的地址,并且LSB 指示传输方向。

        Stop和下一个Start条件之间的空闲时间内置于硬件中,从而 生成Start周期。根据系统时钟和 SCL周期的相对频率,在将 调用地址写入数据寄存器(I2C_I2DR)之后,可能需要等到I2C不忙时,再继续将数据加载到 数据寄存器(I2C_I2DR)中

5.3 传输后软件响应

        发送或接收一个字节设置数据传输位(I2C_I2SR[ICF]),这 表示一个字节的通信完成。完成后,中断状态 (I2C_I2SR[IIF])也被设置。如果设置了中断使能 (I2C_I2CR[IIEN]),则会产生外部中断。软件必须首先清除中断例程中的中断状态 (I2C_I2SR[IIF])

        数据传输位(I2C_I2SR[ICF])通过在 接收模式下从I2C_I2DR读取或在发送模式下写入该寄存器来清除。

        如果中断使能被解除,软件可以通过监控中断 状态(I2C_I2SR[IIF])来服务主程序中的I2C I/O,在这种情况下,中断 状态应该在数据传输(I2C_I2SR[ICF])中轮询,因为当仲裁丢失时操作 是不同的

        当中断发生在地址周期的末尾时,主机总是处于传输 模式;也就是说,地址将要发送。如果需要主接收模式,那么应该切换 I2C_I2CR[MTX],并且必须执行对I2C_I2DR寄存器的假读取 以触发接收数据

        在从模式地址周期(I2C_I2SR[IAAS] = 1)中,读取从读写位 I2C_I2SR[SRW]来确定下一次传输的方向。发送/ 接收位(I2C_I2CR[MTX])也应该相应地编程,对于从模式 数据周期(IAAS = 0), SRW无效。应该读取MTX以确定当前传输方向

5.4 产生停止信号

        当主机发出停止信号时,数据传输结束,这可以在所有数据发送后发生。对于一个主接收者终止一个数据传输,它必须通过不响应最后一个数据字节通知从发送器。这是通过在读取倒数第二个字节之前设置发送确认 位(I2C_I2CR[TXAK])来完成的。在读取最后一个字节之前,必须生成一个Stop信号

5.5 产生重复开始

        在数据传输之后,如果主机仍然需要总线,它可以发送另一个Start( )信号,后面跟着另一个slave地址,而不发送停止信号

5.6 从模式

        不使用

6. 软件限制

        软件应该确保在 设置I2C_I2CR[RSTA]位之后,在写入I2C_I2DR寄存器之前,至少有两个模块时钟周期的延迟,模块时钟的最大时钟周期为78ns。

  • 13
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
imx6ull是一款基于Arm架构的处理器,它支持I2C总线。I2C驱动分为两部分:I2C控制器驱动I2C设备驱动I2C总线在寻址时使用从位,并且如果启用了中断,Arm平台会中断并检查从读/写位的状态。在复位后,默认情况下,I2C处于从接收操作状态,除非作为主设备操作或响应从设备发送地址。需要注意的是,imx6ullI2C设计与PhilipsTM I2C总线协议兼容,并且仅支持标准和快速模式。有关更多配置、协议和限制的信息,可以参考飞利浦半导体公司的I2C总线规范2.1版。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [i.MX 6ULL 驱动开发 二十一:I2C(I2C子系统+MISC子系统)](https://blog.csdn.net/OnlyLove_/article/details/127739570)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [IMX6ULL平台的I2C](https://blog.csdn.net/weixin_52849254/article/details/130844599)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值