如何模拟和检测I2C通信错误
I2C总线,作为嵌入式领域的一种主流同步串行通信总线协议,被广泛应用于电视、录像机、音频、A/D转换、D/A转换、时间测量、传感器等领域,以其简单、可靠、占用芯片引脚少、扩展方便的优点,深受众多芯片制造商和嵌入式开发者的青睐。
I2C总线概述
I2C总线是一种8位、双向、串行、同步总线协议,主要用于芯片之间的短距离、低速通信。具有如下特性:
只需要两条总线,分别是串行时钟线(SCL)和串行数据线(SDA)。
连接到总线的每个设备都具有唯一地址,并且始终存在简单的主/从关系。主机可以作为发送器或接收器。
多主机支持,包括冲突检测和仲裁功能,可以防止两个或多个主机同时启动数据传输造成数据损坏。
支持多种工作模式,包括标准模式(100 kbit/s)、快速模式(400 kbit/s)、高速模式(3.4 Mbit/s),单向超快速模式(5 Mbit/s)
可以连接到同一总线的芯片数量仅受最大总线电容的限制。
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
第一种超时:如果SCL上的串行时钟被拉低,且持续时间超过超时阈值,这时就会产生SCL time-out。
第二种超时:如果两个I2C事件的时间间隔超过超时阈值,这时就产生了Event time-out。
那什么是I2C事件呢?什么样的信号可以作为I2C事件呢?根据用户参考手册UM11071-LPC51U68 User manual,可以作为I2C事件的条件包括Start信号,Stop信号以及SCL串行时钟的变化。
LPC51U68 I2C通信
错误模拟和检测系统概述
为了实现I2C通信错误的模拟和检测,小编设计了一个简单的系统。下图为该系统的总体框图。
如图1所示,系统包括两个带有I2C接口的LPC51U68评估板(OM40005)分别作为主机和从机,以及一个带有SCTimer的LPC55S69评估板(LPCXpresso55S69 Revision A2)作为I2C干扰生成机。
如何模拟I2C通信错误
SCTimer是NXP MCU特有的功能部件,利用它可以实现边沿检测和可配置硬件状态机。
图4和图5分别为ArbitrationLoss的状态转换和实测信号。
状态机的状态2检测到SCL下降沿时,是SCL第二个时钟周期,正处于从机寻址阶段。
本文设定从机地址为0x7E, 采用MSB方式发送。也就是说,主机此时应该向SDA发送高电平,但由于干扰机的作用,SDA被拉低,主机因此检测到要发送到SDA的电平和实际不符,即检测到仲裁丢失-Arbitration Loss。
图4,Arbitration Loss状态转换
图6和图7分别为SCL time-out的状态转换和实测信号。
状态机的状态4检测到SCL下降沿时,将SCL一直拉低,持续时间必然能超过超时阈值,这样SCL time-out就产生了。
图6,SCLtime-out状态转换
图8和图9分别为Event time-out的状态转换和实测信号。
干扰机状态0在SCL上检测到第一个下降沿之后拉低SDA,延迟等待直到SCL拉高,再将SDA拉高,从而制造一个Stop信号。这样调节干扰机的延迟等待控制相邻的Start信号和Stop信号的时间间隔,从而产生Event time-out。
图8,Event time-out状态转换
如何检测和输出I2C通信错误
检测和输出I2C通信错误,涉及到软硬件环境配置和超时阈值计算,有关这部分的细节,请参考应用笔记AN13238- How to Trigger and Detect Transmission Errors for LPC51U68 I2C和配套软件,如图10所示。
总结
本文着眼于如何模拟和检测LPC54xxx和LPC55xxx系列MCU的I2C通信错误,并以LPC51U68为例,给出模拟和检测系统的总体构成和工作原理,重点介绍如何设计基于SCTimer的干扰机以模拟I2C通信错误,并给出相应的过程分析。
最后,如果各位大神对相关技术细节感兴趣,可以参考文章上面给出的应用笔记和配套软件。