虚拟I2C总线汇编程序软件

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

广州周立功单片机发展有限公司设计中心Tel:(020)8552985985529940(Fax)从器件进行快速的、正确的读写操作,我们为此而设计出虚拟I2C总线操作平台软件包。本软件包是主方式下的虚拟I2C总线软件包,只要用户给子程序提供几个主要的参数,即可轻松地完成任何I2C总线外围器件的应用程序设计。2.1.2I2C串行总线I2C总线是PHILIPS公司推出的芯片间串行数据传输总线,2根线(SDA、SCL)即可实现完善的全双工同步数据传送,能够十分方便地地构成多机系统和外围器件扩展系统。I2C器件是把I2C的协议植入器件的I/O接口,使用时器件直接挂到I2C总线上,这一特点给用户在设计应用系统带来了极大的便利。I2C器件无须片选信号,是否选中是由主器件发出的I2C从地址决定的,而I2C器件的从地址是由I2C总线委员会实行统一发配。我们推出的I2C总线的操作平台软件包,只要你给出器件从地址[,子地址(注:PCF8574无子地址)],即可进行字节读,字节写,多字节读,多字节写,能够非常方便地使用I2C器件,无须你介入底层的I2C操作协议。2.1.3汇编软件包说明此软件包是用在单主I2C总线上,硬件接口是SDA,SCL,使用MCU的I/O口来模拟SDA/SCL总线。设计有/无子地址的子程序是根据I2C器件的特点,目的在于将地址和数据彻底分开。软件包的接口界面为:IRDBYTE(无子地址)读单字节数据(现行地址读)IWRBYTE(无子地址)写单字节数据(现行地址写)IRDNBYTE(有子地址)读N字节数据IWRNBYTE(有子地址)写N字节数据说明:现行地址读/写即专指无子地址的器件,不给定子地址的读/写操作。;平台占用内部资源:R0,R1,R2,R3,ACC,Cy。;使用前须定义变量:SLA器件从地址,SUBA器件子地址,NUMBYTE读/写的字节数,位变量ACK;使用前须定义常量:SDA、SCL总线位,MTD发送数据缓冲区首址,MRD接收数据缓冲区首址;(※子程序出口参数ACK为0时表示从器件无应答)2.1.4软件包清单;--------------------------------------------------------------------------------------------------------;VI2C_ASM.ASM;I2C软件包的底层子程序,使用前要定义好SCL和SDA。在标准80C51模式;(12Clock)下,对主频要求是不高于12MHz(1个机器周期1us);若Fosc12MHz;则要增加相应的NOP指令数。在使用本软件包时,请在你的程序的未尾加入;$INCLUDE(VI2C_ASM.ASM)即可。;--------------------------------------------------------------------------------------------------------;启动I2C总线子程序START:SETBSDA广州周立功单片机发展有限公司设计中心Tel:(020)8552985985529940(Fax)起始条件建立时间大于4.7usNOPNOPNOPNOPNOPCLRSDANOP;起始条件锁定时大于4usNOPNOPNOPNOPCLRSCL;钳住总线,准备发数据NOPRET;结束总线子程序STOP:CLRSDANOPSETBSCL;发送结束条件的时钟信号NOP;结束总线时间大于4usNOPNOPNOPNOPSETBSDA;结束总线NOP;保证一个终止信号和起始信号的空闲时间大于4.7usNOPNOPNOPRET;发送应答信号子程序MACK:CLRSDA;将SDA置0NOPNOPSETBSCLNOP;保持数据时间,即SCL为高时间大于4.7usNOPNOPNOPNOPCLRSCL广州周立功单片机发展有限公司设计中心Tel:(020)8552985985529940(Fax)发送非应答信号MNACK:SETBSDA;将SDA置1NOPNOPSETBSCLNOPNOP;保持数据时间,即SCL为高时间大于4.7usNOPNOPNOPCLRSCLNOPNOPRET;检查应答位子程序;返回值,ACK=1时表示有应答CACK:SETBSDANOPNOPSETBSCLCLRACKNOPNOPMOVC,SDAJCCENDSETBACK;判断应答位CEND:NOPCLRSCLNOPRET;发送字节子程序;字节数据放入ACC;每发送一字节要调用一次CACK子程序,取应答位WRBYTE:MOVR0,#08HWLP:RLCA;取数据位JCWR1SJMPWR0;判断数据位WLP1:DJNZR0,WLP广州周立功单片机发展有限公司设计中心Tel:(020)8552985985529940(Fax)发送1NOPSETBSCLNOPNOPNOPNOPNOPCLRSCLSJMPWLP1WR0:CLRSDA;发送0NOPSETBSCLNOPNOPNOPNOPNOPCLRSCLSJMPWLP1;读取字节子程序;读出的值在ACC;每取一字节要发送一个应答/非应答信号RDBYTE:MOVR0,#08HRLP:SETBSDANOPSETBSCL;时钟线为高,接收数据位NOPNOPMOVC,SDA;读取数据位MOVA,R2CLRSCL;将SCL拉低,时间大于4.7usRLCA;进行数据位的处理MOVR2,ANOPNOPNOPDJNZR0,RLP;未够8位,再来一次RET;无子地址器件写字节数据广州周立功单片机发展有限公司设计中心Tel:(020)8552985985529940(Fax)入口参数:数据为ACC、器件从地址SLA;占用:A、R0、CYIWRBYTE:PUSHACCIWBLOOP:LCALLSTART;起动总线MOVA,SLALCALLWRBYTE;发送器件从地址LCALLCACKJNBACK,RETWRB;无应答则跳转POPACC;写数据LCALLWRBYTELCALLCACKLCALLSTOPRETRETWRB:POPACCLCALLSTOPRET;无子地址器件读字节数据;入口参数:器件从地址SLA;出口参数:数据为ACC;占用A、R0、R2、CYIRDBYTE:LCALLSTARTMOVA,SLA;发送器件从地址INCALCALLWRBYTELCALLCACKJNBACK,RETRDBLCALLRDBYTE;进行读字节操作LCALLMNACK;发送非应信号RETRDB:LCALLSTOP;结束总线RET;向器件指定子地址写N个数据;入口参数:器件从地址SLA、器件子地址SUBA、发送数据缓冲区MTD、发送字节数NUMBYTE;占用:A、R0、R1、R3、CYIWRNBYTE:MOVA,NUMBYTEMOVR3,ALCALLSTART;起动总线MOVA,SLALCALLWRBYTE;发送器件从地址LCALLCACKJNBACK,RETWRN;无应答则退出MOVA,SUBA;指定子地址广州周立功单片机发展有限公司设计中心Tel:(020)8552985985529940(Fax):MOVA,@R1LCALLWRBYTE;开始写入数据LCALLCACKJNBACK,IWRNBYTEINCR1DJNZR3,WRDA;判断写完没有RETWRN:LCALLSTOPRET;向器件指定子地址读取N个数据;入口参数:器件从地址SLA、器件子地址SUBA、接收字节数NUMBYTE;出口参数:接收数据缓冲区MTD;占用:A、R0、R1、R2、R3、CYIRDNBYTE:MOVR3,NUMBYTELCALLSTARTMOVA,SLALCALLWRBYTE;发送器件从地址LCALLCACKJNBACK,RETRDNMOVA,SUBA;指定子地址LCALLWRBYTELCALLCACKLCALLSTART;重新起动总线MOVA,SLAINCA;准备进行读操作LCALLWRBYTELCALLCACKJNBACK,IRDNBYTEMOVR1,#MRDRDN1:LCALLRDBYTE;读操作开始MOV@R1,ADJNZR3,SACKLCALLMNACK;最后一字节发非应答位RETRDN:LCALLSTOP;并结束总线RETSACK:LCALLMACKINCR1SJMPRDN12.1.5应用举例广州周立功单片机发展有限公司设计中心Tel:(020)8552985985529940(Fax)平台定义变量ACKBIT10H;应答标志位SLADATA50H;器件从地址SUBADATA51H;器件子地址NUMBYTEDATA52H;读/写的字节数;使用前定义常量SDAEQUP1.3;I2C总线定义SCLEQUP1.2MTDEQU30H;发送数据缓冲区首址(缓冲区30H-3FH)MRDEQU40H;接收数据缓冲区首址(缓冲区40-4FH);定义器件地址PCF8574EQU40HSAA1064EQU70HCSI24WCXXEQU0A0HORG0000HAJMPMAINORG0080HMAIN:MOVR4,#0F0H;延时,等待其它芯片复位好DJNZR4,$MOVSP,#60HMOVSLA,#PCF8574;读取命令字(读PCF8574的I/O值,单字节读,读出值在ACC)LCALLIRDBYTECJNEA,#0FFH,NEXT;命令判断ACALLRD24WCXX;为0FFH,读24WCXXNEXT:CJNEA,#00H,NEXT1ACALLWR24WCXX;为00H,写24WCXXNEXT1:ACALLTESTIO;其它则进行I/O测试;读24WCXX;对24WCXX指定单元进行读,并显求出来(本例选用24WC02,因为子地址;是00--FFH)。;地址由PCF8574的I/O值给出,LED1LED2显示地址;LED3LED4显示读出的数据,;把显求数据区设为53H54H。RD24WCXX:MOVSLA,#PCF8574LCALLIRDBYTEMOV53H,A;读取PCF8574的I/O值,放入显示数据区MOVSUBA,A;对指定存储单元进行读取MOVSLA,#CSI24WCXXMOVNUMBYTE,#01H广州周立功单片机发展有限公司设计中心Tel:(020)8552985985529940(Fax)取得的数据放入显示数据区MOV54H,@R1ACALLDISP_DAT;显示操作数据MOVR6,#0FFH;短延时DJNZR6,$SJMPRD24WCXX;对显示数据的数据进行显示;显求数据区为53H54H;53H的高4位在LED1显示;低4位在LED2显示;53H的高4位在LED3显示,低4位在LED4显示DISP_DAT:MOVR1,#MTDMOVDPTR,#TAB_IOMOVA,53H;把显示数据区的数据拆分ANLA,#0F0H;分别放到发送缓冲区SWAPAMOVCA,@A+DPTR;将数据转换MOV@R1,A;LED1数据MOVA,53HANLA,#0FHMOVCA,@A+DPTRINCR1MOV@R1,A;LED2数据INCR1MOVA,54HANLA,#0F0HSWAPAMOVCA,@A+DPTR;LED3数据MOV@R1,AMOVA,54HANL

1 / 19
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功