资源预览内容
第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
亲,该文档总共8页全部预览完了,如果喜欢就下载吧!
资源描述
协议 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、单字节;平台定义变量ACK BIT 10H ;应答标志位SLA DATA 51H ;器件从地址SUBA DATA 52H ;器件子地址NUMBYTE DATA 10H ;读写的字节数;使用前定义常量SDA EQU P1.7; I2C 总线定义SCL EQU P1.6MTD EQU 30H ;发送数据缓冲区首址 (缓冲区30H 3FH)MRD EQU 40H ;接收数据缓冲区首址缓冲区 40 4FH;定义器件地址PCF8574 EQU 40HSAA1064 EQU 70HCSI24WCXX EQU 0A0HORG 0000HAJMP MAINORG 0080HMAIN: MOV SLA, #0A0HCLR ACKMOV SUBA, #80HMOV NUMBYTE, #01HMOV A, #00HMOV P3, AMOV A, #55HPUSH ACCLCALL START ;起动总线MOV A,SLALCALL WRBYTE ;发送器件从地址LCALL CACKJNB ACK,RE1 ;无应答则跳转MOV A,SUBALCALL WRBYTE ;发送器件子地址LCALL CACKJNB ACK,RE1 ;无应答则跳转POP ACC ;写数据LCALL WRBYTELCALL CACKJNB ACK,RE11LCALL STOPSJMP MAIN2RE1:POP ACCLCALL STOPSJMP MAINRE11:LCALL STOPSJMP MAINMAIN2:LCALL START ;起动总线MOV A,SLALCALL WRBYTE ;发送器件从地址LCALL CACKJNB ACK,RE2 ;无应答则跳转MOV A,SUBALCALL WRBYTE ;发送器件子地址LCALL CACKJNB ACK,RE2 ;无应答则跳转LCALL STARTMOV A,SLA ;发送器件从地址INC ALCALL WRBYTELCALL CACKJNB ACK,RE2LCALL RDBYTE ;进行读字节操作LCALL MNACK ;发送非应信号LCALL STOPSJMP MAIN3RE2:LCALL STOPSJMP MAIN2MAIN3:MOV P3, ASJMP $INCLUDE (VI2C_ASM.ASM) ;包含VIIC 软件包;END2、 页;平台定义变量ACK BIT 20H ;应答标志位SLA DATA 50H ;器件从地址SUBA DATA 51H ;器件子地址NUMBYTE DATA 52H ;读写的字节数;使用前定义常量SDA EQU P1.7 ; I2C 总线定义SCL EQU P1.6MTD EQU 30H ;发送数据缓冲区首址缓冲区30H3FHMRD EQU 40H ;接收数据缓冲区首址缓冲区40H4FHORG 8000H ;采用软件调试法AJMP MAINORG 8080HMAIN: MOV R4,#0F0H ;延时等待其它芯片复位好DJNZ R4,$MOV SP,#60H ;设置堆栈指针MOV 3FH,#00H ;给MTD赋值MOV 30H,#01H MOV 31H,#02H MOV 32H,#03HMOV 33H,#04HMOV 34H,#05HMOV 35H,#05HMOV 36H,#07HMOV 37H,#08HMOV 38H,#09HMOV 39H,#0AHMOV 3AH,#0BHMOV 3BH,#0CHMOV 3CH,#0DHMOV 3DH,#0EHMOV 3EH,#0FHMOV SLA,#0A0H ;设置写的从地址MOV SUBA,#80H ;设置子地址MOV NUMBYTE,#10H ;设置字节数,这里因为读写一页字节,所以为10H(16)LCALL IWRNBYTE ;调用写EEPROM程序MOV A,#01HLCALL IRDNBYTE ;调用读EEPROM程序MOV A,#33H;$INCLUDE (VI2C_ASM.ASM) ;I2C软件包;END6、 实验记录1、第一个实验程序运行完成后,打开“memory window”,在查询栏输入所要查看的地址空间。输入发送缓冲区首地址“D:30H”,该地址处显示的数据为“55”;输入接收缓冲区首地址“D:40H”,该地址处显示的数据为“55”。2、第二个实验程序运行完成后,同样使用“memory window”查看发送、接收缓冲区内的数据。D:30HD:3FH中储存的数据为“00 01 02 . 0E 0F”;D:40HD:4FH中储存的数据同样是“00 01 02 . 0E 0F”。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线上17位为7位地址码,第8位为读写位RD,第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子程序。代码如下:LCALL IWRNBYTE;调写EEPROM子程序(随机地址写)及:LCALL IRDNBYTE;调写EEPROM子程序(随机地址读)这两个命令需要使用NUMBYTE来控制读/写的字节数。第一个实验需要发送一个字节,即:MOV NUMBYTE,#01H;设置待发字节数为1第二个实验要发送一页数据,即16位:MOV NUMBYTE,#10H;设
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号