如何模拟和检测I2C通信错误

I2C总线,作为嵌入式领域的一种主流同步串行通信总线协议,被广泛应用于电视、录像机、音频、A/D转换、D/A转换、时间测量、传感器等领域,以其简单、可靠、占用芯片引脚少、扩展方便的优点,深受众多芯片制造商和嵌入式开发者的青睐。

本篇小文主要关注恩智浦LPC系列MCU的I2C通信错误模拟和检测。如果客户把本文所述功能添加到自己的I2C应用中,可以提高其系统容错能力。
以下以LPC51U68为例进行讲述,这些内容同样适用于其他LPC54xxx系列和LPC55xx系列MCU。

I2C总线概述

I2C总线是一种8位、双向、串行、同步总线协议,主要用于芯片之间的短距离、低速通信。具有如下特性:

  1. 只需要两条总线,分别是串行时钟线(SCL)和串行数据线(SDA)。

  2. 连接到总线的每个设备都具有唯一地址,并且始终存在简单的主/从关系。主机可以作为发送器或接收器。

  3. 多主机支持,包括冲突检测和仲裁功能,可以防止两个或多个主机同时启动数据传输造成数据损坏。

  4. 支持多种工作模式,包括标准模式(100 kbit/s)、快速模式(400 kbit/s)、高速模式(3.4 Mbit/s),单向超快速模式(5 Mbit/s)

  5. 可以连接到同一总线的芯片数量仅受最大总线电容的限制。

I2C总线规范的技术细节,请参考UM10204 - I2C-bus specification and user manual。

LPC51U68的I2C通信错误

根据用户参考手册UM11071-LPC51U68 User manual,LPC51U68 I2C总线通信错误主要包括四种类型:

  • Start/Stop错误

  • Arbitration Loss

  • SCL time-out

  • Event time-out

接下来,小编就为众位大神讲述这四种通信错误类型。
首先是Start/Stop错误。了解I2C协议的众位大神都清楚,I2C总线以8位的方式进行传输,并且以Start信号作为传输的开始,以Stop信号作为传输的结束。如果I2C主机发起传输之后,在某一个8位传输的过程中,当外界的干扰造成主机意外检测到Start或者Stop信号,传输就会中断。此时,这个Start或者Stop信号就是Start/Stop错误。
那么什么是Arbitration Loss呢? 正如前面描述的那样,I2C支持多主机特性。在多个主机同时试图发起传输时,为保证数据传输的完整性,避免总线访问冲突,仲裁机制会选择其中一个主机获得总线控制权从而完成传输,其余主机丢失总线控制权退出传输。对于丢失总线控制权的主机而言,这就是Arbitration Loss。有关I2C总线仲裁的技术细节,请参考UM10204 - I2C-bus specification and user manual。
LPC51U68 I2C支持两种超时类型检测,并提供TIMEOUT寄存器用于设置超时阈值。
  • 第一种超时:如果SCL上的串行时钟被拉低,且持续时间超过超时阈值,这时就会产生SCL time-out

  • 第二种超时:如果两个I2C事件的时间间隔超过超时阈值,这时就产生了Event time-out

那什么是I2C事件呢?什么样的信号可以作为I2C事件呢?根据用户参考手册UM11071-LPC51U68 User manual,可以作为I2C事件的条件包括Start信号,Stop信号以及SCL串行时钟的变化。

LPC51U68 I2C通信
错误模拟和检测系统概述

为了实现I2C通信错误的模拟和检测,小编设计了一个简单的系统。下图为该系统的总体框图。

图1,I2C总线错误模拟和检测系统

如图1所示,系统包括两个带有I2C接口的LPC51U68评估板(OM40005)分别作为主机和从机,以及一个带有SCTimer的LPC55S69评估板(LPCXpresso55S69 Revision A2)作为I2C干扰生成机。

在不施加任何干扰的情况下,I2C传输可以正常进行。如果需要模拟并检测I2C通信错误,可以令干扰生成机检测并计数SCL串行时钟,然后根据需要产生的错误类型将干扰施加到SCL或者SDA上。其中,SCL time-out需要将干扰施加到SCL线,其余3种通信错误需要将干扰施加到SDA线。

如何模拟I2C通信错误

SCTimer是NXP MCU特有的功能部件,利用它可以实现边沿检测和可配置硬件状态机。

本文正是利用SCTimer的这个特性,检测SCL上的I2C串行时钟并对时钟计数,进而达到监控I2C传输状态的目的,然后在合适的I2C传输状态对SCL或SDA施加干扰,从而制造所需类型的I2C通信错误,并最终由I2C主机检测并输出。
下面小编就分别介绍4种I2C通信错误的状态机设计。
图2和图3分别为Start/Stop错误的状态转换和实测信号。干扰机在状态3检测到SCL上升沿并延迟一段时间,确保在SCL高电平期间将SDA拉低,从而制造一个Start信号。但此时,I2C正处于从机寻址阶段,传输正在进行,因此这个Start信号是个Start/Stop错误。
图2,Start/Stop错误状态转换
图3,Start/Stop错误相关信号

图4和图5分别为ArbitrationLoss的状态转换和实测信号。

状态机的状态2检测到SCL下降沿时,是SCL第二个时钟周期,正处于从机寻址阶段。

本文设定从机地址为0x7E, 采用MSB方式发送。也就是说,主机此时应该向SDA发送高电平,但由于干扰机的作用,SDA被拉低,主机因此检测到要发送到SDA的电平和实际不符,即检测到仲裁丢失-Arbitration Loss。

图4,Arbitration Loss状态转换

图5,ArbitrationLoss相关信号

图6和图7分别为SCL time-out的状态转换和实测信号。

状态机的状态4检测到SCL下降沿时,将SCL一直拉低,持续时间必然能超过超时阈值,这样SCL time-out就产生了。

图6,SCLtime-out状态转换

图7,SCL time-out相关信号

图8和图9分别为Event time-out的状态转换和实测信号。

干扰机状态0在SCL上检测到第一个下降沿之后拉低SDA,延迟等待直到SCL拉高,再将SDA拉高,从而制造一个Stop信号。这样调节干扰机的延迟等待控制相邻的Start信号和Stop信号的时间间隔,从而产生Event time-out。

图8,Event time-out状态转换

图9,Eventtime-out相关信号

如何检测和输出I2C通信错误

检测和输出I2C通信错误,涉及到软硬件环境配置和超时阈值计算,有关这部分的细节,请参考应用笔记AN13238- How to Trigger and Detect Transmission Errors for LPC51U68 I2C和配套软件,如图10所示。

图10,应用笔记和配套软件

总结

本文着眼于如何模拟和检测LPC54xxx和LPC55xxx系列MCU的I2C通信错误,并以LPC51U68为例,给出模拟和检测系统的总体构成和工作原理,重点介绍如何设计基于SCTimer的干扰机以模拟I2C通信错误,并给出相应的过程分析。

最后,如果各位大神对相关技术细节感兴趣,可以参考文章上面给出的应用笔记和配套软件。

(0)

相关推荐