iic起始信号scl高电平sda如何负跳变?scl高电平是不是不能操作sda么,那怎么给起始信号啊?

SDA和SCL解释_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
SDA和SCL解释
上传于||暂无简介
你可能喜欢IIC总路线与A/D、D/A转换 - 移动开发当前位置:& &&&IIC总路线与A/D、D/A转换IIC总路线与A/D、D/A转换&&网友分享于:&&浏览:0次IIC总线与A/D、D/A转换IIC总线
& & IIC总线用来连接整体电路,集成IIC总线的可以挂接到IIC总线上,它作为一种多向控制总线,在一个总线上可以挂接多个芯片,每一个芯片都可以作为实时数据传输的控制源,从而简化了信号传输总线接口。
1、结构图如下:
& & 其中有两根信号线,分别为双向的数据线SDA和时钟线SCL。器件的SDA和SCL与器件相应的SDA和SCL线相连接,SDA和SCL都利用了“线与”的关系起到相应的控制作用。在通信的过程中一个总线上一个时间点上只能有一个作为主控器,其他模块中一个作为被控器,实现之间相互的通信,其实好比一个人在对着一群人说话,但是由于主控器的命令是针对被控器一个的,为了能够唯一的指向被控器我们便规定每个模块都有自己唯一的一个地址与之对应,就如同每个人都有自己的一个唯一名字一样。主控器喊着某个模块,该模块就接受主控器的信号。
2、IIC总线的状态
(1)总线空闲:
& & 总线空闲状态是指:SCL = SDA = 1。当SCL和SDA都处于高电平的时候总线处于空闲,总线上没有进行信息传输。
(2)启动信号:
& & IIC总线的起始和终止信号的时序如下图所示:
& & 在IIC总线通信的过程中要先发起一个起始信号,相当于发出一个通知:我要传输信号了。发出过程为:1、SDA置高电平。2、SCL置高电平。3、SDA置低电平,产生一个负跳变。起始信号发出成功。
(3)终止信号:
& & 与启动信号类似,在发送完信号后要相应的终止IIC总线。对照上边时序图可知发出过程如下:1、SDA置低电平。2、SCL置高电平。3、SDA置高电平,从而产生一个正跳变。终止信号发出成功。
(4)总线封锁;
& & 连接在IIC总线上的任何一个器件将SCL拉低就可以使总线处于封锁状态,在总线封锁状态下,总线不能进行通信。
(5)数据位传送:
& & 既然IIC总线的作用是方便通信,便少不了数据的传送。如下是IIC总线的数据传送的时序图:
& & 从时序中我们可以看出在SDA传送的每一个数据的过程中都有一个SCL时钟脉冲与之对应;在数据传送过程中SCL为高电平期间不允许SDA电平发生变化,因为这是被控器正在读取相应数据,否则会读取错误的数据。在SCL时钟线变为低电平后SDA数据线数据可以发生变化。
(6)应答信号:
& & 为了保证通信的准确性,在主控器给被控器发送数据成功后被控器要相应的返回一个应答信号,以通知主控器数据传送成功与否。好比我给一个人说一句话后要求对法给我一个回复一样。有数据传送的时序图中可知在第九个脉冲时主控器要读取数据线数据,该数据就是被控器发出的应答位,低电平表示应答,高电平表示非应答信号。
A/D、D/A转换之——PCF8591
& & 上边已经说了关于IIC总线的知识,PCF8591就是IIC总线的接口,下边就结合IIC总线相关知识对PCF8591进行说明。
& & PCF8591是一个A/D、D/A转换的芯片。
1、管脚定义及接线图:
& & 引脚中AIN0~AIN3作为模拟输入(A/D转换);AOUT作为模拟输出(D/A转换);A0~A2为设备的地址(上边讲到的唯一地址);SCL和SDA为IIC总线的接口。
& & 芯片在于单片机进行通信的过程中要发送相应的地址字节和控制字节。
2、地址字节如下:
& & 其中A2、A1、A0是上边所提到的器件地址;R/W读写控制位。&
3、控制字节如下:
& & 其中D2、D1、D0用来控制四种模式的选择。D3、D4位用来控制输入的方式,不同的方式都有自己相应的特点。
4、通信协议及时序:
& & 下图为PCF8591在于单片机通信过程中对应的时序。
& & 需要声明的是:在进行模数转换的过程中如果我们选择四种模式中的第0个模式,对应在相应的控制字节中应为01即第1个模式,依次类推,选择第4个模式的转换对应在控制字节中的应为00即第0个模式,因为PCF8591的转换特点是:在PCF8591与单片机通信过程中,在一个字节传送的8个时钟周期中,PCF8591既向单片机发送数据,同时在进行着模数转换,它会在段时间内完成模数转换,将转换好的数据送入DAC寄存器中,而在上电复位后会在DAC中初始化一个0x80,在模数转化的第一次读写会将其读取。
& & 至此介绍了IIC总线和利用IIC总线工作的A/D、D/A转换模块PCF8591,希望对您有所帮助,也希望读者能给与批评和指正,不胜感激!
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 1234567891011 Copyright & &&版权所有IIC 总线通信
主机接收一个字节时,为什么要在一开始令SDA=1 - 我的提问 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
IIC 总线通信
主机接收一个字节时,为什么要在一开始令SDA=1
20:18:30  
20:31:14  
楼主能够说得更详细一点吗?
具体你是IIC通信双方是谁,同时应该严格安装通信双发给的同时时序进行编写
08:53:22  
有个起始条件的吧
13:28:26  
楼主能够说得更详细一点吗?
具体你是IIC通信双方是谁,同时应该严格安装通信双发给的同时时序进行编写
单片机STC90C51和EEPROM AT24C16通信
#include&i2c.h&
/*******************************************************************************
* 函 数 名& && && &: Delay1us()
* 函数功能& & & & & & & && & : 延时
* 输& & 入& && && &: 无
* 输& & 出& && && &: 无
*******************************************************************************/
void I2C_Delay10us()
{
& & & & uchar a,
& & & & for(b=1; b&0; b--)
& & & & {
& & & & & & & & for(a=2; a&0; a--);
& & & & }
}
/*******************************************************************************
* 函 数 名& && && &: I2C_Start()
* 函数功能& & & & & & & && & : 起始信号:在I2C_SCL时钟信号在高电平期间I2C_SDA信号产生一个下降沿
* 输& & 入& && && &: 无
* 输& & 出& && && &: 无
* 备& & 注& && && &: 起始之后I2C_SDA和I2C_SCL都为0
*******************************************************************************/
void I2C_Start()
{
& & & & I2C_SDA = 1;
& & & & I2C_Delay10us();
& & & & I2C_SCL = 1;
& & & & I2C_Delay10us();//建立时间是I2C_SDA保持时间&4.7us
& & & & I2C_SDA = 0;
& & & & I2C_Delay10us();//保持时间是&4us
& & & & I2C_SCL = 0;& & & & & & & & & & & &
& & & & I2C_Delay10us();& & & & & & & &
}
/*******************************************************************************
* 函 数 名& && && &&&: I2C_Stop()
* 函数功能& & & && && && & : 终止信号:在I2C_SCL时钟信号高电平期间I2C_SDA信号产生一个上升沿
* 输& & 入& && && &&&: 无
* 输& & 出& && && && & & &&&: 无
* 备& & 注& && && &&&: 结束之后保持I2C_SDA和I2C_SCL都为1;表示总线空闲
*******************************************************************************/
void I2C_Stop()
{
& & & & I2C_SDA = 0;
& & & & I2C_Delay10us();
& & & & I2C_SCL = 1;
& & & & I2C_Delay10us();//建立时间大于4.7us
& & & & I2C_SDA = 1;
& & & & I2C_Delay10us();& & & & & & & &
}
/*******************************************************************************
* 函 数 名& && && &&&: I2cSendByte(uchar num)
* 函数功能 & & & && && && & : 通过I2C发送一个字节。在I2C_SCL时钟信号高电平期间,
*& && && && && && &&&* 保持发送信号I2C_SDA保持稳定
* 输& & 入& && && &&&: num ,ack
* 输& & 出& && && && & & &&&: 0或1。发送成功返回1,发送失败返回0
* 备& & 注& && && &&&: 发送完一个字节I2C_SCL=0, 需要应答则应答设置为1,否则为0
*******************************************************************************/
uchar I2C_SendByte(uchar dat, uchar ack)
{
& & & & uchar a = 0,b = 0;//最大255,一个机器周期为1us,最大延时255us。
& & & & & & & & & & & &
& & & & for(a=0; a&8; a++)//要发送8位,从最高位开始
& & & & {
& & & & & & & & I2C_SDA = dat && 7;& & & &&&//起始信号之后I2C_SCL=0,所以可以直接改变I2C_SDA信号
& & & & & & & & dat = dat && 1;
& & & & & & & & I2C_Delay10us();
& & & & & & & & I2C_SCL = 1;
& & & & & & & & I2C_Delay10us();//建立时间&4.7us
& & & & & & & & I2C_SCL = 0;
& & & & & & & & I2C_Delay10us();//时间大于4us& & & & & & & &
& & & & I2C_SDA = 1;
& & & & I2C_Delay10us();
& & & & I2C_SCL = 1;
& & & & while(I2C_SDA && (ack == 1))//等待应答,也就是等待从设备把I2C_SDA拉低
& & & & {
& & & & & & & & b++;
& & & & & & & & if(b & 200)& & & &&&//如果超过200us没有应答发送失败,或者为非应答,表示接收结束
& & & & & & & & {
& & & & & & & & & & & & I2C_SCL = 0;
& & & & & & & & & & & & I2C_Delay10us();
& & & & & & & & & & & & return 0;
& & & & & & & & }
& & & & }
& & & & I2C_SCL = 0;
& & & & I2C_Delay10us();
& & & & return 1;& & & & & & & &
}
/*******************************************************************************
* 函 数 名& && && &&&: I2cReadByte()
* 函数功能& & & && &&&& & & &&&: 使用I2c读取一个字节
* 输& & 入& && && &&&: 无
* 输& & 出& && && && & & &&&: dat
* 备& & 注& && && &&&: 接收完一个字节I2C_SCL=0
*******************************************************************************/
uchar I2C_ReadByte()
{
& & & & uchar a = 0,dat = 0;
& & & & I2C_SDA = 1;& & & & & & & & & & & & //为什么?????????????????????????
& & & & I2C_Delay10us();
& & & & for(a=0; a&8; a++)//接收8个字节
& & & & {
& & & & & & & & I2C_SCL = 1;
& & & & & & & & I2C_Delay10us();
& & & & & & & & dat &&= 1;
& & & & & & & & dat |= I2C_SDA;
& & & & & & & & I2C_Delay10us();
& & & & & & & & I2C_SCL = 0;
& & & & & & & & I2C_Delay10us();
& & & & }
& & & && & & & & & & &
}
复制代码
13:30:02  
107行,SDA是数据线,为什么要人为的把他拉高
00:08:52  
好好看一下AT24C16的操作时序就知道为什么这么写了,从bus time那一章好好看一下就可以明白。不懂再留言
(444.98 KB, 下载次数: 6)
00:08 上传
点击文件名下载附件
下载积分: 积分 -1 分
13:46:33  
好好看一下AT24C16的操作时序就知道为什么这么写了,从bus time那一章好好看一下就可以明白。不懂再留言
*oD9Q1eO59BSo!/b/dFcBAAAAAAAA&ek=1&kp=1&pt=0&bo=nwVXAp8FVwIFACM!&sce=0-12-12&rf=viewer_311
单片机从AT24C16接收数据时序看SDA OUT没错吧
实在看不出来为什么接收时单片机必须把SDA拉高?
(我英语昨天刚过4级)
助理工程师
13:13:47  
空闲时SDA是高电平,先拉高是为了确保I2C总线空闲。然后产生启动条件开始读数据呗
Powered by9510人阅读
通信协议(6)
I2C总线信号时序总结
总线空闲状态&
  I2C总线总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。
  在时钟线SCL保持高电平期间,数据线SDA上的电平被拉低(即负跳变),定义为I2C总线总线的启动信号,它标志着一次数据传输的开始。启动信号是一种电平跳变时序信号,而不是一个电平信号。启动信号是由主控器主动建立的,在建立该信号之前I2C总线必须处于空闲状态。
重启动信号&
  在主控器控制总线期间完成了一次数据通信(发送或接收)之后,如果想继续占用总线再进行一次数据通信(发送或接收),而又不释放总线,就需要利用重启动Sr信号时序。重启动信号Sr既作为前一次数据传输的结束,又作为后一次数据传输的开始。利用重启动信号的优点是,在前后两次通信之间主控器不需要释放总线,这样就不会丢失总线的控制权,即不让其他主器件节点抢占总线。
重启动信号&
  在主控器控制总线期间完成了一次数据通信(发送或接收)之后,如果想继续占用总线再进行一次数据通信(发送或接收),而又不释放总线,就需要利用重启动Sr信号时序。重启动信号Sr既作为前一次数据传输的结束,又作为后一次数据传输的开始。利用重启动信号的优点是,在前后两次通信之间主控器不需要释放总线,这样就不会丢失总线的控制权,即不让其他主器件节点抢占总线。
  在时钟线SCL保持高电平期间,数据线SDA被释放,使得SDA返回高电平(即正跳变),称为I2C总线的停止信号,它标志着一次数据传输的终止。停止信号也是一种电平跳变时序信号,而不是一个电平信号,停止信号也是由主控器主动建立的,建立该信号之后,I2C总线将返回空闲状态。
&&&&&&&不是在数据有效性中规定在SDA只能在SCL的低电平的时候变化,为何STAR,STOP不一样?首先STAR和STOP不是数据,所以可以不遵守数据有效性中的规定,其它数据都遵守,而STAR和STOP“不遵守”导致STAR和STOP更容易被识别。这样不是不遵守而是更有优势。
&&&&起始和停止条件一般由主机产生,总线在起始条件后被认为处于忙的状态,在停止条件的某段时间后总线被认为再次处于空闲状态。
&&&&如果产生重复起始(Sr) 条件而不产生停止条件,总线会一直处于忙的状态。此时的起始条件(S)和重复起始(Sr) 条件在功能上是一样的。&
&&&&如果连接到总线的器件合并了必要的接口硬件,那么用它们检测起始和停止条件十分简便。但是没有这种接口的微控制器在每个时钟周期至少要采样SDA 线两次来判别有没有发生电平切换。
数据位传送&
  在I2C总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,在SDA上逐位地串行传送每一位数据。进行数据传送时,在SCL呈现高电平期间,SDA上的电平必须保持稳定,低电平为数据0,高电平为数据1。只有在SCL为低电平期间,才允许SDA上的电平改变状态。逻辑0的电平为低电压,而逻辑1的电平取决于器件本身的正电源电压VDD(当使用独立电源时)。数据位的传输是边沿触发。
  I2C总线上的所有数据都是以8位字节传送的,发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。 应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。 对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。 如果接收器是主控器,则在它收到最后一个字节后,发送一个NACK信号,以通知被控发送器结束数据发送,并释放SDA线,以便主控接收器发送一个停止信号P。
插入等待时间&&
  如果被控器需要延迟下一个数据字节开始传送的时间,则可以通过把时钟线SCL电平拉低并且保持,使主控器进入等待状态。一旦被控器释放时钟线,数据传输就得以继续下去,这样就使得被控器得到足够时间转移已经收到的数据字节,或者准备好即将发送的数据字节。带有CPU的被控器在对收到的地址字节做出应答之后,需要一定的时间去执行中断服务子程序,来分析或比较地址码,其间就把SCL线钳位在低电平上,直到处理妥当后才释放SCL线,进而使主控器继续后续数据字节的发送。
总线封锁状态&&
  在特殊情况下,如果需要禁止所有发生在I2C总线上的通信活动,封锁或关闭总线是一种可行途径,只要挂接于该总线上的任意一个器件将时钟线SCL锁定在低电平上即可。
总线竞争的仲裁&
&&&&&&&&总线上可能挂接有多个器件,有时会发生两个或多个主器件同时想占用总线的情况,这种情况叫做总线竞争。I2C总线具有多主控能力,可以对发生在SDA线上的总线竞争进行仲裁,其仲裁原则是这样的:当多个主器件同时想占用总线时,如果某个主器件发送高电平,而另一个主器件发送低电平,则发送电平与此时SDA总线电平不符的那个器件将自动关闭其输出级。总线竞争的仲裁是在两个层次上进行的。首先是地址位的比较,如果主器件寻址同一个从器件,则进入数据位的比较,从而确保了竞争仲裁的可靠性。由于是利用I2C总线上的信息进行仲裁,因此不会造成信息的丢失。
&&&&&&&&&为何识别到“0”将丢失仲裁呢?因为对于OD门,只能驱动到低电平,释放总线只能通过不驱动总线释放,停止驱动即产生“1”,但是发现总线还是“0”,这说明还有主机在跟自己竞争总线使用权,自己线驱动到“1”,确检测到“0”,那代表自己已经失去了仲裁。
主机只能在总线空闲的时侯启动传送。两个或多个主机可能在起始条件的最小持续时间tHD;STA&内产生一个起始条件,结果在总线上产生一个规定的起始条件。当SCL&线是高电平时,仲裁在SDA&线发生;这样,在其他主机发送低电平时,发送高电平的主机将断开它的数据输出级,因为总线上的电平与它自己的电平不相同。然后,进一步获得其的判定条件:仲裁可以持续多位。首先是比较地址位。如果每个主机都试图寻址同一的器件,仲裁会继续比较数据位(假设主机是发送器),或者比较响应位(假设主机是接收器)。I2C&总线的地址和数据信息由赢得仲裁的主机决定,在仲裁过程中不会丢失信息。丢失仲裁的主机可以产生时钟脉冲直到丢失仲裁的该字节末尾。在串行传输过程中时,一旦有重复的起始条件或停止条件发送到I2C&总线的时侯,仲裁过程仍在进行。如果可能产生这样的情况,有关的主机必须在帧格式相同位置发送这个重复起始条件或停止条件。&此外,如果主机也结合了从机功能,而且在寻址阶段丢失仲裁,它很可能就是赢得仲裁的主机在寻址的器件。那么,丢失仲裁的主机必须立即切换到它的从机模式。I2C&总线的控制只由地址或主机码以及竞争主机发送的数据决定,没有中央主机,总线也没有任何定制的优先权。
& & & & & & & & & & & & &
上图显示了两个主机的仲裁过程当然可能包含更多的内容由连接到总线的主机数量决定此时产生DATA1 的主机的内部数据电平与SDA 线的实际电平有一些差别如果关断数据输出这就意味着总线连接了一个高输出电平这不会影响由赢得仲裁的主机初始化的数据传输。
时钟信号的同步&
&&&&&&&&& 在I2C总线上传送信息时的时钟同步信号是由挂接在SCL线上的所有器件的逻辑“与”完成的。SCL线上由高电平到低电平的跳变将影响到这些器件,一旦某个器件的时钟信号下跳为低电平,将使SCL线一直保持低电平,使SCL线上的所有器件开始低电平期。此时,低电平周期短的器件的时钟由低至高的跳变并不能影响SCL线的状态,于是这些器件将进入高电平等待的状态。当所有器件的时钟信号都上跳为高电平时,低电平期结束,SCL线被释放返回高电平,即所有的器件都同时开始它们的高电平期。其后,第一个结束高电平期的器件又将SCL线拉成低电平。这样就在SCL线上产生一个同步时钟。可见,时钟低电平时间由时钟低电平期最长的器件确定,而时钟高电平时间由时钟高电平期最短的器件确定。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:145955次
积分:1389
积分:1389
排名:千里之外
原创:16篇
转载:41篇
(1)(1)(1)(1)(1)(1)(2)(2)(1)(1)(2)(2)(1)(1)(1)(1)(5)(4)(2)(2)(6)(4)(2)(2)(3)(1)(1)(6)需要确认注册邮箱后才能开通博客,
&&&IIC总线测试总结
6年会员勋章目前已领取。领取条件:?凡是注册时间六年以上的活跃用户即可领取该勋章。
llee的博客——终日乾乾,与时偕行
博主:????
谦虚谨慎的态度,海纳百川的心胸,积极务实的作风
文章(9)????
访问(18914)????
评论(31)????
投票(64)????
订阅本博??
博文列表查看方式:
需要确认注册邮箱后才能下载,
一、信号完整性测试简要介绍
? ? ? ? 前一段时间在做板卡信号完整性测试。
? ? ? ? 信号完整性测试主要是对信号质量进行测试,观察信号电平是否满足门限,有无过冲、振荡、回沟,时序是否满足要求等。
? ? ? ? 由于在产品需求层面,是不会将信号质量作为一项需求提出,因此很多时候在归档的测试报告中只会存在功能测试报告,而是将信号完整性测试报告作为内部公开的一份参考资料,但这并不意味着我们可以减少对信号完整性测试的重视程度,因为信号完整性测试往往能够发现很多潜在的风险,比如自己在以前的测试中就遇到过低电平门限是0.8V,而测得的信号低电平也接近0.8V,虽然在功能上的验证是正常的,但这就是一项风险项,很有可能在量产上市后,随着长期运行或者环境改变,而导致故障,后来通过调整串阻阻值,降低了信号低电平,规避了风险;还有调整FPGA时序改善信号时序余量等很多由信号完整性测试发现解决的潜在风险项。
? ? ? ? 另外,信号完整性测试很多时候还能提前规避掉很多电磁干扰问题,减少后期整改的工作。比如过陡的边沿或过大的过冲,有时会是辐射发射的来源;
? ? ? ? 最后,通过信号完整性测试,将所有信号都控制在器件的要求范围内,这也提高了器件的工作可靠性,保障其工作寿命。
? ? ? ? 综上所述,不仅不能还应该更加重视对信号完整性的测试。
? ? ? ? 在有些公司,信号完整性测试又称之为单元测试,这是因为信号完整性测试需要覆盖板卡上的每一个元器件。
? ? ? ? 对于信号完整性测试的方案制定方法。个人的理解,应该关注每个器件的输入端口,主要又分为信号电平(一般需测试高电平电压、低电平电压、上冲和下冲)和信号时序(一般需测试建立时间和保持时间),具体根据器件手册制定,信号测试点也应该选择最靠近器件输入端口处的位置;而对于器件的输出端口,是不需要关注的,因为这是器件自身特性所决定的。
二、IIC总线操作过程说明
? ? ? ? 对于IIC总线,自己以前很少用到,只对某块板卡上一片预留的INTERSIL的IIC接口光传感器写过驱动进行功能调试。这次是第一次认真对IIC总线进行了信号完整性测试。
? ? ? ?IIC总线由时钟线SCL和数据线SDA组成,设备连接到总线上的输出端为OD或OC输出,总线电平由外部上拉电阻决定。IIC总线速率分标准模式100Kbps,快速模式400Kbps和高速模式3.4Mbps。IIC总线上最多可以挂接400pf容性负载,挂接设备数量受此限制。IIC总线的运行由主机控制,被主机寻访的设备称为从机,每个接到IIC总线的设备都有一个唯一的地址,以便于主机寻访。
? ? ? ? 本次IIC信号完整性测试的其中一个器件为IIC接口的EEPROM,用作一个MCU的配置信息存储芯片,MCU每次上电后均会去读取配置,也可以执行对EEPROM的配置升级操作。对于EEPROM,读写过程都要测试。由于进度紧张,自己未经思考,首先在上电时,选择在MCU的IIC接口处测试EEPROM的读过程;然后再执行EEPROM配置升级命令,并在EEPROM的IIC接口处测试EEPROM的写过程。
? ? ? ? 但在测试过程中,却越来越感觉困惑,比如时序测试中有一项tSU:DAT参数,表示START信号的建立时间,但在测试写过程中,往往就很难捕捉到。随着测试的进行,困惑的地方越来越多,于是自己觉得该停一停,看看究竟测试方法有没有问题。
? ? ? ?稍稍冷静下,读了下器件手册,很快便发现了问题所在,自己还停留在以前测试的惯性思维中,认为读就是数据读出,而写就是数据写入,没有对IIC总线操作过程作一思考。
? ? ? ? 对于IIC写过程,一般而言有如下几种情况:
图1 IIC总线写操作过程
? ? ? ? 分为Byte Write和Page Write,Byte Write一次写入一个数据,Page Write一次可写入多个数据。在未进行写保护(WC为低时)才能进行写操作。
? ? ? ? 对于Byte Write,分为以下几个过程:
? ? ? ? 1、由主设备发出START信号;
? ? ? ? 2、由主设备发出DEV SEL信号,DEV SEL为从设备的识别码,一般由7位组成,高四位为每类IIC设备特有,低三位通过从设备外部引脚配置得到,如图2所示的E2、E1、E0三个引脚;
图2 IIC设备引脚图
? ? ? ? 3、主设备在发出DEV SEL信号后,需继续发出一位“读/写控制位(R/W)”,以表示接下来执行的是何种操作。此时该位应置为低(写操作);
? ? ? ? 4、从设备进行ACK应答,为低电平;
? ? ? ? 5、主设备发出Byte addr信号,即要将数据写入到从设备的单元地址,图中所示为16位地址带宽,主设备每发出8位地址,从设备进行一次ACK应答;
? ? ? ? 6、主设备写入8位数据,从设备应答,之后主设备发出STOP信号,结束此次写操作。
? ? ? ? 对于Page Write,其过程与Byte Write基本一致,仅仅是其在写入多个数据后,才由主设备控制发出STOP信号,结束写操作。
? ? ? ? 对于IIC读过程,一般而言有如下几种情况:
图3 IIC总线读操作过程
? ? ? ? 分为Current Address Read、Random Address Read、Sequential Current Read、Sequential Random Read。后两种读模式与前两种读模式的区别仅仅在于后两种是一次读出多个数据,因此不作累述。
? ? ? ? 对于Current Address Read,其操作过程为:
? ? ? ? 1、主设备发出START信号;
? ? ? ? 2、主设备发出DEV SEL信号,之后“R/W”位置1,表示接下来执行读操作;
? ? ? ? 3、从设备应答ACK;
? ? ? ? 4、从设备从当前指针所指单元发出数据;
? ? ? ? 5、主设备应答位,不应答从数据设备读入(NO ACK,高电平);
? ? ? ? 6、主设备发出STOP信号,结束此次读操作。
? ? ? ? Sequential Current Read一次可读出多个数据,每8位数据读出后,主设备进行一次ACK应答,最后一个数据,主设备不进行应答,应答位置高,之后发出STOP信号结束操作。
? ? ? ? 对于Random Address Read,其操作过程为:
? ? ? ?1、主设备发出START信号;
? ? ? ?2、主设备发出DEV SEL信号,之后“R/W”位置0,表示接下来仍执行写操作;
? ? ? ?3、从设备应答ACK;
? ? ? ?4、主设备发出Byte addr信号,从设备对每8位Byte addr进行一次应答ACK;
? ? ? ?5、主设备再次发出START信号;
? ? ? ?6、主设备再次发出DEV SEL信号,之后“R/W”位置1,表示接下来执行读操作;
? ? ? ?7、从设备应答ACK;
? ? ? ?8、从设备从之前写入的Byte addr地址中读出数据;
? ? ? ?9、主设备不进行应答,应答位置高(NO ACK);
? ? ? ?10、主设备发出STOP信号,结束此次操作。
三、IIC总线测试项目
? ? ? ? 1、时钟SCL信号质量测试
? ? ? ? 包括高电平电压、低电平电压、上冲、下冲、上升时间、下降时间、时钟频率、高电平脉宽、低电平脉宽。
? ? ? ?2、数据SDA信号质量测试
? ? ? ?包括高电平电压、低电平电压、上冲、下冲、上升时间、下降时间。
? ? ? ?3、写保护WC信号质量测试
? ? ? ?包括高电平电压、低电平电压、上冲、下冲。
? ? ? ?4、时序测试
? ? ? ?需要测试的时序如下图所示:
图4 IIC总线时序测试项目图
? ? ? ? (1) tHD:STA:START信号保持时间。IIC总线是在SCL信号为高电平时,SDA下降沿作为START信号的。该参数是指SDA信号由高变低后,SCL还需要维持高电平的最短时间,以确保START信号成功采样;
? ? ? ?(2) tHD:DAT:数据保持时间。IIC总线是在时钟SCL上升沿的时候对数据进行采样,SDA需在时钟上升沿来临前保持稳定;同时SDA需在时钟SCL为低电平时才能进行转换。该参数即是时钟SCL由高变低后,SDA还需要维持上一位数据电平的最短时间;
? ? ? ?(3) tSU:DAT:数据建立时间。指在SCL上升沿来临之前,SDA此次采样数据电平需要提前维持的最短时间,以确保此次数据的采样成功;
? ? ? ?(4) tSU:STA:START信号建立时间。指在SDA下降沿来临之前,SCL需要提前维持高电平的最短时间,以确保START信号的成功建立;
? ? ? ?(5) tSU:STO:STOP信号建立时间。IIC总线是在SCL信号为高电平时,SDA上升沿作为STOP信号的。该参数是指在SDA上升沿来临之前,SCL需要提前维持高电平的最短时间,以确保STOP信号的成功建立;
? ? ? ?(6) tBUF:总线释放最短时间。本次IIC操作结束和下次IIC操作开始需要对总线进行释放的最短时间;
? ? ? ?(7) tWLDL(tSU:WC):WC信号建立时间。WC信号需要在START信号发出前便完成建立。该参数即在START信号SDA下降沿来临之前,WC信号需要提前维持低电平以确保成功建立的最短时间;
? ? ? ?(8) tDHWH(tHD:WC):WC信号保持时间。WC信号需要在STOP信号发出后仍维持一段时间。该参数即在STOP信号SDA上升沿发出之后,WC信号仍需维持低电平以确保STOP操作成功完成的最短时间。
? ? ? ? 以上便是需要进行测试的项目。
四、IIC总线测试注意事项
? ? ? ? 自己之前在进行IIC总线测试时,由于急于完成,误认为读过程就是完全的数据读出。其实从IIC读操作过程就可以很明确的得知,读过程也包含着数据写入的阶段,比如START信号发出,DEV SEL信号发出和Byte addr信号的发出;
? ? ? ? 另一方面,由于START信号和STOP信号均是由主设备发出的,因此在测试IIC读操作时序的时候,仅需要测试tSU:DAT和tHD:DAT两项参数。而写操作才需要测试所有时序参数;
? ? ? ?最后在测试过程中,尤其是在读操作过程中,由于前面先要执行设备识别、地址写入等写操作,之后才会出现数据的读出,如果要用示波器去抓整个读操作过程,然后再放大局部去读取时序参数,可能会由于时基过大,局部分辨率不够,导致读取的时序参数并不准确。
? ? ? ?对于示波器,自己觉得比较重要的几个参数包括:带宽、采样速率和存储深度。
? ? ? ?带宽主要针对的是示波器支持的输入波形频率范围;
? ? ? ?采样速率主要是指示波器内部对波形的采样速率,根据香农采样定理,要想不失真地恢复模拟信号,采样频率应该不小于模拟信号频谱中最高频率的2倍。而实际上对于输入的波形,其最高频率取决于波形的边沿,可以用5~7倍信号频率来评估;
? ? ? ?存储深度主要指示波器存储采样点的多少。之所以说在IIC读操作测试中,为了获取整个操作过程中的波形,将时基调大,然后再局部放大,受限于存储深度,局部的波形可能就会失真,读取出来的参数会有较大误差。
? ? ? ? 因此在读测试时,可以采用脉宽采样,由于我们的测试中,用到的是Random Address Read和Sequential Random Read两种模式,在读出数据前,主设备还要再发出一次DEV SEL信号,tSU:STA便是在此时测量,但此时的SCL信号脉宽也不同于之前,如下图红色框中的波形所示:
图5 tSU:STA测试时对应的SCL脉冲波形
? ? ? ? 可以先将时基调大,初步测出红色框中SCL脉宽长度,然后用脉宽采样,划定波形脉宽范围,然后采出波形,这样得到的读数据波形便有足够的采样点,读取的参数值也更有参考价值。
? ? ? ? tSU:STA和tBUF也可按此方法采样测试。
? ? ? ? 通过这次测试,使自己更加明白,在做任何事情,不要急于着手,而是先想想看计划是怎样,采用什么样的方法,从总体上理清了头绪再着手,遇到细节问题再深究。
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
1.扫描左侧二维码
2.点击右上角的分享按钮
3.选择分享给朋友
??????有[ 6 ]名读者喜欢此文
阅读(3999)??
评论是对思考最好的总结…
你还可以输入1000字
--- 现有 1 个主题,共 1 页 ---
转发到我的博客
评论??的“IIC总线测试总结”
一、信号完整性测试简要介绍前一段时间在做板卡信号完整性测试。信号完整性测试主要是对信号质量进行测试,观察信号电平是否满足门限,有无过冲、振荡、回沟,时序是否满足要求等。由于在产品需求层面,是不会将信号质量作为一项需求提出,因此很多时候在归档的测试报告中只会存在功能测试报告,而是将信号完整性测试报告作...
你还可以输入30000字
同时评论给?llee
你还可以输入1000字
你还可以输入1000字
从事硬件设计开发工作,秉持谦虚谨慎、海纳百川和积极务实的态度,以数字电路、信号完整性和电磁兼容性为理论学习基础,电路原理设计、PCB设计和逻辑开发为技能目标,逐渐发散知识体系
zcz2004??18:55 03-03
zcz2004??13:51 09-21
zcz2004??09:37 09-08
Old Belvey??17:06 08-15
jinfangda??23:00 08-07
EDN助学—FPGA/CPLD学习小组
成员18962名创建者:
-- Use of this website is subject to its terms of use.
京ICP备号-4 |
京公网安备37 |
新版社区已上线,旧版论坛、博客将停用
1、为防数据丢失,旧版论坛、博客不再接受发帖;
2、老用户只需重设密码,即可直接登录新平台;
3、新版博客将于8月底完美归来,敬请期待;
4、全新论坛、问答,体验升级、手机阅读更方便。}

我要回帖

更多关于 iic scl时钟输出频率 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信