7I2C协议实验报告.docx
《7I2C协议实验报告.docx》由会员分享,可在线阅读,更多相关《7I2C协议实验报告.docx(10页珍藏版)》请在冰豆网上搜索。
7I2C协议实验报告
协议
1、实验目的
1、熟悉
协议;
2、掌握
接口EEPROM的读写方法;
3、掌握利用I/O来实现
信令。
二、实验内容
实验提供I2C协议库(光盘/I2C软件包)。
将A2区的P16、P17连接D5区的SCL、SDA,短接JP1跳线。
1、写入24WC02的80H号字节地址,并读取进行验证;
2、连续写入24WC02的80H号字节地址开始一页的内容,并读取进行验证。
三、protel电原理图
四、程序流程图
1、单字节2、页
五、汇编程序
1、单字节
;平台定义变量
ACKBIT10H;应答标志位
SLADATA51H;器件从地址
SUBADATA52H;器件子地址
NUMBYTEDATA10H;读写的字节数
;使用前定义常量
SDAEQUP1.7;I2C总线定义
SCLEQUP1.6
MTDEQU30H;发送数据缓冲区首址(缓冲区30H3FH)
MRDEQU40H;接收数据缓冲区首址缓冲区404FH
;定义器件地址
PCF8574EQU40H
SAA1064EQU70H
CSI24WCXXEQU0A0H
ORG0000H
AJMPMAIN
ORG0080H
MAIN:
MOVSLA,#0A0H
CLRACK
MOVSUBA,#80H
MOVNUMBYTE,#01H
MOVA,#00H
MOVP3,A
MOVA,#55H
PUSHACC
LCALLSTART;起动总线
MOVA,SLA
LCALLWRBYTE;发送器件从地址
LCALLCACK
JNBACK,RE1;无应答则跳转
MOVA,SUBA
LCALLWRBYTE;发送器件子地址
LCALLCACK
JNBACK,RE1;无应答则跳转
POPACC;写数据
LCALLWRBYTE
LCALLCACK
JNBACK,RE11
LCALLSTOP
SJMPMAIN2
RE1:
POPACC
LCALLSTOP
SJMPMAIN
RE11:
LCALLSTOP
SJMPMAIN
MAIN2:
LCALLSTART;起动总线
MOVA,SLA
LCALLWRBYTE;发送器件从地址
LCALLCACK
JNBACK,RE2;无应答则跳转
MOVA,SUBA
LCALLWRBYTE;发送器件子地址
LCALLCACK
JNBACK,RE2;无应答则跳转
LCALLSTART
MOVA,SLA;发送器件从地址
INCA
LCALLWRBYTE
LCALLCACK
JNBACK,RE2
LCALLRDBYTE;进行读字节操作
LCALLMNACK;发送非应信号
LCALLSTOP
SJMPMAIN3
RE2:
LCALLSTOP
SJMPMAIN2
MAIN3:
MOVP3,A
SJMP$
$INCLUDE(VI2C_ASM.ASM);包含VIIC软件包
;
END
2、页
;平台定义变量
ACKBIT20H;应答标志位
SLADATA50H;器件从地址
SUBADATA51H;器件子地址
NUMBYTEDATA52H;读写的字节数
;使用前定义常量
SDAEQUP1.7;I2C总线定义
SCLEQUP1.6
MTDEQU30H;发送数据缓冲区首址缓冲区30H~3FH
MRDEQU40H;接收数据缓冲区首址缓冲区40H~4FH
ORG8000H;采用软件调试法
AJMPMAIN
ORG8080H
MAIN:
MOVR4,#0F0H;延时等待其它芯片复位好
DJNZR4,$
MOVSP,#60H;设置堆栈指针
MOV3FH,#00H;给MTD赋值
MOV30H,#01H
MOV31H,#02H
MOV32H,#03H
MOV33H,#04H
MOV34H,#05H
MOV35H,#05H
MOV36H,#07H
MOV37H,#08H
MOV38H,#09H
MOV39H,#0AH
MOV3AH,#0BH
MOV3BH,#0CH
MOV3CH,#0DH
MOV3DH,#0EH
MOV3EH,#0FH
MOVSLA,#0A0H;设置写的从地址
MOVSUBA,#80H;设置子地址
MOVNUMBYTE,#10H;设置字节数,这里因为读写一页字节,所以为10H(16)
LCALLIWRNBYTE;调用写EEPROM程序
MOVA,#01H
LCALLIRDNBYTE;调用读EEPROM程序
MOVA,#33H;
$INCLUDE(VI2C_ASM.ASM);I2C软件包
;
END
6、实验记录
1、第一个实验程序运行完成后,打开“memorywindow”,在查询栏输入所要查看的地址空间。
输入发送缓冲区首地址“D:
30H”,该地址处显示的数据为“55”;输入接收缓冲区首地址“D:
40H”,该地址处显示的数据为“55”。
2、第二个实验程序运行完成后,同样使用“memorywindow”查看发送、接收缓冲区内的数据。
D:
30H~D:
3FH中储存的数据为“000102...0E0F”;D:
40H~D:
4FH中储存的数据同样是“000102...0E0F”。
7、实验分析
1、
协议的基本工作原理如下:
以启动信号START来掌管总线,以停止信号STOP来释放总线;
每次通讯以START开始,以STOP结束;
启动信号START后紧接着发送一个地址字节,其中7位为被控器件的地址码,一位为读/写控制位R/W,R/W位为0表示由主控向被控器件写数据,R/W为1表示由主控向被控器件读数据;
当被控器件检测到收到的地址与自己的地址相同时,在第9个时钟期间反馈应答信号
每个数据字节在传送时都是高位(MSB)在前。
协议通讯过程分为写通讯和读通讯两部分,其过程如下。
写通讯过程:
(1)主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线;
(2)发送一个地址字节(包括7位地址码和一位R/W);
(3)当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号(ACK);
(4)主控收到ACK后开始发送第一个数据字节;
(5)被控器收到数据字节后发送一个ACK表示继续传送数据,发送NACK表示传送数据结束;
(6)主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线。
读通讯过程:
(1)主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线;
(2)发送一个地址字节(包括7位地址码和一位R/W);
(3)当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号(ACK);
(4)主控收到ACK后释放数据总线,开始接收第一个数据字节;
(5)主控收到数据后发送ACK表示继续传送数据,发送NACK表示传送数据结束;
(6)主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线。
下图所示为一次完整的通信过程的时序:
图中,SCL线上1~7位为7位地址码,第8位为读写位R\~D,第9位为ACK应答位,紧接着的为第一个数据字节,然后是一位应答位,后面继续第2个数据字节。
如图所示,主控器在检测到总线空闲(数据线SDA和时钟线SCL同时处于高电平状态)时,首先发送一个启动信号S(在时钟线SCL保持高电平期间,数据线SDA上电平被拉低),它标志着一次数据传输的开始。
之后主控器发送一个地址字节包括7位地址码和一个读写位。
被控器收到地址字节后反馈一个应答信号ACK=0,主控器接收到ACK后开始发送第一个数据字节,被控器接收到第一个数据字节后,由反馈一个应答信号ACK=0。
主控器收到应答信号后开始传送第二个数据字节。
依次循环,主控器发送完数据后,就发送一个停止信号P(SCL保持高电平期间,SDA被释放,返回高电平),并释放总线,使得总线返回空闲状态。
在通信过程应注意以下6点:
(1)进行数据传送时,在SCL为高电平期间,SDA线上电平必须保持稳定,只有SCL为低时,才允许SDA线上电平改变状态。
并且每个字节传送时都是高位在前。
(2)对于应答信号,ACK=0时为有效应答位,说明接收器已经成功接收到该字节,若为1则说明接受不成功。
(3)如果被控器需要延迟下一个下一个数据字节开始传送的时间,可以通过把SCL电平拉低并保持来强制主控器进入等待状态。
(4)主控器完成一次通信后还想继续占用总线在进行一次通信,而又不释放总线,就要利用重启动信号Sr。
它既作为前一次数据传输的结束,又作为后一次传输的开始。
(5)总线冲突时,按“低电平优先”的仲裁原则,把总线判给在数据线上先发送低电平的主器件。
(6)在特殊情况下,若需禁止所有发生在I2C总线上的通信,可采用封锁或关闭总线,具体操作为挂接在总线上的任一器件将SCL锁定在低电平即可。
2、实验中需要使用到I2C软件库,库中包含了CAT24WC02读写数据的基本命令。
汇编语言中调用软件库的指令为“include(文件名)”命令,该指令一般放在程序末尾。
实验中所需调用的函数库文件名为“VI2C_ASM.ASM”,将其从光盘中复制到工程所在文件夹中,即可使用上述指令调用软件包。
完整的调用命令如下:
$INCLUDE(VI2C_ASM.ASM);包含I2C模拟软件包
常用的四个命令如下:
IRDBYTE(无子地址)读单字节数据(现行地址读)
IWRBYTE(无子地址)写单字节数据(现行地址写)
IRDNBYTE(有子地址)读N字节数据(随机地址读)
IWRNBYTE(有子地址)写N字节数据(随要地址写)
在本实验中,由于需要页读/写,故采用IRDNBYTE与IWRNBYTE子程序。
代码如下:
LCALLIWRNBYTE;调写EEPROM子程序(随机地址写)
及:
LCALLIRDNBYTE;调写EEPROM子程序(随机地址读)
这两个命令需要使用NUMBYTE来控制读/写的字节数。
第一个实验需要发送一个字节,即:
MOVNUMBYTE,#01H;设置待发字节数为1
第二个实验要发送一页数据,即16位:
MOVNUMBYTE,#10H;设置待发字节数为16
3、实验一中读/写的一位数据为55H,直接送入寄存器A:
MOVA,#55H;将所要发送的数据放入发送缓冲区
实验二中需要读/写一页16位数据,采用直接存入方法:
MOV3FH,#00H;给MTD赋值
MOV30H,#01H
MOV31H,#02H
MOV32H,#03H
MOV33H,#04H
MOV34H,#05H
MOV35H,#05H
MOV36H,#07H
MOV37H,#08H
MOV38H,#09H
MOV39H,#0AH
MOV3AH,#0BH
MOV3BH,#0CH
MOV3CH,#0DH
MOV3DH,#0EH
MOV3EH,#0FH
显然,这是一种繁琐的方法,改进的方法是采用循环递减的方式将10H~00H存入发送缓冲区MTD,代码如下: