实验名称I2C总线实验.docx
- 文档编号:11971236
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:17
- 大小:2.71MB
实验名称I2C总线实验.docx
《实验名称I2C总线实验.docx》由会员分享,可在线阅读,更多相关《实验名称I2C总线实验.docx(17页珍藏版)》请在冰豆网上搜索。
实验名称I2C总线实验
实验名称:
I2C总线实验
实验目的:
加深对I2C总线的理解,熟悉I2C器件的使用,提供用户实际开发的能力。
实验原理:
一、I2C协议:
1、I2C串行总线:
两根串行线:
数据线SDA,时钟线SCL
2、典型传输格式
(1)每一次传输由START开始
(2)数据位是从高位(MSB)传起
(3)每个Byte接收方有ACK(在第9个Clock拉低SDA)
(4)结束传输有STOP标记
开始与结束信号:
START:
SCL维持高,SDA从高到低
STOP:
SCL维持高,SDA从低到高
二、24WC02EEPROM
1、256个字节,每个字节拥有内部的字节地址(ByteAddress)
A0-A2:
地址输入信号,用以设定芯片的SlaveAddress。
WP:
接高电平,则芯片处于写保护状态(只读);接低电平或悬空,芯片处于可读写状态。
2、24WC02的从地址:
R/-W:
控制接下来传输数据的方向。
R/-W=0为写方向,数据主器件从器件;
R/-W=1为读方向,数据从器件主器件
3、24WC02的写操作
单字节写操作时序:
页写时序(P=15):
4、24WC02的读操作
指定地址读时序:
(1)首先要对所选从器件地址和字节地址进行伪写操作(从器件地址R/-W=0)
(2)然后,重新发START和从器件地址
(3)得到ACK后,可以读取数据
立即读时序:
(1)首先要对所选从器件地址读操作(R/-W=1)
(2)从器件回应后送出(上次读取的字节地址+1)单元的内容。
连续读时序(顺序字节):
(1)可由指定地址读和立即读方式启动连续读模式。
(2)在从器件发送完一个8位字节数据后,主器件产生一个ACK来告知从器件提供更多的数据。
对应每个主器件的ACK,从器件将发送一个8位数据字节。
(3)当主器件不发送应答信号而发送停止位时结束此操作
实验内容:
实验提供I2C协议库。
将A2区的P16、P17连接D5区的SCL、SDA,短接JP1跳线。
1、写入24WC02的80H号字节地址,并读取进行验证。
2、连续写入24WC02的80H号字节地址开始一页的内容,并读取进行验证。
电路图:
2、连续写入24WC02的80H号字节地址开始一页的内容,并读取进行验证
流程图:
(修改后添加了读写程序的流程图)
1、写入24WC02的80H号字节地址,
并读取进行验证
写流程图:
读流程图:
代码及注释:
1、写入24WC02的80H号字节地址,并读取进行验证
ACKBIT10H;定义位变量ACK地址
SLADATA50H;定义器件从地址
SUBADATA51H;定义器件子地址
NUMBYTEDATA52H;定义读/写的字节数地址
SCLEQUP1.6;时钟线SCL连P1.6口
SDAEQUP1.7;数据线SDA连P1.7口
MTDEQU30H;定义发送数据缓冲区首址
MRDEQU40H;定义接收数据缓冲区首址
ORG8000H;硬件仿真程序
LJMPMAIN
ORG8100H;硬件仿真程序
MAIN:
MOVSP,#60H;给堆栈指针赋初值
MOVSLA,#0A0H;器件从地址,写操作
MOVSUBA,#80H;写入数据的子地址
MOVMTD,#25H;写入数据25H
MOVNUMBYTE,#01H;写入1个字节
LCALLIWRNBYTE;将数据写入80H号字节地址中
LCALLDELAY;调用延时程序
LCALLIRDNBYTE;将数据从80H号字节地址中读出
SJMPMAIN
DELAY:
;10ms延时子程序
MOVR4,#50
DELAY1:
MOVR5,#100
DELAY2:
DJNZR5,$
DJNZR4,DELAY1
$INCLUDE(VI2C_ASM.ASM);包含VIIC软件包
;
END
2、连续写入24WC02的80H号字节地址开始一页的内容,并读取进行验证
ACKBIT10H;定义位变量ACK地址
SLADATA50H;定义器件从地址
SUBADATA51H;定义器件子地址
NUMBYTEDATA52H;定义读/写的字节数地址
SCLEQUP1.6;时钟线SCL连P1.6口
SDAEQUP1.7;数据线SDA连P1.7口
MTDEQU30H;定义发送数据缓冲区首址
MRDEQU40H;定义接收数据缓冲区首址
ORG8000H;硬件仿真程序
LJMPMAIN
ORG8100H;硬件仿真程序
MAIN:
MOVR4,#0F0H
DJNZR4,$
MOVSP,#60H;给堆栈指针赋初值
MOVR1,#MTD;发送数据的第一个字节
MOVR5,#10H;总共发送16个字节
MOVA,#41H;发送数据为16字节的41H
SEND:
;对发送内容初始化
MOV@R1,A
INCR1;地址加1
DJNZR5,SEND;循环16次
MOVSLA,#0A0H;器件从地址,写操作
MOVSUBA,#80H;写入数据的子地址
MOVNUMBYTE,#10H;写入16个字节
LCALLIWRNBYTE;写数据
LCALLDELAY;延时
LCALLIRDNBYTE;读数据
SJMP$
DELAY:
;延时10ms子程序
MOVR4,#50
DELAY1:
MOVR5,#100
DELAY2:
DJNZR5,$
DJNZR4,DELAY1
$INCLUDE(VI2C_ASM.ASM);包含VIIC软件包
;
END
实验结果及分析:
1、单字节读写,将程序代码设置为循环读写,硬仿时,在memorywindow窗口的I:
30H(发送数据缓冲区首址)和I:
40H(接收数据缓冲区首址)中可看到读写的数据25H。
然后将示波器探头放置在SCL口和SDA口,采用双踪模式,观察SCL和SDA处的信号,完整的读写波形见下图(以下为示波器上的波形,手画的读写波形见预习报告最后一页)。
实验中测得,SCL信号的低电平为0V,高电平为5.2V。
SDA信号的低电平为0V,高电平为5.4V。
一个完整的读操作周期为744us,一个完整的写操作周期为564us,可看出读操作周期比写操作周期长,这是因为读操作前面还有一个伪写操作,较为复杂。
具体的波形分析如下所示:
(1)、读操作中的伪写操作:
如上图所示,CH1通道的波形为SCL信号,CH2通道的波形为SDA信号。
可看到,当SCL信号为高电平时,SDA产生产生一个由高到低的跳变,即start信号。
然后发送从器件的七位地址码和写方向位,由于A0、A1、A2都接低电平,所以地址的前七位为1010000,且为伪写操作,所以器件的第8位为“0”,故SDA发送的从器件地址为10100000(A0H)。
从器件收到后发出ACK应答信号。
从上图可看到,ACK信号先是一个毛刺,然后在一个周期中前半段是低电平后半段是高电平。
从理论上说ACK信号应该是一个周期的低电平,但我们实际观察中先看到一个毛刺信号,这可能是因为单片机本身在接收到ACK信号之前会处于高电平状态,若从器件发送低电平信号则会将其拉低,这之间有一个极短的延时,所以会产生一个毛刺信号。
而ACK信号前半段为低电平,后半段为高电平,这是因为EEPROM的ACK信号只维持半个周期,在后半个周期EEPROM并不控制SDA的电平。
而EEPROM采用CMOS电路,总线接口为开漏或开集电极输出,故SDA上接有上拉电阻到VCC。
因此在EEPROM不控制SDA的时候,SDA口就将保持高电平状态。
当主机收到应答信号ACK后,开始发送待读单元的起始地址,在实验中待读单元的起始地址为80H,所以发送的数据为10000000,然后从地址发送应答信号ACK,可看到ACK信号也是先出现一个毛刺,然后前半段为低电平后半段为高电平。
在上面的波形图中可看到第一个ACK信号后有一个较宽的脉冲,这是因为ACK信号后半周期的高电平和起始地址信号10000000的第一个高电平脉冲连在一起形成了一个宽脉冲,实验中测得此宽脉冲约为32us,而正常的高电平脉冲为20us,从此也可看出ACK信号是一个前半周期为低电平后半周期为高电平的信号。
(2)、读操作中的读操作
在伪写操作之后就是真正的读操作。
首先在SCL为高电平时,SDA发生一个由高到低的跳变,产生一个start信号,然后单片机发送器件的7位地址码,仍为1010000,由于此时进行的为读操作,所以第8位写方向位为“1”,故从地址为10100001(A1H)。
然后从器件产生一个应答信号ACK,此ACK信号为一个低电平,而不是前半段为低电平后半段为高电平(不太清楚为什么此个ACK信号没有正跳变)。
单片机接受到应答信号后开始读字节,我设置的数据为25H,由于数据是先发高位再发低位,所以发送的数据为00100101。
当最后一个字节数据读完后,主机返回“非确认”信号,即ACK=1。
由于发送的最后一位数据为1和“非确认”信号ACK=1连在一起,故此处也产生了一个较宽的脉冲。
然后在SCL为高电平时,SDA发生一个由低到高的跳变,即产生stop信号。
(3)、写操作
以上两张图即为写操作的时序图。
同样在SCL为高电平的时候,SDA产生一个从高到低的跳变,即start信号,然后发送从地址,由于是写操作,写方向位为“0”,从地址为10100000(A0H),然后从器件发送应答信号ACK。
单片机收到应答信号后,就开始待读单元的起始地址80H,即10000000,然后从器件发送应答信号ACK。
单片机收到应答信号后发送待写的数据25H,因为数据先发高位再发低位,故为10100001,在收到写数据后,从器件再次发送应答信号ACK。
最后,在SCL为高电平时,SDA产生一个从低到高的跳变,即为stop信号。
至此完成了一个完整的读写信号周期。
在写信号周期中应答信号ACK也是前半段为低电平后半段为高电平。
2、多字节读写,硬仿时,在memorywindow窗口观察I:
30H(发送数据缓冲区首址)和I:
40H(接收数据缓冲区首址)开始的16个地址单元的内容,可看到这16个地址单元中的内容均为41H。
用示波器观察时,除了数据部分从一字节数据变成了多字节数据,每一个字节数据发送完毕后,从器件都会产生ACK信号,其他部分的波形和单字节读写时的波形一样。
由于在向EEPROM写数据之后不能立即读取数据,所以为了使EEPROM正常工作,在向EEPROM写入数据后需加入一段延时再读取数据。
延时时间一般设为10ms。
延时程序如下所示:
DELAY:
;延时10ms子程序
MOVR4,#50
DELAY1:
MOVR5,#100
DELAY2:
DJNZR5,$
DJNZR4,DELAY1
查表可知执行MOV指令需一个机器周期,执行DJNZ指令需两个机器周期,所以该延时程序一共有1+50*(1+100*2+2)=10151个机器周期,总延时时间为10151*12/11.0592=11.014ms。
一开始用示波器观测波形时并不能看到波形,因为在预习时将代码写为执行完一个完整的读写操作就结束,而示波器需要有连续不断的输入才能呈现出波形。
故实验中将代码修改为循环读写,即在主程序代码的最后添加SJMPMAIN指令。
所以在写操作结束后将延时10ms再开始读操作,而读操作结束后很快就能开始写操作。
从示波器观测到的波形也可看出,在读操作结束后和写操作开始前只有持续时间较小的一段高电平,而在写操作结束后和下一个读操作开始前有持续时间很长的一段高电平。
这两段高电平是单片机和从器件之间没有任何通讯时的空闲状态。
因为在没有信号对从器件进行控制时,SDA口将被所接的上拉电阻拉至高电平,故空闲状态都将持续为高电平。
以此同时SCL信号也为高电平,因为SDA产生start信号需要SCL在高电平时产生负跳变,所以在空闲状态期间SCL也将一直保持高电平等待起始信号的到来。
在示波器观测到的波形中也可看到,在读操作之前和写操作之后SCL都为高电平,且在读操作完成之后和写操作开始之前的一小段时间内,SCL也是一段高电平,其余时间才为周期脉冲信号。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 名称 I2C 总线