[ZLG-ARM] 求教lpc2214的I2C问题(期待中~~)

[复制链接]
4857|19
 楼主| hmlxy 发表于 2007-8-1 16:10 | 显示全部楼层 |阅读模式
大家好!小弟在使用lpc2214的I2C时遇到如下问题,请大家帮忙分析一下。<br /><br />我的I2C上挂有PCF8563时钟芯片和24C64存储芯片,我的I2C使用的是查询方式,但是我的程序中还用到了两个串口,两个串口的接收是中断方式,发送是查询方式,现在问题如下:<br /><br />1.当我在I2C操作时,把系统中断都关闭(当然主要是针对串口接收中断),这时从PCF8563时钟芯片中读到数据一直无错误,当然这种方法使通讯的成功率大大降低。<br /><br />2.当我在I2C操作时,不关闭中断(当然主要是针对串口接收中断),这时从PCF8563时钟芯片中读到数据会出错,现象是:程序运行一段时间后,从PCF8563种读出的时间的“分钟”数会无故变为23分(我的程序没有对PCF8563进行写操作),然后时间又正常一段时间,但再过一段时间(1秒至2分钟左右),时间又会复位为23分,当然这种方法通讯的成功率很高,这也是我所需要的。<br />我分析可能是在I2C操作时,产生的串口接收中断影响了IC2总线的操作时序,但不明白的是为什么时间总是复位为23分(我把程序中的I2C写操作全部屏蔽了,且把对24c64的任何操作也屏蔽了,结果还是这样)<br />请问有什么方法既能保证我的通讯无误又能保证我的I2C操作无误?<br /><br />请周工及各路朋友多多指教!<br />非常感您的阅读!期待您的解答!<br />
 楼主| hmlxy 发表于 2007-8-2 08:39 | 显示全部楼层

~~~~

  
zlgARM 发表于 2007-8-2 11:33 | 显示全部楼层

hmlxy

您好:<br />&nbsp;&nbsp;&nbsp;&nbsp;是否可以把问题转换一下。首先,I2C是否能单独通讯正确;然后,加上UART,再观察I2C和UART通讯是否都正确,如果不正确,是什么地方起了冲突?(一般都是共享资源部分发生冲突)。这个时候您可能需要改变资源的使用算法。
 楼主| hmlxy 发表于 2007-8-2 12:35 | 显示全部楼层

谢谢zlgARM

zlgARM:非常感谢您的回答<br />&nbsp;&nbsp;您说的方法我也试过,当没有加入串口时,I2C单独通讯是正确的,但加入串口后,I2C的读上来的数据就会出错,这种现象在上位机通过串口对ARM访问频率高的时候更容易发生。<br />&nbsp;&nbsp;我的串口程序对共享资源部分只有读操作,没有写操作,所以我感觉不像是共享资源冲突问题。<br />&nbsp;&nbsp;还有就是我的I2C使用的是查询方式,而串口接收是中断方式,不知道在I2C操作的时候,突然来了一个串口中断,会不会影响I2C的时序?
swill_333 发表于 2007-8-2 15:38 | 显示全部楼层

LPC2214不能同是开TIME1和TIMER0中断

LPC2214不能同是开TIME1和TIMER0中断<br />我用LPC2214,<br />1,&nbsp;&nbsp;&nbsp;&nbsp;Timer0&nbsp;用作10mS定时,是UCOS的时钟节拍<br />2,&nbsp;&nbsp;&nbsp;&nbsp;Timer1&nbsp;用作100uS定时,是无线解码<br />3,&nbsp;&nbsp;&nbsp;&nbsp;只要我打开Timer1中断&nbsp;&nbsp;<br />&nbsp;VICIntEnable=1&lt&lt5;//&nbsp;使能定时器1中断<br />&nbsp;全速运行程序,就会进入;&nbsp;&nbsp;<br />&nbsp;取数据中止<br />&nbsp;&nbsp;DataAbort<br />&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataAbort<br /><br />4,请问各位高手有没有碰到此现象,有什么方法解决吗?<br />
zlgARM 发表于 2007-8-2 15:57 | 显示全部楼层

hmlxy

您好:<br />&nbsp;&nbsp;&nbsp;这个问题,需要实地调试和了解代码。<br />&nbsp;&nbsp;&nbsp;与其凭空猜测,不如直面代码、直接调试。<br />&nbsp;&nbsp;&nbsp;建议您建立一个单纯的调试例程,内里仅包含UART和I2C的代码,尽量精简(除去一切无关的细节),再发上来看看。谢谢!
 楼主| hmlxy 发表于 2007-8-2 16:34 | 显示全部楼层

谢谢zlgARM

zlgARM:您好!<br />&nbsp;&nbsp;我也正准备这样做,这几天有点忙,过几天我做个调试程序,在把结果拿出来讨论一下,谢谢!<br />&nbsp;&nbsp;<br />swill_333&nbsp;你好!<br />&nbsp;&nbsp;关于你说的现象,我感觉不应该是你说的“LPC2214不能同是开TIME1和TIMER0中断”,因为我也试过在程序中同时使用的TIMER0和TIME1,但程序运行没有错误,其实有很多情况可以引起数据中止,比如你访问的存储区超出了范围(使用指针或数组时若不小心可能出现这种情况)。你可以先看看跟踪一下程序看是不是代码的问题!<br />&nbsp;&nbsp;但还是建议使用软定时器。<br />&nbsp;&nbsp;小弟我也是初学者,这里只能给点参考意见,可能我的理解也不一定正确,还请谅解
 楼主| hmlxy 发表于 2007-8-5 13:53 | 显示全部楼层

