I2C通讯可能问题分析
用IO模拟IIC方式读写EEPROM容易出现的问题
用IO模拟IIC方式读写EEPROM容易出现的问题 在嵌入式软件开发过程中,经常会用模拟IO的方式读写EEPROM 的操作。
有时会因程序编码的问题,出现读写数据不正确的情况。
根据笔者多年的开发经验与大家分享希望对大家有所帮助。
对EEPROM的操作常见的有两种方式:I2C,SPI;在应用中经常会用到模拟IO方式读写EEPROM。
在编写此类代码时必须要掌握I2C 与SPI协议。
I2C总线上的数据稳定规则,SCL为高电平时SDA上的数据保持稳定,SCL为低电平时允许SDA变化。
如果SCL处于高电平时,SDA上产生下降沿,则认为是起始位,SDA上的上升沿认为是停止位。
通信速率分为常规模式(时钟频率100kHz)和快速模式(时钟频率400kHz)。
同一总线上可以连接多个带有I2C接口的器件,每个器件都有一个唯一的地址,既可以是单接收的器件,也可以是能够接收发送的器件。
SPI,串行外围设备接口。
是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便。
在操作中出现读取数据不正确,或者不能读取数据可能有以下原因:1.没有遵照通信协议:这两种通信方式都有各自独立的协议,如果在编写程序时不按通信协议,自然就不能正常通信了;2.时序不对:两处通讯方式都有严格的时序,编写程序时要严格按对应的时序;3.IO口方式方向设置不正确:在通信中数据有输入与输出的时候,特别是在I2C的方式下,有数据输入时相应的IO口要设置为输入,反之亦然,初学都容易犯这样的错误;4.看页的大小,超过一个页连续写就回滚,前面的就被覆盖。
其实里面有一个页地址计数器,如果页是8个byte,那么这个计数器就3bit,增加的地址(连续写的地址范围)就相当于溢出或者相当于按页取模。
在应用中的建议:1. SCL与SDA引脚用2.2K--4.7K电阻上拉;2. IO口与EEPROM的相应引脚不能直接相连,串一个几百欧电阻;3.为保证数据的正确性,在写入数据时最好对数据进行检验;4.采用循环地址的方式进行存储,避免只在一个固定地址上读写数据;。
i2c 返回 io error
I2C(Inter-Integrated Circuit)是一种用于在微控制器和外部设备之间进行通信的串行通信协议。
它是一种两线制的通信协议,使用SCL (串行时钟)和SDA(串行数据)线进行通信。
在微控制器中,I2C 总线通常用于连接传感器、存储器、外围设备等外部设备。
然而,在使用I2C通信时,有时会遇到返回IO错误的问题,本文将从以下几个方面来分析I2C返回IO错误及其解决办法。
1. 错误的I2C设备位置区域在使用I2C通信时,一个常见的问题是错误的设备位置区域。
每个I2C 设备都有一个7位的位置区域,这个位置区域可以是静态的,也可以是可编程的。
在进行I2C通信时,首先要确保所访问的设备位置区域是正确的。
如果设备位置区域错误,就会导致IO错误的发生。
解决这个问题的方法是仔细查阅设备的数据手册,确认设备位置区域的正确性。
2. 电源供应问题另一个可能导致I2C返回IO错误的问题是电源供应问题。
I2C设备在通信时需要稳定的电源供应,如果电源不稳定,就会导致通信中断或错误。
为了解决这个问题,可以使用示波器或者多用表来监测设备的电源供应情况,确保电源稳定。
3. 总线冲突I2C总线上的设备是通过位置区域来进行通信的,当多个设备使用相同的位置区域或者占用同一总线时,就会发生总线冲突,导致IO错误的发生。
解决这个问题的方法是重新安排设备的位置区域,避免位置区域冲突,或者使用I2C总线的多主机模式来解决冲突问题。
4. 外部干扰在一些工业环境下,会有外部干扰源对I2C通信产生影响。
这些干扰源可能是电磁干扰、噪声干扰等。
为了解决这个问题,可以采取一些屏蔽措施,比如使用屏蔽电缆、屏蔽罩等来减少外部干扰。
5. 通信速率过快I2C通信的速率是可以调节的,但是如果通信速率过快,就会导致通信错误。
可以通过降低通信速率来解决这个问题,确保通信稳定。
总结I2C返回IO错误是一个常见的问题,但是通过仔细排查,可以找到并解决问题的根源。
I2C操作时序问题总结(内附大量实用代码和详解)
I2C 总线在单片机操作中用到的很多。
特别是以I2C总线进行数据和命令传输的器件,比如AT24C02存储芯片等。
特此做了相关操作过程中经常用到的操作和一些操作的解释。
相信看完之后,肯定会对I2C总线有深刻的理解。
I2C总线操作(从高位开始进行读写操作)写操作时序启动之后先进行一个字节的指令写入操作,然后进行应答;在进行字节数据的传送;然后再进行应答;I2C读操作时序基本上与写操作相同,不同的是读操作只需进行指令的写入,不写数据(应该不绝对),最后主机产生非应答信号,结束数据的读取;在对E2PROM(24C02)进行操作时,写入写操作指令后,然后写入需要操作的存储器地址号,最后写入数据。
且每个存储器地址只能赋值一次,重复对该存储器地址赋值会使前一个数据丢失。
读操作过程中需对将指令改写为读指令,在读取数据时需要写入指令指明需要读出数据时的存储器地址号下面是对24C02的写操作和读操作void write_add(uchar address,uchar date){start();write_byte(0xa0); //写指令respons();write_byte(address); //写入要操作的存储器地址respons();write_byte(date); //写入存储器数据respons();stop();}uchar read_add(uchar address){uchar date;start();write_byte(0xa0); //写入指令respons();write_byte(address); //写入读取操作时,要读取的存储器地址respons();stop();start();write_byte(0xa1); //写入指令,进行读操作respons();date=read_byte(); //进行读取数据norespons();stop();return date;}void main(){init();write_add(23,0xcc); //写入存储器地址号为23中,数据为0xcc delay1(100);P1=read_add(23); //读入存储器地址号为23中的数据,并将数据赋值给P1口,通过数码管显示while(1); //停留在此处}I2C串行总线的操作程序起始信号(时钟线为高,数据线由高变低):void AT24C04_Start(){SDA = 1; //拉高数据线 SCL = 1; //拉高时钟线 Delay5us(); //延时SDA = 0; //产生下降沿 Delay5us(); //延时SCL = 0; //拉低时钟线}结束信号:(时钟线为高,数据线由低变高)void AT24C04_Stop(){SDA = 0; //拉低数据线 SCL = 1; //拉高时钟线 Delay5us(); //延时SDA = 1; //产生上升沿 Delay5us(); //延时}字节传输:(每个字节为8位,一个字节带一个相应位)发送数据:void AT24C04_SendByte(BYTE dat){BYTE i;for (i=0; i<8; i++) //8位计数器{dat <<= 1; //移出数据的最高位SDA = CY; //送数据口SCL = 1; //拉高时钟线Delay5us(); //延时SCL = 0; //拉低时钟线,以便下一次传送数据 Delay5us(); //延时}AT24C04_RecvACK();}接收数据:BYTE AT24C04_RecvByte(){BYTE i;BYTE dat = 0;SDA = 1; //使能内部上拉,准备读取数据for (i=0; i<8; i++) //8位计数器{dat <<= 1;SCL = 1; //拉高时钟线Delay5us(); //延时dat |= SDA; //读数据SCL = 0; //拉低时钟线以便下一个数据传送 Delay5us(); //延时}return dat;数据响应:每次数据传输成功后,接收器件发送一个应答信号,当第九个信号产生时,产生应答信号的器件将SDA拉低。
I2C通信原理及程序详细讲解
I2C通信原理及程序详细讲解I2C(Inter-Integrated Circuit)是一种串行通信协议,常用于连接微控制器、传感器和其他外部设备。
I2C通信协议由荷兰飞利浦公司于1982年开发,它使用两根信号线(SDA和SCL)进行数据传输。
I2C通信协议采用主从结构,一个主设备(如微控制器)可以连接多个从设备(如传感器)。
主从设备之间通过SDA和SCL线进行数据传输。
SDA线是双向数据线,用于传输数据,SCL线是时钟线,用于同步数据传输。
I2C通信协议中,设备的地址是一个重要概念。
每个设备都有一个唯一的地址,通过该地址可以选择和通信特定的设备。
地址由7个位组成,其中最高位是固定的,并取决于设备是主设备还是从设备。
如果最高位为0,则表示该设备是主设备;如果最高位为1,则表示该设备是从设备。
通过以下步骤,让我们详细了解如何在I2C总线上进行通信。
1.初始化I2C总线:在程序开始时,需要初始化I2C总线。
这通常包括初始化SDA和SCL引脚,设置时钟频率等。
具体的初始化步骤取决于使用的硬件和软件环境。
2.发送开始信号:开始信号表示I2C数据传输的开始。
它由主设备发送,并且SDA线从高电平转为低电平时发出。
发送开始信号后,SDA线上的数据将被解释为地址数据。
3.发送设备地址:主设备发送一个包含设备地址和读/写位(R/W)的数据字节。
设备地址是唯一的,并且由主设备选择。
读/写位指示从设备是要读取数据还是写入数据。
4.等待从设备响应:主设备发送设备地址后,会等待从设备的响应。
从设备将响应一个应答位(ACK)来确认地址接收成功。
如果收到ACK位,则继续进行下一步,否则可能是设备未连接或通信错误。
5.发送数据:主设备发送数据给从设备。
数据可以是命令、配置或实际数据,具体取决于应用场景。
发送数据的方式是将每个数据字节传输到SDA线上,并在每个数据字节后发送一个ACK位。
6.接收数据:从设备将数据发送给主设备。
数据可以是传感器读数、存储器数据等。
STM32HAL库I2C工作出错返回I2C_BUSY
STM32HAL库I2C⼯作出错返回I2C_BUSY使⽤stm32cubemx⽣成硬件I2C的代码不过⾃动⽣成的代码,调⽤HAL_I2C_XXX的API⼯作不正常,返回错误代码为I2C_BUSY使⽤STM32的I2C接⼝使⽤时需要注意很多细节,不过HAL库中官⽅已经为⽤户根据这些细节做了处理,可以直接使⽤。
不过这个I2C代码并不稳定,有些板⼦可以⽤,另⼀些则出错.出错现象为调⽤HAL_I2C的API时,返回I2C_BUSY查看寄存器 BUSY位被置位解决⽅案将⾃动⽣成的代码中,HAL_RCC_I2C1_CLK_ENABLE()放到GPIO初始化之前就不会出现这个问题,I2C⼯作正常具体依据没有找到,不过在HAL的说明⽂档中有要求这样的初始化顺序,同时其他的模块如SPI或UART,也都是先初始化模块(SPI,UART),再初始化GPIOvoid HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle){GPIO_InitTypeDef GPIO_InitStruct = {0};if(i2cHandle->Instance==I2C1){/* USER CODE BEGIN I2C1_MspInit 0 */__HAL_RCC_I2C1_CLK_ENABLE(); //添加时钟使能命令/* USER CODE END I2C1_MspInit 0 */__HAL_RCC_GPIOB_CLK_ENABLE();/**I2C1 GPIO ConfigurationPB6 ------> I2C1_SCLPB7 ------> I2C1_SDA*/GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);/* I2C1 clock enable */__HAL_RCC_I2C1_CLK_ENABLE();/* I2C1 interrupt Init */HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);/* USER CODE BEGIN I2C1_MspInit 1 *//* USER CODE END I2C1_MspInit 1 */}}其他解决⽅式即初始化时,重新置位下I2C,再重新初始化,虽然说这种⽅法也可⾏,只是总感觉不太合适。
i2c通信的详细讲解
i2c通信的详细讲解I2C(Inter-IntegratedCircuit)通信协议是一种用于连接两个不同芯片的系统总线技术,也称为两级串行总线协议或者双总线协议。
I2C协议是由 Philips Semiconductors公司发明的,并被广泛应用于许多不同类型的处理器,特别是嵌入式系统中。
在本文中,我们将讨论I2C协议的原理,它的优点及其在实际应用中的使用方法。
I2C协议使用两根线,一根叫作“时钟”(SCL),另一根叫作“数据”(SDA)。
它们可以用来传输数据,也可以用来控制时钟(SCL)和数据(SDA)的发送和接收。
I2C协议的发明是为了实现多设备的联动,使多个设备之间的信息传输更加高效,性能也更加稳定。
I2C协议的优点:1.省电池电量:I2C协议会在不发送数据时减少时钟信号电平,这样可以有效降低电池电量的消耗;2.单:I2C协议只需要两根电线,可以满足大多数多芯片联动的应用需求;3.能稳定:I2C协议传输稳定,在多设备环境中信号传输时间间隔距离短;4.讯范围宽:I2C协议可以实现多芯片间的远近程度,并通过扩展的协议可以扩大通讯的范围;5.持动态分配:I2C协议允许动态的分配芯片通信地址,以及通过地址捕获技术加快芯片通讯的效率。
I2C协议在实际应用中主要用于在不同芯片之间进行信息传输,比如CPU和外设(例如继电器或者显示器)之间的通讯。
运行I2C协议的系统必须具备以下特性:1. 主从模式:I2C要求两个通讯芯片必须有一个主芯片(Master)来控制所有的通讯,而其他芯片则作为从芯片(Slave)来响应主芯片的指令;2.特率:I2C的数据传输不仅要考虑传输的速度,还需要考虑传输的波特率,这个波特率会影响传输的效率;3.址捕获:I2C需要使用地址捕获技术来增加通信的效率,借此可以最大限度的减少不必要的数据通讯量。
I2C协议的应用非常广泛,它可用于控制多种不同的设备,从简单的温度传感器到复杂的PLC控制器,从内存管理到模拟/数字信号处理,几乎都可以用到I2C协议。
I2C死锁原因及解决方法
I2C死锁原因及解决方法死锁总线表现为:SCL为高,SDA一直为低现象:单片机采用硬件i2c读取E2PROM,当单片机复位时,会有概率出现再无法与E2PROM通信,此时SCL为高,SDA一直为低原因:当单片机正在和E2PROM通信,如果主正好发生打算发第9个时钟,此时SCL为高,而从开始拉低SDA为低做准备(作为ACK信号),等待主SCL变低后,从再释放SDA 为高。
如果此时正好单片机复位,主SCL还没来得及变低,直接变成高电平,此时从还在等待SCL变低,所以一直拉低SDA;而主由于复位,发现SDA一直为低,也在等待从释放SDA为高。
因此主从都进入一个相互等待的死锁状态。
解决方法:最好的方法是采用模拟i2c. 但由于已经配置成硬件i2c,程序改为上电或复位改成发9个SCL时钟信号,使从好释放SDA。
最近发现单片机(硬件I2C实现)读取E2PROM时候,单片机复位可能会引起i2C死锁,表现为SCL为高,SDA一直为低,后发现是E2PROM从设备拉死i2c总线,从设备断电之后,SDA变高,上电后通信正常。
后来通过拉低SCL信号线,SDA就会自动变成高电平,i2c总线恢复。
后查看一篇文章,讲的不错,特摘录如下:在正常情况下,I2C总线协议能够保证总线正常的读写操作。
但是,当I2C主设备异常复位时(看门狗动作,板上电源异常导致复位芯片动作,手动按钮复位等等)有可能导致I2C总线死锁产生。
下面详细说明一下总线死锁产生的原因。
在I2C主设备进行读写操作的过程中.主设备在开始信号后控制SCL产生8个时钟脉冲,然后拉低SCL信号为低电平,在这个时候,从设备输出应答信号,将SDA信号拉为低电平。
如果这个时候主设备异常复位,SCL就会被释放为高电平。
此时,如果从设备没有复位,就会继续I2C的应答,将SDA一直拉为低电平,直到SCL变为低电平,才会结束应答信号。
而对于I2C主设备来说.复位后检测SCL和SDA信号,如果发现SDA信号为低电平,则会认为I2C总线被占用,会一直等待SCL和SDA信号变为高电平。
I2C时序分析和基础知识总结
• 接收器件收到一个完整的数据字节后,有可能需要完成 一些其它工作,如处理内部中断服务等,可能无法立刻接收 下一个字节,这时接收器件可以将SCL线拉成低电平,从而 使主机处于等待状态。直到接收器件准备好接收下一个字节 时,再释放SCL线使之为高电平,从而使数据传送可以继续 进行。
1、关于400pF负载电容
(1)波形畸变:电容越大,其滤波效果越明显。当这个电容过大时,很明显 部分通讯信号会被滤除,引起波形畸变,I2C将可能会产生误码,从而无法正常 通信。
(2)总线驱动能力:负载电容决定了总线在某一速率下的稳定性。当输出为 高时,电流通过上拉电阻对负载电容充电。上拉越大,电容越大,所需要的时间 就越长,如果超过了通信周期的10%,那么这个上升沿就太缓了,相应的建立时 间会受到影响。
当所有有关的器件数完了它们的低电平周期后,时钟线被释放并变成高 电平,之后器件时钟和SCL线的状态没有差别,而且所有器件会开始数它们 的高电平周期。首先完成高电平周期的器件会再次将SCL线拉低,这样产生 的同步SCL 时钟的低电平周期由低电平时钟周期最长的器件决定,而高电平 周期由高电平时钟周期最短的器件决定。
但如果从机要完成一些其他功能后才能接收或发送下一个完 整的数据字节,那么可以使时钟信号保持低电平迫使主机进入等 待状态。这也是唯一一个从机改变主机时钟的情况。
当从机准备好接受下一个字节时,释放时钟线SCL,数据传 输继续。
• (2)数据帧格式 • I2C总线上传送的数据信号是广义的,既包括地
址信号,又包括真正的数据信号。
• 在起始信号后必须传送一个从机的地址(7位), 第8位是数据的传送方向位(R/),用“0”表示主 机发送数据(T),“1”表示主机接收数据(R)。 每次数据传送总是由主机产生的终止信号结束。 但是,若主机希望继续占用总线进行新的数据传 送,则可以不产生终止信号,马上再次发出起始 信号对另一从机进行寻址。
再谈I2C,硬件问题汇总及死锁解决办法
再谈I2C,硬件问题汇总及死锁解决办法一般情况下, i2c 设备焊接没什么问题,按照设备手册一步步来,基本上就顺风顺水能够用起来。
如果这么一个简单的东西,有时候想要的结果死活不出来,反复的检查问题的原因,查询解决办法,核查设备的数据手册,甚至发送和接收的每一条命令与数据都知道是什么意思,仍然无法解决问题,那该怎么办呢?本文主要针对 i2c 设备,讲解如何解决 i2c 设备主机与从机直接无法正常数据交互的问题,侧重点是针对硬件设计不太合理、i2c 设备设计不标准导致总线故障的情况,并且通过分析现象,提出解决方案。
对于在设备初始化中,没有设置相应的寄存器或者发送命令,而导致的无法获取想要的数据情况,不作详细介绍。
1 i2c 基本用法i2c 总线是一种简单、双向二线制同步串行总线。
所有主机在 SCL 线上产生它们自己的时钟来传输总线上的报文,SDA 线传输每个字节必须为 8 位,每次传输可以发送的字节数量不受限制,每个字节后必须跟一个响应位。
在空闲状态时,SCL 与 SDA 均为高电平。
通常一些低功耗 i2c 设备,芯片引脚使用上拉输出即可满足与其正常数据交互,还有一些 i2c 设备,则需要在总线上外加一个上拉电阻,此时相应的 I/O 配置成开漏输出,其他的按照芯片手册进行标准配置。
2 硬件问题汇总2.1 无法正常拉高拉低引脚首先确定 SDA 与SCL 引脚能够被拉高、拉低,检测方式直接软件控制 I/O 口输出引脚低电平/高电平,测量引脚电压是否能够随着芯片引脚的设置输出相应的状态。
如果不能被拉低,检测虚焊、上拉电阻断开、i2c 设备是否正常、芯片引脚是否损坏等问题,确保能够正常被拉高或者拉低。
2.2 电气特性无法满足如果正常拉高、拉低的情况下,依然无法正常读取数据。
通常建议,根据负载电流更换小阻值的电阻。
如果需要详细知道原因,就具体查询 i2c 设备电气特性。
大多数 i2c 设备电气特性,大致下图所示通常这块内容在 i2c 设备电气特性这一块,主要讲解电平拉高拉低的最长时间、最短时间,以及处于高电平与电平的阈值与持续时间等等内容。
IIC通信详解
IIC通信详解(1)概述I2C(Inter-Integrated Circuit BUS) 集成电路总线,该总线由NXP(原PHILIPS)公司设计,多⽤于主控制器和从器件间的主从通信,在⼩数据量场合使⽤,传输距离短,任意时刻只能有⼀个主机等特性。
经常IIC和SPI接⼝被认为指定是⼀种硬件设备,但其实这样的说法是不尽准确的,严格的说他们都是⼈们所定义的软硬结合体,分为物理层(四线结构)和协议层(主机,从机,时钟极性,时钟相位)。
IIC,SPI的区别不仅在与物理层,IIC⽐SPI有着⼀套更为复杂的协议层定义。
下⾯来分别说明⼀下IIC的物理层和协议层。
(2)IIC的物理层a.只要求两条总线线路,⼀条是串⾏数据线SDA,⼀条是串⾏时钟线SCL。
(IIC是半双⼯,⽽不是全双⼯)。
b.每个连接到总线的器件都可以通过唯⼀的地址和其它器件通信,主机/从机⾓⾊和地址可配置,主机可以作为主机发送器和主机接收器。
c.IIC是真正的多主机总线,(⽽这个SPI在每次通信前都需要把主机定死,⽽IIC可以在通讯过程中,改变主机),如果两个或更多的主机同时请求总线,可以通过冲突检测和仲裁防⽌总线数据被破坏。
d.传输速率在标准模式下可以达到100kb/s,快速模式下可以达到400kb/s。
e.连接到总线的IC数量只是受到总线的最⼤负载电容400pf限制。
⼀个典型的IIC接⼝如下图(1)所⽰图(1)(3)IIC的协议层IIC的协议层才是掌握IIC的关键。
现在简单概括如下:a.数据的有效性在时钟的⾼电平周期内,SDA线上的数据必须保持稳定,数据线仅可以在时钟SCL为低电平时改变。
如图(2)所⽰:图(2)b.起始和结束条件起始条件:当SCL为⾼电平的时候,SDA线上由⾼到低的跳变被定义为起始条件,结束条件:当SCL为⾼电平的时候,SDA线上由低到⾼的跳变被定义为停⽌条件,要注意起始和终⽌信号都是由主机发出的,连接到I2C总线上的器件,若具有I2C总线的硬件接⼝,则很容易检测到起始和终⽌信号。
I2C读写EEPROM 问题总结
单字节延时25us,双字节(字)延时50us——测试通过
问题8:使用示波器观测SDA数据线上的波形时,发现每次应答信号之前都有一个毛刺(尖峰),是什么原因导致的(不影响数据的正常读写)
时钟频率也可设为200KHz,三个参数分别为9、20、20(CPU时钟频率为100MHz)(未测试)
关键点2:波形分析
问题:I2C模块是不是只有I2CCNT减到0才会发出停止信号
I2C模块是硬件的,当检测到发送完了就会发结束自动发信号,不需要人为干预
问题1:字节写操作正常,但是字节读函数出错
原因:写EEPROM是在七位器件地址后添加写标志,而读EEPROM需要在七位器件地址后添加写标志。
caseI2C_AAS_ISRC:break;//=7
"ESTOP0");//("RPT#5||NOP");
}//EnablefutureI2C(PIEGroup8)interrupts
|=PIEACK_GROUP8;
}
——by
//I2C(接收)
interruptvoidi2c_int1a_isr(void)//I2C-A
{
Uint16IntSource;//Readinterruptsource
IntSource=&0x07;
switch(IntSource)
{
caseI2C_NO_ISRC:break;//=0
caseI2C_ARB_ISRC:break;//=1
caseI2C_NACK_ISRC:break;//=2
关于IIC通讯在记忆电路中的竞争冒险问题分析
关于IIC通讯在记忆电路中的竞争冒险问题分析发表时间:2019-03-27T15:10:14.947Z 来源:《电力设备》2018年第30期作者:金德武[导读] 摘要:记忆电路设计过程中发现电路上电波形异常问题,本文通过对IIC通讯的概述、竞争冒险现象的简介以及记忆电路上电时序的详细分析,为电路设计提供可借鉴的改善建议,提早进行设计规避。
(珠海格力电器股份有限公司广东珠海519070)摘要:记忆电路设计过程中发现电路上电波形异常问题,本文通过对IIC通讯的概述、竞争冒险现象的简介以及记忆电路上电时序的详细分析,为电路设计提供可借鉴的改善建议,提早进行设计规避。
关键词:IIC通讯;竞争冒险;记忆电路引言IIC总线是一种高效、实用,可靠的双向二线制串行数据传输结构总线,与并行扩展总线相比,具有电路结构简单,引线较少等优点,目前广泛应用于记忆芯片与主控之间的通讯。
本文通过对记忆电路上电时刻出现的异常电平以及其出现竞争冒险现象的条件进行详细的分析总结,进一步增强IIC通讯在记忆电路上的可靠应用。
一、IIC总线简述1.1 IIC总线特征1)两线――串行数据SDA和串行时钟SCL线在连接到总线的器件间传递信息;2)SDA线上的数据必须在时钟SCL线高电平周期保持稳定,SDA线的高或低电平状态只有在SCL线的时钟信号是低电平时才能改变;3)每个连接到总线的器件都有一个唯一的地址识别,都可以作为一个发送器或接收器;4)器件在执行数据传输时可以被看作是主机或从机,主机是初始化总线的数据传输并产生允许传输的时钟信号的器件,此时任何被寻址的器件都被认为是从机。
1.2 数据传输方向数据传输大体分为主机读和主机写两个方向,具体执行过程如下:1)主机发送信息到从机(主机写)2)从机发送信息到主机(主机读)a.主机寻址从机 a.主机寻址从机b.主机发送数据到从机 b.从机发送信息到主机c.主机终止传输 c.主机终止传输1.3 数据传输格式主机与从机之间在IIC总线上进行一次数据传送,按IIC总线协议约定,传送的信息由启动信号、寻址字节、数据字节、应答信号以及停止位信号组成。
i2c上拉电阻400k通讯失真
i2c上拉电阻400k通讯失真1.引言1.1 概述I2C(Inter-Integrated Circuit)是一种常用于连接微控制器和外部设备的串行通信协议。
在I2C通信中,上拉电阻起到了至关重要的作用,它们被用于将总线拉高至高电平,以确保数据的正确传输。
然而,当通信速率较高时(比如400k),上拉电阻可能会导致通信失真的问题。
通信失真是指在数据传输过程中,由于上拉电阻的电阻值不适当或信号线上存在其他干扰源,导致传输的数据出现错误或丢失的现象。
当上拉电阻的电阻值较大或存在较长的通信线路时,信号的上升时间会变长,从而导致传输的数据变得模糊或不稳定。
在I2C通信中,传输的数据通过时钟和数据线来进行交互。
高电平信号(逻辑1)通过上拉电阻与电源电压(通常为3.3V或5V)连接,而低电平信号(逻辑0)则由总线上的设备拉低。
当数据被发送时,发送方将数据线拉低或保持高电平,接收方则通过读取数据线上的电平变化来获取数据。
然而,当上拉电阻的电阻值不适当时,总线上的信号可能会受到干扰,导致数据传输错误。
为了解决这个问题,可以采取一些措施来改善I2C通信的质量。
首先,确保上拉电阻的电阻值符合规格要求,通常为2.2kΩ至10kΩ之间。
其次,尽量减小通信线路的长度,以降低信号的衰减和干扰。
此外,可以考虑使用信号线过滤器或添加电源电压的稳压电路来提供稳定的电压。
总之,当使用I2C通信协议进行高速传输(如400k)时,上拉电阻可能会导致通信失真的问题。
通过合适选择上拉电阻的电阻值,并采取降低干扰和衰减的措施,可以改善通信质量,确保数据的正确传输。
1.2文章结构2. 正文在本节中,我们将探讨i2c上拉电阻在400k通讯中可能导致的失真问题。
我们将分析这个问题的产生原因,以及可能的解决方法。
通过深入研究这个话题,我们希望能够帮助读者更好地理解i2c通讯,并能够在设计中避免这样的失真问题。
首先,我们将回顾i2c通讯的基本原理,并介绍其工作方式和时序要求。
I2C读写EEPROM 问题总结
2017年6月30日星期五目的:利用TMS320F2801芯片上外设I2C(2线串口)读写EEPROM数据(24LC128)关键点1:24LC时钟频率400KHz,寄存器设置如下:I2caRegs.I2CPSC.all = 9; // Prescaler - need 7-12 Mhz on module clk I2caRegs.I2CCLKL = 10; // NOTE: must be non zeroI2caRegs.I2CCLKH = 5; // NOTE: must be non zero时钟频率也可设为200KHz,三个参数分别为9、20、20(CPU时钟频率为100MHz)(未测试)关键点2:波形分析问题:I2C模块是不是只有I2CCNT 减到0才会发出停止信号??I2C模块是硬件的,当检测到发送完了就会发结束自动发信号,不需要人为干预问题1:字节写操作正常,但是字节读函数出错原因:写EEPROM是在七位器件地址后添加写标志,而读EEPROM需要在七位器件地址后添加写标志。
关键点:读EEPROM数据需要发送两次命令。
第一次为写地址(此地址会被赋值给EEPROM 内的地址指针),因此需要添加写标志;第二次为读数据,将写标志改为读标志。
问题2:主机接收时,SDA数据线上有数据传输,且I2CDRR接收数据寄存器有数据更新,但寄存器显示不可读,即CPU认为一直没接收到数据,一直停在下面语句while关键点:初始化设置时采用的是FIFO接收方式,因此无效,应查询FIFO接收中断位while 方式查询位。
此位只有在非FIFO中断接收方式时才有效。
问题3:断续单字节读写正常,但是采用连续的单字节读写出错。
原因:EEPROM写过程的结束并不是I2C总线写结束就结束,实际上I2C总线的写入数据先被保存到了EEPROM内部的缓冲区,当遇到I2C结束条件后,EEPROM才启动内部写过程,这个过程才是保存数据的过程。
如何模拟和检测I2C通信错误
如何模拟和检测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-busspecification 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波形通过电平转换后异常
i2c波形通过电平转换后异常【导言】I2C(Inter-Integrated Circuit)是一种常用的串行通信协议,用于在电子设备之间传输数据。
作为一种主从式通信协议,I2C使用两条线(称为SDA和SCL)实现多个设备通过总线相互通信。
然而,在实际应用中,由于各种原因,如电压不稳定、线缆质量差、接触不良等,i2c波形可能会出现异常。
特别是在电平转换过程中,异常情况更容易发生。
本文将探讨i2c波形通过电平转换后的异常情况,并提供解决方案。
【正文】1. 异常现象及原因通过电平转换将I2C信号从5V转换为3.3V或其他不同的电压级别时,可能会出现以下异常情况:1.1 压摆率减慢由于电平转换电路可能引入额外的电容负载,I2C波形在上升沿和下降沿的压摆率可能会减慢。
这可能导致信号的传输速率降低,甚至使其无法达到预期的速率要求。
1.2 信号失真如果电平转换电路的响应时间不足或电压变化不平稳,可能会导致I2C 信号的失真。
信号失真可能表现为波形的不规则变形,甚至是部分波形丢失。
这种情况会导致通信错误,数据传输的准确性受到损害。
1.3 电源噪声电平转换电路引入的电容和电阻可能会引起电源噪声。
这些噪声可能会干扰I2C信号的传输,导致数据的错误或丢失。
1.4 传输延迟由于电平转换电路的存在,I2C信号的传输可能会有一定的延迟。
这种延迟可能会导致在实时应用中出现问题,如数据同步不匹配或信号超时。
2. 解决方案要解决通过电平转换后的I2C波形异常问题,可以采取以下措施:2.1 选择合适的电平转换器根据实际应用需求,选择性能良好的电平转换器。
电平转换器应具备快速响应、低电压降和低功耗的特点,以确保信号的准确转换和传输。
2.2 优化线路设计优化I2C线路布局和连接方式,尽量减少电流回路长度,避免浪费功耗和信号损耗。
使用优质的线缆和连接器,保证信号的可靠传输。
2.3 添加滤波电路在电平转换器的输入和输出端添加恰当的滤波电路,以抑制电源噪声和信号干扰。
i2c仿真课程设计
i2c仿真课程设计一、课程目标知识目标:1. 学生能理解I2C通讯协议的基本概念、原理及特点。
2. 学生能掌握I2C通讯协议的数据格式、传输过程及地址编码方式。
3. 学生能了解I2C通讯协议在嵌入式系统中的应用场景。
技能目标:1. 学生能运用所学知识,使用仿真软件进行I2C通讯协议的仿真实验。
2. 学生能通过编程实现基于I2C通讯协议的数据传输,具备一定的实际操作能力。
3. 学生能分析并解决I2C通讯过程中可能遇到的问题,提高问题解决能力。
情感态度价值观目标:1. 学生对I2C通讯协议产生兴趣,激发学习嵌入式系统及相关电子技术的热情。
2. 学生通过合作学习,培养团队协作精神和沟通能力。
3. 学生在学习过程中,树立正确的价值观,认识到科技进步对国家发展的重要性。
本课程针对高年级学生,结合学科特点,注重理论与实践相结合,培养学生的动手操作能力和问题解决能力。
课程目标具体、可衡量,便于学生和教师明确课程预期成果,为后续教学设计和评估提供依据。
二、教学内容1. I2C通讯协议基本概念:介绍I2C的起源、发展及其在嵌入式系统中的应用。
2. I2C通讯协议原理:讲解I2C的工作原理、数据传输方式及特点。
- 地址编码与寻址方式- 读写过程与数据格式- 速度模式与传输速率3. I2C通讯协议编程实践:- 使用仿真软件进行I2C通讯协议的仿真实验- 基于微控制器的I2C编程实现- I2C通讯过程问题分析与解决方法4. I2C通讯协议应用案例分析:分析典型应用场景,如传感器数据读取、EEPROM编程等。
5. 教学内容的安排与进度:- 第一节课:I2C通讯协议基本概念、原理及特点- 第二节课:I2C通讯协议编程实践(仿真实验)- 第三节课:I2C通讯协议编程实践(微控制器编程)- 第四节课:I2C通讯过程问题分析与解决方法- 第五节课:I2C通讯协议应用案例分析及讨论本教学内容依据课程目标,结合教材相关章节,系统性地安排教学大纲,确保教学内容科学、实用。
I2C通讯可能问题分析
I2C 总线比较简单,可能的问题主要出在时序上,一般设计者即使忽略也不太会有麻烦,但是有几个指标一定要认真考虑:1、总线驱动能力。
上拉电阻和负载电容决定了总线在某一速率下的稳定性。
当输出为高时,电流通过上拉电阻对负载电容充电。
上拉越大,电容越大,所需要的时间就越长,如果超过了通信周期的10%,那么这个上升沿就太缓了,相应的建立时间会受到影响,I2C规范的最大负载电容是400pF,快速模式下是100pF。
如果输出为低,电流通过上拉电阻被I2C master 器件吸取,(注意根据I2C规范,最小只有3毫安的吸取电流)那么这个吸取电流在上拉电阻上的压降就决定了输出低电平能达到的范围,如果不能达到0.3VDD以下,就会有误采样。
有人说加大上拉电阻是不妥当的,要具体分析吸取电流、负载电容、上拉电平和通信速率才能决定(普通模式和快速模式是不一样的)。
2。
总线空闲时间(bus free time)。
它的定义是从上一次通信的停止到下一次通信的开始的间隔时间。
通常一些I2C器件的要求是4.7微秒,也有要20微秒的,比如某种激光器内嵌的PROM。
对CPU来说,它往往是I2C的master 器件,由于运行速度很快,这个指标如果不注意的话就会达不到,导致I2C总线不响应。
另外要注意的是CPU内部的I2C停止时刻标志位置位和硬件总线上的I2C停止标志(clock 为高时数据从低到高的跳变)时刻往往是不一致的。
有的芯片有15-20个微秒的差别,所以要用示波器量出来为准。
3。
总线保持时间。
I2C的总线建立和保持与有的时序定义不一样。
建立时间是指从数据跳变沿到时钟上升沿的间隔;而保持时间是指从时钟下降沿到数据下一个跳变沿的间隔。
通常建立时间都能保证,保持时间一般为0纳秒。
但是有的器件做不到,一般为900纳秒;还有的虽然宣称是0纳秒,时间也要近1微秒(比如说TI的某器件)仅供参考!a.完全不能进行读写:(1) 通信协议不正确:有很多的I2C设备,并不支持所有的I2C协议,同时也不是一个比较标准的I2C设备;软件的通信时序不正确。
I2C总线的仲裁问题
I2C 总线的仲裁问题【问】有网友问关于I2C 总线的仲裁问题:The I2C-bus specification 的第13 页有这样的话:In other words, arbitration isnt allowed between:* A repeated START condition and a data bit* A STOP condition and a data bit* A repeated START condition and a STOP condition.Slaves are not involved in the arbitration procedure.我现在遇到了一个问题,假设说有两台主机A 和B 同时发送数据给C,但是A 发送一个字节的数据,B 发送两个字节的数据。
并且他们第一个字节的数据都相同。
即A 发送的是start+C 地址+字节1+stop,B 发送的数据是start+C 地址+字节1+字节2+stop.由于第一个字节相同所以在第一个字节传送完后仲裁过程没有结束。
这就遇到了规范上所讲到的一个停止位和一个数据位的情况,那幺是不应该发生仲裁的。
如果说B 发送的第二个字节的第一位是1,那幺线与后SCL 和SDA 线实际上就表示了stop 信号,如果不仲裁则B 继续发数据,而此前C 已经收到了一个停止信号。
C 停止了,那幺B 所发送的第二个字节的数据根本就没有成功。
有那位大虾可以帮我解释一下,应该怎幺办。
多谢了。
另外如果两个主机,一个发送停止条件,一个发送重复起始条件,如果不仲裁,总的效果就是产生一个低电平的数据,那幺从机就会把这个数据接收过去,但事实上这并不是两个主机期望发送的数据,I2C 总线的时序就乱了。
【答】I2C 规范的这段话的含义可以译为:也就是说,仲裁不能在下面情况之间进行:* 重复起始条件和数据位。
* 停止条件和数据位。
* 重复起始条件和停止条件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
I2C 总线比较简单,可能的问题主要出在时序上,一般设计者即使忽略也不太会有麻烦,但是有几个指标一定要认真考虑:
1、总线驱动能力。
上拉电阻和负载电容决定了总线在某一速率下的稳定性。
当输出为高时,电流通过上拉电阻对负载电容充电。
上拉越大,电容越大,所需要的时间就越长,如果超过了通信周期的10%,那么这个上升沿就太缓了,相应的建立时间会受到影响,I2C规范的最大负载电容是400pF,快速模式下是100pF。
如果输出为低,电流通过上拉电阻被I2C master 器件吸取,(注意根据I2C规范,最小只有3毫安的吸取电流)那么这个吸取电流在上拉电阻上的压降就决定了输出低电平能达到的范围,如果不能达到0.3VDD以下,就会有误采样。
有人说加大上拉电阻是不妥当的,要具体分析吸取电流、负载电容、上拉电平和通信速率才能决定(普通模式和快速模式是不一样的)。
2。
总线空闲时间(bus free time)。
它的定义是从上一次通信的停止到下一次通信的开始的间隔时间。
通常一些I2C器件的要求是4.7微秒,也有要20微秒的,比如某种激光器内嵌的PROM。
对CPU来说,它往往是I2C的master 器件,由于运行速度很快,这个指标如果不注意的话就会达不到,导致I2C总线不响应。
另外要注意的是CPU内部的I2C停止时刻标志位置位和硬件总线上的I2C停止标志(clock 为高时数据从低到高的跳变)时刻往往是不一致的。
有的芯片有15-20个微秒的差别,所以要用示波器量出来为准。
3。
总线保持时间。
I2C的总线建立和保持与有的时序定义不一样。
建立时间是指从数据跳变沿到时钟上升沿的间隔;而保持时间是指从时钟下降沿到数据下一个跳变沿的间隔。
通常建立时间都能保证,保持时间一般为0纳秒。
但是有的器件做不到,一般为900纳秒;还有的虽然宣称是0纳秒,时间也要近1微秒(比如说TI的某器件)
仅供参考!
a.完全不能进行读写:
(1) 通信协议不正确:有很多的I2C设备,并不支持所有的I2C协议,同时也不是一个比较标准的I2C设备;软件的通信时序不正确。
(2)I2C设备地址不正确:有很多的I2C设备的地址是可以通过硬件设定的;也有器件资
料提供的数据是错误的。
(3)I2C通信线上没有加上拉电阻:由于I2C的从设备的SDA,SCL的PIN是输出开漏的,所以必须加上拉电阻,同时根据I2C设备的数量上拉电阻的大小也会不同。
从1K~10K以上,当然不能太大,也不能太小。
(4)I2C设备损坏:有时我们会经常遇到问题时总是认为我们自己在软件上是不是有问题,是不是电路上没有焊接好,实际上都不是,而是器件是坏的。
b.读写失败,不能正确的读写某个地址的数据:。