zlgARM请进,我按您的要求写了个单纯的调试例程

zlgARM:您好!<br />&nbsp;&nbsp;&nbsp;&nbsp;我按您的要求写了个单纯的调试例程,去掉了定时器中断、串口0接收中断、外部中断等等,目前只保留了串口1接收中断和I2C操作,但是现象跟原来基本一样,只是有一点不同,就是现在I2C操作错误的几率变小了,原来是1秒至2分钟左右,现在是1秒至10分钟左右。下面是我的代码,请您帮忙分析一下,如果能提供您的邮箱,我可以把整个工程发给您,谢谢!<br /><br />//用户主程序<br />int&nbsp;&nbsp;main(void)<br />{&nbsp;<br />&nbsp;&nbsp;IO_PortConf();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//IO端口配置程序;<br />&nbsp;&nbsp;WP_SET1();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//24C64写保护<br />&nbsp;&nbsp;I2C_Query_Init(100000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//I2C总线初始化(100k的速率)&nbsp;<br />&nbsp;&nbsp;UART1_Initial(57600,&nbsp;8,1,2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;初始化串口1<br />&nbsp;&nbsp;UART1_Open();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;打开串口开始接收数据&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;//主循环部分<br />&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(Rx_flag==1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;判断接收缓冲区中是否有数据需要处理<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART1_Close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MCNP_V20_dataParse();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rx_flag=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART1_Open();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART1_SendByteStream(Tx_start,0x00);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Read_SysDateTime();&nbsp;&nbsp;//&nbsp;读系统日期时间&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Set_SysDateTime();&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return(0);&nbsp;&nbsp;<br />}<br /><br />//对通讯接收缓冲区中接收到的数据包进行解析,并进行相应的处理&nbsp;<br />void&nbsp;MCNP_V20_dataParse(void)<br />{&nbsp;uint16&nbsp;&nbsp;&nbsp;&nbsp;i;<br />&nbsp;&nbsp;uint8&nbsp;&nbsp;&nbsp;&nbsp;anao;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;Tx_num=0;&nbsp;&nbsp;<br />&nbsp;&nbsp;switch((Rx_buffer[3]&lt&lt8)&nbsp;|&nbsp;Rx_buffer[4])&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;取出命令号&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;//读取系统时间&nbsp;(格式:年|月|日|时|分|秒|星期)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x0003:<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tx_buffer[0]=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;装入本机地址<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tx_buffer[1]=Rx_buffer[3]+48;&nbsp;//&nbsp;装入返回的命令号1&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tx_buffer[2]=Rx_buffer[4];&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;装入返回的命令号2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tx_buffer[3]=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;装入返回数据的&quot;字节数1&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tx_buffer[4]=7;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;装入返回数据的&quot;字节数2&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tx_buffer[5]=WDataZone.var.SystemDate.year;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;年<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tx_buffer[6]=WDataZone.var.SystemDate.month;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;月<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tx_buffer[7]=WDataZone.var.SystemDate.day_of_month;//&nbsp;日<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tx_buffer[8]=WDataZone.var.SystemTime.hour;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;时<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tx_buffer[9]=WDataZone.var.SystemTime.minute;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;分<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tx_buffer[10]=WDataZone.var.SystemTime.second;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;秒<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tx_buffer[11]=WDataZone.var.SystemDate.day_of_week;//&nbsp;星期<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//计算发送包的校验字节&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;anao=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt12;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;anao=anao+Tx_buffer;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;anao=~anao+1;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tx_buffer[12]=anao;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;装入返回数据的校验字节&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tx_num=13;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;返包数据中从源地址到校验数的字节总数<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//设定系统时间(格式:年|月|日|时|分|秒|星期)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x3000:<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WDataZone.var.SystemDateTimeSetData.year=Rx_buffer[7];&nbsp;//&nbsp;年<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WDataZone.var.SystemDateTimeSetData.month=Rx_buffer[8];//&nbsp;月<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WDataZone.var.SystemDateTimeSetData.day_of_month=Rx_buffer[9];//&nbsp;日<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WDataZone.var.SystemDateTimeSetData.hour=Rx_buffer[10];&nbsp;&nbsp;&nbsp;//&nbsp;时<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WDataZone.var.SystemDateTimeSetData.minute=Rx_buffer[11];&nbsp;&nbsp;//&nbsp;分<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WDataZone.var.SystemDateTimeSetData.second=Rx_buffer[12];&nbsp;&nbsp;//&nbsp;秒<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WDataZone.var.SystemDateTimeSetData.day_of_week=Rx_buffer[13];//&nbsp;星期<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WDataZone.var.SystemDateTimeSetData.DateTimeSetFlag=1;//为1表示需要设定系统时间<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set_SysDateTime();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设定PCF8563的时间&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;&nbsp;:break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;return;<br />}<br /><br /><br />//设置系统日期和时间<br />void&nbsp;&nbsp;Set_SysDateTime(void)<br />{&nbsp;<br />&nbsp;&nbsp;if(WDataZone.var.SystemDateTimeSetData.DateTimeSetFlag==1)<br />&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;WDataZone.var.SystemDateTimeSetData.DateTimeSetFlag=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;I2cmtd[0]=0;&nbsp;//控制字1<br />&nbsp;&nbsp;&nbsp;&nbsp;I2cmtd[1]=0;&nbsp;//控制字2<br />&nbsp;&nbsp;&nbsp;&nbsp;I2cmtd[2]=WDataZone.var.SystemDateTimeSetData.second;//秒&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;I2cmtd[3]=WDataZone.var.SystemDateTimeSetData.minute;//分钟&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;I2cmtd[4]=WDataZone.var.SystemDateTimeSetData.hour;//小时<br />&nbsp;&nbsp;&nbsp;&nbsp;I2cmtd[5]=WDataZone.var.SystemDateTimeSetData.day_of_month;//日&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;I2cmtd[6]=WDataZone.var.SystemDateTimeSetData.day_of_week;//星期<br />&nbsp;&nbsp;&nbsp;&nbsp;I2cmtd[7]=WDataZone.var.SystemDateTimeSetData.month;//月<br />&nbsp;&nbsp;&nbsp;&nbsp;I2cmtd[8]=WDataZone.var.SystemDateTimeSetData.year;//年&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;I2C_Query_DeviceSendStr(PCF8563,&nbsp;1,&nbsp;0x00,&nbsp;I2cmtd,&nbsp;9);&nbsp;&nbsp;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return;<br />}<br /><br /><br />//读系统日期和时间<br />void&nbsp;&nbsp;Read_SysDateTime(void)<br />{<br />&nbsp;&nbsp;uint16&nbsp;I2c_ok;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;I2c_ok=1表示I2C读数据操作成功&nbsp;&nbsp;<br />&nbsp;&nbsp;I2c_ok=I2C_Query_DeviceRcvStr(PCF8563,&nbsp;1,&nbsp;0x02,&nbsp;I2cmrd,&nbsp;7);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;if(I2c_ok==0)&nbsp;return;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果I2C总线读数据操作失败,则放弃该次操作,需读的参数保持原来的值&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;WDataZone.var.SystemTime.second=I2cmrd[0]&nbsp;&&nbsp;0x7F;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//秒&nbsp;<br />&nbsp;&nbsp;WDataZone.var.SystemTime.minute=I2cmrd[1]&nbsp;&&nbsp;0x7F;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//分钟&nbsp;<br />&nbsp;&nbsp;WDataZone.var.SystemTime.hour=I2cmrd[2]&nbsp;&&nbsp;0x3F;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//小时<br />&nbsp;&nbsp;WDataZone.var.SystemDate.day_of_month=I2cmrd[3]&nbsp;&&nbsp;0x3F;&nbsp;//日&nbsp;&nbsp;<br />&nbsp;&nbsp;WDataZone.var.SystemDate.day_of_week=I2cmrd[4]&nbsp;&&nbsp;0x07;//星期<br />&nbsp;&nbsp;WDataZone.var.SystemDate.month=I2cmrd[5]&nbsp;&&nbsp;0x1F;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//月<br />&nbsp;&nbsp;WDataZone.var.SystemDate.year=I2cmrd[6];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//年&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;return;&nbsp;&nbsp;&nbsp;<br />}<br /><br /><br />//-----------------向有子地址器件发送多字节数据函数---------------------------------------------&nbsp;<br />//原&nbsp;&nbsp;&nbsp;&nbsp;形:&nbsp;uint8&nbsp;I2C_Query_DeviceSendStr(uint8&nbsp;sla,&nbsp;uint8&nbsp;subatype,&nbsp;uint16&nbsp;suba,&nbsp;uint8&nbsp;*str,&nbsp;uint16&nbsp;no)<br />//描&nbsp;&nbsp;&nbsp;&nbsp;述:&nbsp;从启动总线到发送地址,子地址,读数据,结束总线的全过程<br />//输入参数:&nbsp;sla&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;从器件地址,<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subatype&nbsp;&nbsp;&nbsp;&nbsp;子地址类型,&nbsp;&nbsp;&nbsp;&nbsp;子地址结构&nbsp;&nbsp;&nbsp;&nbsp;1-单字节地址&nbsp;&nbsp;&nbsp;&nbsp;2-双字节地址<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;suba&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;子地址,<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要写入的内容放入str指向的存储区&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;no&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;读no个字节。&nbsp;该参数超过缓存器的最大字节数无效&nbsp;(注意!!!)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />//输出参数:&nbsp;函数返回1表示操作成功,否则操作有误。<br />//头&nbsp;文&nbsp;件:&nbsp;&quot;I2C_chip.h&quot;<br />//库&nbsp;文&nbsp;件:&nbsp;无<br />//注意事项:&nbsp;需注意当给定的起始地址与欲写的N字节数据超过本页最后一个存储单元后,将转入本页的第一个单元<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;进行&quot;滚动循环&quot;.即读取的I2C器件中数据是在本页进行的页内部循环(注意!!!!!!!)<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;24C64中的RAM缓存器为32个字节,即一页为32个字节<br />//----------------------------------------------------------------------------------------------&nbsp;<br />uint8&nbsp;I2C_Query_DeviceSendStr(uint8&nbsp;sla,&nbsp;uint8&nbsp;subatype,&nbsp;uint16&nbsp;suba,&nbsp;uint8&nbsp;*str,&nbsp;uint16&nbsp;no)<br />{<br />&nbsp;&nbsp;uint16&nbsp;&nbsp;i;<br />&nbsp;&nbsp;uint8&nbsp;&nbsp;var;<br />&nbsp;&nbsp;uint8&nbsp;&nbsp;*string;<br />&nbsp;&nbsp;string=str;<br />&nbsp;&nbsp;//INT_Close();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//关闭所有使用到的中断,防止I2C操作的时候,中断发生,导致I2C出错<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;GetBus();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//启动总线//<br />&nbsp;&nbsp;I2CONCLR=(1&lt&lt5);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//清零STA位//<br />&nbsp;&nbsp;I2CBusSendByte(sla);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发送从器件写操作地址sla//<br /><br />&nbsp;&nbsp;if(I2STAT!=0x18)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;(1&nbsp;&lt&lt&nbsp;4);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;置位STO,结束总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x28;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清零SI,&nbsp;STA位,结束总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;//INT_Open();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打开所有使用到的中断,恢复原样<br />&nbsp;&nbsp;&nbsp;&nbsp;return(0);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;if(subatype==1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//器件地址为1个字节的地址<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;=&nbsp;suba&nbsp;&&nbsp;0xFF;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CBusSendByte(var);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发送器件子地址//在此之后,将进入读寄存器模式<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((I2STAT!=0x28))//&&(I2STAT!=0x30)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;(1&nbsp;&lt&lt&nbsp;4);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;置位STO,结束总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x28;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清零SI,&nbsp;STA位,结束总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//INT_Open();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打开所有使用到的中断,恢复原样<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;else&nbsp;if(subatype==2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//器件地址为2个字节的地址<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;=&nbsp;suba&gt&gt8;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//先发高8位地址<br />&nbsp;&nbsp;&nbsp;&nbsp;I2CBusSendByte(var);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发送器件子地址高8位<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((I2STAT!=0x28))//&&(I2STAT!=0x30)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;(1&nbsp;&lt&lt&nbsp;4);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;置位STO,结束总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x28;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清零SI,&nbsp;STA位,结束总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//INT_Open();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打开所有使用到的中断,恢复原样<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var=suba&nbsp;&&nbsp;0xFF;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//再发低8位地址<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CBusSendByte(var);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发送器件子地址低8位//在此之后,将进入读寄存器模式<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((I2STAT!=0x28))//&&(I2STAT!=0x30)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;(1&nbsp;&lt&lt&nbsp;4);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;置位STO,结束总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x28;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清零SI,&nbsp;STA位,结束总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//INT_Open();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打开所有使用到的中断,恢复原样<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;for(i=0;i&ltno;i++)<br />&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;I2CBusSendByte(*string);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发送数据//<br />&nbsp;&nbsp;&nbsp;&nbsp;if((I2STAT!=0x28))//&&(I2STAT!=0x30)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;(1&nbsp;&lt&lt&nbsp;4);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;置位STO,结束总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x28;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清零SI,&nbsp;STA位,结束总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//INT_Open();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打开所有使用到的中断,恢复原样<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;string++;<br />&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;(1&nbsp;&lt&lt&nbsp;4);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;置位STO,结束总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x28;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清零SI,&nbsp;STA位,结束总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;Write24Cxx_delayNms(10);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;延时10ms(不论写1字节还是写32字节,延时都必须大于等于10ms)<br />&nbsp;&nbsp;//INT_Open();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打开所有使用到的中断,恢复原样<br />&nbsp;&nbsp;return(1);<br />}<br /><br />//-----------------向有子地址器件读取多字节数据函数---------------------------------------------&nbsp;<br />//原&nbsp;&nbsp;&nbsp;&nbsp;形:&nbsp;I2C_Query_DeviceRcvStr(uint8&nbsp;sla,&nbsp;uint8&nbsp;subatype,&nbsp;uint16&nbsp;suba,&nbsp;uint8&nbsp;*str,&nbsp;uint16&nbsp;no)<br />//描&nbsp;&nbsp;&nbsp;&nbsp;述:&nbsp;从启动总线到发送地址,子地址,读数据,结束总线的全过程<br />//输入参数:&nbsp;从器件地址sla,<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;子地址类型subatype,&nbsp;&nbsp;&nbsp;&nbsp;子地址结构&nbsp;&nbsp;&nbsp;&nbsp;1-单字节地址&nbsp;&nbsp;&nbsp;&nbsp;2-双字节地址<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;子地址suba,<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;读出的内容放入str指向的存储区&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;需要读的字节个数在no中<br />//输出参数:&nbsp;函数返回1表示操作成功,否则操作有误。<br />//头&nbsp;文&nbsp;件:&nbsp;&quot;I2C_chip.h&quot;<br />//库&nbsp;文&nbsp;件:&nbsp;无<br />//注意事项:&nbsp;需注意当给定的起始地址与欲读的N字节数据超过最后一页最后一个存储单元后,将转入第一页的第一个单元<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;即读取的I2C器件中数据是所有页进行的全循环<br />//----------------------------------------------------------------------------------------------&nbsp;<br />uint16&nbsp;I2C_Query_DeviceRcvStr(uint8&nbsp;sla,&nbsp;uint8&nbsp;subatype,&nbsp;uint16&nbsp;suba,&nbsp;uint8&nbsp;*str,&nbsp;uint16&nbsp;no)<br />{<br />&nbsp;&nbsp;uint16&nbsp;&nbsp;i,j;<br />&nbsp;&nbsp;uint8&nbsp;&nbsp;var;<br />&nbsp;&nbsp;uint8&nbsp;&nbsp;*string;<br />&nbsp;&nbsp;string=str;<br />&nbsp;&nbsp;//INT_Close();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//关闭所有中断,防止I2C操作的时候,中断发生,导致I2C出错<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;GetBus();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//启动总线//<br />&nbsp;&nbsp;I2CONCLR=(1&lt&lt5);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//清零STA位//<br />&nbsp;&nbsp;I2CBusSendByte(sla);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发送从器件写操作地址sla//<br />&nbsp;&nbsp;if(I2STAT!=0x18)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;(1&nbsp;&lt&lt&nbsp;4);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;置位STO,结束总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x28;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清零SI,&nbsp;STA位,结束总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;//INT_Open();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打开所有使用到的中断,恢复原样<br />&nbsp;&nbsp;&nbsp;&nbsp;return(0);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;if(subatype==1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//器件地址为1个字节的地址<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;=&nbsp;suba&nbsp;&&nbsp;0xFF;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CBusSendByte(var);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发送器件子地址//在此之后,将进入读寄存器模式<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((I2STAT!=0x28))//&&(I2STAT!=0x30)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;(1&nbsp;&lt&lt&nbsp;4);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;置位STO,结束总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x28;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清零SI,&nbsp;STA位,结束总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//INT_Open();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打开所有使用到的中断,恢复原样<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;else&nbsp;if(subatype==2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//器件地址为2个字节的地址<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;=&nbsp;suba&gt&gt8;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//先发高8位地址<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CBusSendByte(var);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发送器件子地址高8位<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((I2STAT!=0x28))//&&(I2STAT!=0x30)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;(1&nbsp;&lt&lt&nbsp;4);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;置位STO,结束总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x28;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清零SI,&nbsp;STA位,结束总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//INT_Open();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打开所有使用到的中断,恢复原样<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var=suba&nbsp;&&nbsp;0xFF;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//再发低8位地址<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CBusSendByte(var);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发送器件子地址低8位//在此之后,将进入读寄存器模式<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((I2STAT!=0x28))//&&(I2STAT!=0x30)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;(1&nbsp;&lt&lt&nbsp;4);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;置位STO,结束总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x28;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清零SI,&nbsp;STA位,结束总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//INT_Open();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打开所有使用到的中断,恢复原样<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;//I2CONSET&nbsp;=&nbsp;(1&nbsp;&lt&lt&nbsp;4);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;置位STO,结束总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;//I2CONCLR&nbsp;=&nbsp;0x28;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清零SI,&nbsp;STA位,结束总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;(1&nbsp;&lt&lt&nbsp;3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清零SI<br />&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;(1&nbsp;&lt&lt&nbsp;5);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//置位STA,&nbsp;重新启动总线//<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;for(j=0;j&lt20000;j++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;if((I2CONSET&nbsp;&&nbsp;0x08)!=0)&nbsp;break;<br />&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;(1&nbsp;&lt&lt&nbsp;5);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清零STA<br />&nbsp;&nbsp;I2CBusSendByte(sla+1);<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;if(I2STAT!=0x40)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;(1&nbsp;&lt&lt&nbsp;4);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;置位STO,结束总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x28;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清零SI,&nbsp;STA位,结束总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;//INT_Open();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打开所有使用到的中断,恢复原样<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(0);<br />&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;for(i=0;i&ltno-1;i++)<br />&nbsp;&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;(1&nbsp;&lt&lt&nbsp;2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//接收一字节数据并发送应答位//<br />&nbsp;&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;(1&nbsp;&lt&lt&nbsp;3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//清零SI<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j=0;j&lt20000;j++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((I2CONSET&nbsp;&&nbsp;0x08)!=0)&nbsp;break;&nbsp;//等待接收数据//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(I2STAT!=0x50)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;(1&nbsp;&lt&lt&nbsp;4);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;置位STO,结束总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x28;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清零SI,&nbsp;STA位,结束总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//INT_Open();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打开所有使用到的中断,恢复原样<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;*string=I2DAT;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读取数据//&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;string++;<br />&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;(1&lt&lt2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//接收最后一字节数据并发送非应答位//<br />&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;(1&nbsp;&lt&lt&nbsp;3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//清零SI<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;for(j=0;j&lt20000;j++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;if((I2CONSET&nbsp;&&nbsp;0x08)!=0)&nbsp;break;<br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;*string=I2DAT;<br />&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;(1&nbsp;&lt&lt&nbsp;4);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;置位STO,结束总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x28;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清零SI,&nbsp;STA位,结束总线&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;//INT_Open();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打开所有使用到的中断,恢复原样<br />&nbsp;&nbsp;return(1);<br />}<br /><br /><br />
 楼主| hmlxy 发表于 2007-8-5 13:54 | 显示全部楼层

接上页

//----------------------------------------------------------------------------------------------&nbsp;<br />//原&nbsp;&nbsp;&nbsp;&nbsp;形:&nbsp;void&nbsp;&nbsp;&nbsp;__irq&nbsp;myIRQ_UART1(void)&nbsp;&nbsp;(__irq关键字表示该程序是中断服务程序)<br />//描&nbsp;&nbsp;&nbsp;&nbsp;述:&nbsp;串口UART1接收中断<br />//输入参数:&nbsp;无<br />//输出参数:&nbsp;Rx_flag&nbsp;&nbsp;(若收到一个完整且正确的数据包,则置位该标志为1)(全局变量)<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rx_buffer(接收到的数据在接收缓冲区中)(全局变量)<br />//头&nbsp;文&nbsp;件:&nbsp;MCNP_V20_dataParse.h&nbsp;<br />//库&nbsp;文&nbsp;件:&nbsp;无<br />//注意事项:&nbsp;&nbsp;<br />//----------------------------------------------------------------------------------------------&nbsp;<br />void&nbsp;&nbsp;&nbsp;__irq&nbsp;myIRQ_UART1(void)<br />{&nbsp;uint8&nbsp;&nbsp;temp;<br />&nbsp;&nbsp;uint16&nbsp;i,j;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;temp=U1LSR;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;读取UART0线状态寄存器<br />&nbsp;&nbsp;if((temp&nbsp;&&nbsp;0x8E)!=0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;判断是否有接收出错<br />&nbsp;&nbsp;{&nbsp;//注意:下面这段顺序不能交换,这是清除错误的顺序(书226页)<br />&nbsp;&nbsp;&nbsp;&nbsp;//下面这一段主要是为了解决在下面的问题:<br />&nbsp;&nbsp;&nbsp;&nbsp;//由于外部硬件的485控制芯片的输入与输出的控制端采用了互斥的电路设计,这就会使本CPU在发送数据<br />&nbsp;&nbsp;&nbsp;&nbsp;//操作DISOUT1_SET0时,他的串口接收线出现一个由高到低的跳变,然后一直保持低电平直到发送结束后<br />&nbsp;&nbsp;&nbsp;&nbsp;//操作DISOUT1_SET0时,再跳变回高电平,这就必然会引起串口输入的某一种错误(帧错误/奇偶错误/间隔中断)<br />&nbsp;&nbsp;&nbsp;&nbsp;//导致在串口发送数据结束后马上进串口接收中断myIRQ_UART1,下面的操作就是为了对该错误进行处理,<br />&nbsp;&nbsp;&nbsp;&nbsp;//以保证正常的通讯&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;i=U1RBR;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;虚读,得到的数据没有作用,只是为了清除错误&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;temp=U1LSR;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;虚读,得到的数据没有作用,只是为了清除错误&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;else&nbsp;if(Rx_flag==1)&nbsp;<br />&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//U1FCR=RXFL_Sel&nbsp;|&nbsp;0x07;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;该句不能要,若用该句,则在用MNCP初始化显示屏时会出现CPU复位死机现象<br />&nbsp;&nbsp;&nbsp;&nbsp;Rx_num=0;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;switch(U1IIR&nbsp;&&nbsp;0xCF)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;判断中断标识寄存器<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0xC1:&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;没有挂起的中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;RLS(接收线出错)中断&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0xC6:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=U1LSR;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;读取UART1线状态寄存器(U1LSR),并清除RLS中断,并清零U1LSR中的相关错误位<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((temp&nbsp;&&nbsp;0x9E)!=0)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//U1FCR=U1FCR&nbsp;|&nbsp;0x02;&nbsp;&nbsp;&nbsp;//&nbsp;由于U1FCR寄存器为只写寄存器,故不能采用先读后写的操作<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U1FCR=RXFL_Sel&nbsp;|&nbsp;0x07;&nbsp;&nbsp;//&nbsp;当接收线出错,则复位RX&nbsp;FIFO,清零接收缓存队列<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;RDA(接收数据可用)中断,&nbsp;由于采用的是FIFO模式,则发生此中断说明FIFO到达触发点<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0xC4:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=U1LSR;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;读取UART1线状态寄存器(U1LSR)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((temp&nbsp;&&nbsp;0x01)!=0&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果U1RBR中包含未读取的有效数据,则读取这些数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i&ltFIFOLengthDeep-1;&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((U1LSR&nbsp;&&nbsp;0x01)!=0&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j=U1RBR;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;取出队列缓存FIFO中接收到的字节数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;无需加入检验奇偶校验位的子程序,因为硬件自带了<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;CTI(字符超时指示)中断&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0xCC:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//在FIFO模式下,发生该中断则认为此次数据报发送完毕,剩余的数据字节在FIFO中,但不到触发深度<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i&ltFIFOLengthDeep;&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=U1LSR;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;读取UART1线状态寄存器(U1LSR)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((temp&nbsp;&&nbsp;0x01)!=0&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果U1RBR中包含未读取的有效数据,则读取这些数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j=U1RBR;//&nbsp;取出队列缓存FIFO中接收到的字节数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;无需加入检验奇偶校验位的子程序,因为硬件自带了<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;U1RBR中没有未读取的有效数据,则停止数据的读取,并置位数据报接收完毕标志<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;THRE中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0xC2:&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;else<br />&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;switch(U1IIR&nbsp;&&nbsp;0xCF)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;判断中断标识寄存器<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0xC1:&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;没有挂起的中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;RLS(接收线出错)中断&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0xC6:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=U1LSR;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;读取UART1线状态寄存器(U1LSR),并清除RLS中断,并清零U1LSR中的相关错误位<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((temp&nbsp;&&nbsp;0x9E)!=0)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//U1FCR=U1FCR&nbsp;|&nbsp;0x02;&nbsp;&nbsp;&nbsp;//由于U1FCR寄存器为只写寄存器,故不能采用先读后写的操作<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U1FCR=RXFL_Sel&nbsp;|&nbsp;0x07;&nbsp;&nbsp;//&nbsp;当接收线出错,则复位RX&nbsp;FIFO,清零接收缓存队列<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rx_flag=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;串口未收到数据报<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rx_num=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;接收到的报文字节标记号归零<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;RDA(接收数据可用)中断,&nbsp;由于采用的是FIFO模式,则发生此中断说明FIFO到达触发点<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0xC4:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=U1LSR;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;读取UART1线状态寄存器(U1LSR)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((temp&nbsp;&&nbsp;0x01)!=0&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果U1RBR中包含未读取的有效数据,则读取这些数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i&ltFIFOLengthDeep-1;&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((U1LSR&nbsp;&&nbsp;0x01)!=0&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rx_buffer[Rx_num]=U1RBR;&nbsp;//&nbsp;取出队列缓存FIFO中接收到的字节数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;无需加入检验奇偶校验位的子程序,因为硬件自带了<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rx_num++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(Rx_num&gt=150)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rx_num=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;CTI(字符超时指示)中断&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0xCC:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//在FIFO模式下,发生该中断则认为此次数据报发送完毕,剩余的数据字节在FIFO中,但不到触发深度<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i&ltFIFOLengthDeep;&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=U1LSR;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;读取UART1线状态寄存器(U1LSR)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((temp&nbsp;&&nbsp;0x01)!=0&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果U1RBR中包含未读取的有效数据,则读取这些数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rx_buffer[Rx_num]=U1RBR;//&nbsp;取出队列缓存FIFO中接收到的字节数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;无需加入检验奇偶校验位的子程序,因为硬件自带了<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rx_num++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;U1RBR中没有未读取的有效数据,则停止数据的读取,并置位数据报接收完毕标志<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rx_flag=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;置位&quot;串口收到完整数据报标志&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rx_num=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;THRE中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0xC2:&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;中断处理结束,清除相关寄存器<br />}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />//----------------------------------------------------------------------------------------------&nbsp;<br />//原&nbsp;&nbsp;&nbsp;&nbsp;形:&nbsp;void&nbsp;&nbsp;UART1_SendByteStream(void)<br />//描&nbsp;&nbsp;&nbsp;&nbsp;述:&nbsp;向串口发送数据流<br />//输入参数:&nbsp;Tx_num&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返包数据中从源地址到校验数的字节总数(等于数据部分字节数+6)<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tx_buffer[]&nbsp;串行发送缓冲区(缓冲区中是从源地址----校验数的数据)&nbsp;&nbsp;&nbsp;&nbsp;<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;起始字节<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TargetAddr&nbsp;&nbsp;目标地址<br />//输出参数:&nbsp;<br />//头&nbsp;文&nbsp;件:&nbsp;MCNP_V20_dataParse.h&nbsp;<br />//库&nbsp;文&nbsp;件:&nbsp;无<br />//注意事项:&nbsp;&nbsp;<br />//----------------------------------------------------------------------------------------------&nbsp;<br />void&nbsp;&nbsp;UART1_SendByteStream(uint8&nbsp;Start,uint8&nbsp;TargetAddr)<br />{<br />&nbsp;&nbsp;uint16&nbsp;i;<br />&nbsp;&nbsp;uint16&nbsp;j;<br />&nbsp;&nbsp;if(Tx_num==0)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;若没有要发送的数据包,则退出<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;VICIntEnClr&nbsp;=&nbsp;0x00000080;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;禁止UART1中断&nbsp;&nbsp;VICIntEnClr[bit7]=1<br />&nbsp;&nbsp;DISOUT1_SET0();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;DISOUT1脚置0表允许发送数据&nbsp;<br />&nbsp;&nbsp;//delayNus(10);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;U1THR&nbsp;=&nbsp;Start;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;发送MCNPV2.0协议的数据包起始字节<br />&nbsp;&nbsp;for(j=0;j&lt30000;j++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;之所以使用循环而不用While语句,是为了防止while语句可能出现死锁<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;if((U1LSR&0x40)!=0)&nbsp;break;&nbsp;//&nbsp;等待数据发送完毕<br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;U1THR&nbsp;=&nbsp;TargetAddr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;发送目的地址(即主机地址)<br />&nbsp;&nbsp;for(j=0;j&lt30000;j++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;之所以使用循环而不用While语句,是为了防止while语句可能出现死锁<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;if((U1LSR&0x40)!=0)&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;等待数据发送完毕<br />&nbsp;&nbsp;}&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;for(i=0;i&ltTx_num;i++)&nbsp;&nbsp;<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;U1THR&nbsp;=&nbsp;Tx_buffer;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;发送从源地址到校验数的字节&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(j=0;j&lt30000;j++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;之所以使用循环而不用While语句,是为了防止while语句可能出现死锁<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((U1LSR&0x40)!=0)&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;等待数据发送完毕<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;U1THR&nbsp;=&nbsp;Tx_stop;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;发送MCNPV2.0协议的数据包结束字节<br />&nbsp;&nbsp;for(j=0;j&lt30000;j++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;之所以使用循环而不用While语句,是为了防止while语句可能出现死锁<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;if((U1LSR&0x40)!=0)&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;等待数据发送完毕<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;//delayNus(10);&nbsp;<br />&nbsp;&nbsp;DISOUT1_SET1();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;DISOUT1脚置1表允许接收数据&nbsp;<br />&nbsp;&nbsp;VICIntEnable&nbsp;=&nbsp;0x00000080;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使能UART1中断&nbsp;&nbsp;VICIntEnable[bit7]=1&nbsp;<br />&nbsp;&nbsp;return;<br />}<br /><br />
zlgarm 发表于 2007-8-5 16:06 | 显示全部楼层

Re

大致看了一下您的程序,有几个方面感觉有点不清晰:<br />1、您的程序是前后台的还是基于uc/OS-II的?<br />2、由于I2C操作很多情况下都是使用中断方式,所以就要求合理处理系统中的中断。<br />您可以将工程文件发送到邮箱:ARM.Support@zlgmcu.com
LPC900 发表于 2007-8-5 16:46 | 显示全部楼层

注意:PCF8563和24C64在I2C从机地址上可能存在冲突!

  
火光 发表于 2007-8-5 17:12 | 显示全部楼层

楼主啊,你为什么不是全部用中断方式呢?

<br />hmlxy:<br />--------------------------------------------------------------------<br />我的I2C上挂有PCF8563时钟芯片和24C64存储芯片,我的I2C使用的是查询方式,但是我的程序中还用到了两个串口,两个串口的接收是中断方式,发送是查询方式<br />--------------------------------------------------------------------<br />你为什么不全部使用中断方式呢?<br />应该养成用中断的习惯,,,器件本来就是有这个能力的,为什么不用呢?用查询的话,顾了这边顾不了那边的,工作效率太低!
 楼主| hmlxy 发表于 2007-8-5 19:50 | 显示全部楼层

谢谢各位的跟帖!

&nbsp;&nbsp;周工(zlgARM):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;您好!<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我已把整个工程文件发到了您的邮箱,辛苦您了,谢谢!!<br /><br />&nbsp;&nbsp;LPC900:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;您好!<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;非常谢谢您的回贴!“PCF8563和24C64在I2C从机地址上可能存在冲突!”<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我觉得不象是这个问题,因为我的地址定义为<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#define&nbsp;At24cxx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0A0&nbsp;//&nbsp;定义器件I2C的地址为0xA0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#define&nbsp;PCF8563&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xA2&nbsp;//&nbsp;定义器件I2C的地址为0xA2<br />&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;火光:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;您好!<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;很感谢您的建议,原来为了偷懒,就用查询方式了,我现在已经将我的I2C改为了中断方式,且一切正常,但是我不明白查询方式时为什么会出错,所以还得在这里请教各位,呵呵!!是不是有点执着了哦~~<br />
汽车电子 发表于 2007-8-6 21:45 | 显示全部楼层

这里有有UART和IIC的代码下载

&nbsp;&nbsp;IIC读写EEPROM,无字节长度限制,<br />&nbsp;&nbsp;<a href="http://www.shawyoo.com" target=_blank>http://www.shawyoo.com</a>下载中心
 楼主| hmlxy 发表于 2007-8-7 11:01 | 显示全部楼层

汽车电子

谢谢这位兄弟
 楼主| hmlxy 发表于 2007-8-7 11:05 | 显示全部楼层

zlgARM

&nbsp;周工:<br />&nbsp;&nbsp;&nbsp;&nbsp;您好!<br />&nbsp;&nbsp;不知道我的那个I2C得问题怎么样了,是程序问题还是我得处理逻辑有问题?<br />&nbsp;&nbsp;期待中.....
 楼主| hmlxy 发表于 2007-8-10 09:31 | 显示全部楼层

咋没音讯了

  
 楼主| hmlxy 发表于 2007-8-12 14:29 | 显示全部楼层

仍然期待中~~~~~~

  
hotpower 发表于 2007-8-12 14:34 | 显示全部楼层

I2C都用中断简单明了~~~

  
wlsui 发表于 2007-8-12 20:11 | 显示全部楼层

T1

定时器T1中间的时间10us太快了,改长些试试看<br />比如改为2s,此时没问题,则说明是T1中断的问题<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

22

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部