[ZLG-ARM] 关于基于UCOS的IIC驱动问题

[复制链接]
3498|2
 楼主| xkleee 发表于 2007-2-10 12:01 | 显示全部楼层 |阅读模式
/****************************************************************************<br />*&nbsp;文件名:I2CINT.C<br />*&nbsp;功能:硬件I2C软件包,利用中断方式操作。<br />*&nbsp;说明:主程序要配置好I2C总线接口(I2C引脚功能和I2C中断,并已使能I2C主模式)<br />****************************************************************************/<br />#include&nbsp;&nbsp;&quot;config.h&quot;&nbsp;<br />#include&nbsp;&quot;I2C.h&quot;<br />volatile&nbsp;&nbsp;uint8&nbsp;&nbsp;I2C_sla;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;从机地址(即器件地址)<br />volatile&nbsp;&nbsp;uint8&nbsp;&nbsp;I2C_suba;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;子地址<br />volatile&nbsp;&nbsp;uint8&nbsp;&nbsp;*I2C_buf;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;数据缓冲区指针&nbsp;(读操作时会被更改)<br />volatile&nbsp;&nbsp;uint8&nbsp;&nbsp;I2C_num;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;操作数据个数&nbsp;(会被更改)<br />volatile&nbsp;&nbsp;uint8&nbsp;&nbsp;I2C_end;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;操作结束标志,为1时表示操作结束,为0xFF时表示操作失败&nbsp;(会被设置)<br />volatile&nbsp;&nbsp;uint8&nbsp;&nbsp;I2C_suba_en;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;子地址使能控制,读操作时请设置为1,写操作时请设置为2&nbsp;(会被更改)<br /><br />uint8&nbsp;I2C_Init(uint32&nbsp;fi2c)<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(fi2c&gt400000)&nbsp;fi2c&nbsp;=&nbsp;400000;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;PINSEL0&nbsp;=&nbsp;(PINSEL0&0xFFFFFF0F)&nbsp;|&nbsp;0x50;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置I2C控制口有效<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;I2SCLH&nbsp;=&nbsp;(Fpclk/fi2c&nbsp;+&nbsp;1)&nbsp;/&nbsp;2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置I2C时钟为fi2c<br />&nbsp;&nbsp;&nbsp;&nbsp;I2SCLL&nbsp;=&nbsp;(Fpclk/fi2c)&nbsp;/&nbsp;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x6C;<br />&nbsp;&nbsp;&nbsp;&nbsp;I2C_end=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;I2cWrite_sem=OSSemCreate(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;//I2CONSET&nbsp;=&nbsp;0x40;&nbsp;&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<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;//&nbsp;&nbsp;&nbsp;I2cMbox&nbsp;=&nbsp;OSMboxCreate(NULL);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;消息邮箱用于中断向任务传递操作结果&nbsp;*/<br />//&nbsp;&nbsp;&nbsp;&nbsp;I2cWrite&nbsp;=&nbsp;OSMboxCreate((void&nbsp;*)0);<br />&nbsp;&nbsp;&nbsp;//&nbsp;I2cRead&nbsp;=&nbsp;OSMboxCreate(NULL);<br />&nbsp;&nbsp;/*&nbsp;&nbsp;if&nbsp;(I2cMbox&nbsp;==&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />&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;使能I2C中断&nbsp;<br />}<br /><br />/****************************************************************************<br />*&nbsp;名称:IRQ_I2C()<br />*&nbsp;功能:I2C中断,通过判断I2C状态字进行相应的操作。<br />*&nbsp;入口参数:无<br />*&nbsp;出口参数:无<br />****************************************************************************/<br />void&nbsp;&nbsp;I2c_Exception(void)<br />{&nbsp;&nbsp;uint8&nbsp;&nbsp;sta,err;<br />&nbsp;&nbsp;&nbsp;OS_ENTER_CRITICAL();<br />&nbsp;&nbsp;&nbsp;sta&nbsp;=&nbsp;I2STAT;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;读出I2C状态字<br />&nbsp;&nbsp;&nbsp;switch(sta)<br />&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;case&nbsp;&nbsp;0x08:&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;if(1==I2C_suba_en)&nbsp;I2DAT&nbsp;=&nbsp;I2C_sla&0xFE;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;指定子地址读时,先写入地址<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;I2DAT&nbsp;=&nbsp;I2C_sla;&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;I2CONCLR&nbsp;=&nbsp;0x28;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SI=0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;0x10:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2DAT&nbsp;=&nbsp;I2C_sla;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;重启动总线后,发送从地址<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x28;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SI=0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;0x18:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;已发送SLA+W,并已接收应答<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(0==I2C_suba_en)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;无子地址,则直接发送数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;if(I2C_num&gt0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;I2DAT&nbsp;=&nbsp;*I2C_buf++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x28;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_num--;<br />&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;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;0x10;&nbsp;&nbsp;//&nbsp;无数据发送,结束总线<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x28;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_end&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置总线操作结束标志<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;OSMboxPost(I2cMbox,&nbsp;(void&nbsp;*)I2C_WRITE_END);<br />&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;break;<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;if(1==I2C_suba_en)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;发送子地址<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;I2DAT&nbsp;=&nbsp;I2C_suba;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x28;<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;if(2==I2C_suba_en)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;I2DAT&nbsp;=&nbsp;I2C_suba;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x28;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_suba_en&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&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;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;0x28:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;已发送I2C数据,并接收到应答<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(0==I2C_suba_en)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;无子地址,则直接发送数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;if(I2C_num&gt0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;I2DAT&nbsp;=&nbsp;*I2C_buf++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x28;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_num--;<br />&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;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;0x10;&nbsp;&nbsp;//&nbsp;无数据发送,结束总线<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x28;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_end&nbsp;=&nbsp;1;&nbsp;//此处是为了测试之用<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err=OSMboxPost(I2cWrite,(void&nbsp;*)1);<br />/////////问题是邮箱发送消息之后在中断程序结束时进入取数据中止,不知是何原因,不通过邮箱发送消息而直接通过全局变量就没任何问题.敬请周工及各位大侠指点.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnClr&nbsp;=&nbsp;1&nbsp;&lt&lt&nbsp;9;&nbsp;&nbsp;&nbsp;//&nbsp;禁止能I2c中断&nbsp;<br />&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;break;<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;if(1==I2C_suba_en)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;若是指定地址读,则重新启动总线<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;0x20;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x08;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_suba_en&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&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;break;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;0x20:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;0x30:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;0x38:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x28;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;总线进入不可寻址从模式<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_end&nbsp;=&nbsp;0xFF;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;总线出错,设置标志<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;OSMboxPost(I2cMbox,&nbsp;(void&nbsp;*)I2C_err);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;0x40:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;己发送SLA+R,并已接收到应答<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(1==I2C_num)&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;I2CONCLR&nbsp;=&nbsp;0x2C;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;AA=0,接收到数据后产生非应答<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;else&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;I2CONSET&nbsp;=&nbsp;0x04;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;AA=1,接收到数据后产生应答<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x28;<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;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;0x50:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*I2C_buf++&nbsp;=&nbsp;I2DAT;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;读取数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_num--;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(1==I2C_num)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x2C;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;AA=0,接收到数据后产生非应答<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;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;0x04;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;AA=1,接收到数据后产生应答<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x28;<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;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;0x58:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*I2C_buf++&nbsp;=&nbsp;I2DAT;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;读取最后一字节数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;0x10;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;结束总线<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x28;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_end&nbsp;=&nbsp;1;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;OSMboxPost(I2cMbox,&nbsp;(void&nbsp;*)I2C_READ_END);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;0x48:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x28;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;总线进入不可寻址从模式<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_end&nbsp;=&nbsp;0xFF;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;OSMboxPost(I2cMbox,&nbsp;(void&nbsp;*)I2C_err);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;中断处理结束<br />&nbsp;&nbsp;&nbsp;OS_EXIT_CRITICAL();<br />}<br /><br /><br /><br />/****************************************************************************<br />*&nbsp;名称:ISendByte()<br />*&nbsp;功能:向无子地址器件发送一字节数据。<br />*&nbsp;入口参数:sla&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;器件地址<br />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要发送的数据<br />*&nbsp;出口参数:返回值为0时表示出错,为1时表示操作正确。<br />*&nbsp;说明:使用前要初始化好I2C引脚功能和I2C中断,并已使能I2C主模式<br />****************************************************************************/<br />uint8&nbsp;&nbsp;ISendByte(uint8&nbsp;sla,&nbsp;uint8&nbsp;dat)<br />{&nbsp;<br />&nbsp;uint8&nbsp;err;<br />&nbsp;unsigned&nbsp;int&nbsp;Rt;<br />&nbsp;/*&nbsp;参数设置&nbsp;*/<br />&nbsp;&nbsp;&nbsp;I2C_sla&nbsp;=&nbsp;sla;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;写操作的器件地址<br />&nbsp;&nbsp;&nbsp;I2C_buf&nbsp;=&nbsp;&dat;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;待发送的数据<br />&nbsp;&nbsp;&nbsp;I2C_num&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;发送1字节数据<br />&nbsp;&nbsp;&nbsp;I2C_suba_en&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;无子地址<br />&nbsp;&nbsp;&nbsp;I2C_end&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x2C;<br />&nbsp;&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;0x60;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置为主机,并启动总线<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;/*&nbsp;&nbsp;Rt=(unsigned&nbsp;int)OSMboxPend(I2cMbox,&nbsp;0,&nbsp;&err);<br />&nbsp;&nbsp;&nbsp;&nbsp;if(Rt==I2C_WRITE_END)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;*/<br />&nbsp;&nbsp;&nbsp;while(I2C_end==0);<br />&nbsp;&nbsp;&nbsp;if(1==I2C_end)&nbsp;return(1);<br />&nbsp;&nbsp;&nbsp;else&nbsp;return(0);<br />}<br /><br /><br /><br />/****************************************************************************<br />*&nbsp;名称:ISendStr()<br />*&nbsp;功能:向有子地址器件发送多字节数据。<br />*&nbsp;入口参数:sla&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;器件从机地址<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;s&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;发送数据个数<br />*&nbsp;出口参数:返回值为0时表示出错,为1时表示操作正确。<br />*&nbsp;说明:使用前要初始化好I2C引脚功能和I2C中断,并已使能I2C主模式<br />****************************************************************************/<br />uint8&nbsp;&nbsp;ISendStr(uint8&nbsp;sla,&nbsp;uint8&nbsp;suba,&nbsp;uint8&nbsp;*s,&nbsp;uint8&nbsp;no)<br />{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;err;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;unsigned&nbsp;int&nbsp;Rt;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;*Rt;<br />&nbsp;&nbsp;&nbsp;&nbsp;//I2cWrite&nbsp;=&nbsp;OSMboxCreate((void&nbsp;*)0);<br /><br />&nbsp;/*&nbsp;参数设置&nbsp;*/<br />&nbsp;&nbsp;&nbsp;I2C_sla&nbsp;=&nbsp;sla;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;写操作的器件地址<br />&nbsp;&nbsp;&nbsp;I2C_suba&nbsp;=&nbsp;suba;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;子地址<br />&nbsp;&nbsp;&nbsp;I2C_buf&nbsp;=&nbsp;s;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;I2C_num&nbsp;=&nbsp;no;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;I2C_suba_en&nbsp;=&nbsp;2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;有子地址写<br />&nbsp;&nbsp;&nbsp;I2C_end&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x2C;<br />&nbsp;&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;0x60;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置为主机,并启动总线<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;Rt=(unsigned&nbsp;int)OSMboxPend(I2cMbox,&nbsp;0,&nbsp;&err);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rt=(uint8&nbsp;*)OSMboxPend(I2cWrite,&nbsp;0,&nbsp;&err);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if(Rt[0]==1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;*/<br />&nbsp;&nbsp;&nbsp;while(I2C_end==0);<br />&nbsp;&nbsp;&nbsp;if(1==I2C_end)&nbsp;return(1);<br />&nbsp;&nbsp;&nbsp;else&nbsp;return(0);<br />&nbsp;&nbsp;&nbsp;OSSemPend(I2cWrite_sem,0,&err);<br />&nbsp;&nbsp;&nbsp;/*&nbsp;Rt=(uint8&nbsp;*)OSMboxPend(I2cWrite,&nbsp;0,&nbsp;&err);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if(Rt[0]==1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;*/<br />}<br /><br /><br /><br />/****************************************************************************<br />*&nbsp;名称:IRcvByte()<br />*&nbsp;功能:向无子地址器件读取一字节数据。<br />*&nbsp;入口参数:sla&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;器件地址<br />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接收数据的变量指针<br />*&nbsp;出口参数:返回值为0时表示操作出错,为1时表示操作正确。<br />*&nbsp;说明:使用前要初始化好I2C引脚功能和I2C中断,并已使能I2C主模式<br />****************************************************************************/<br />uint8&nbsp;&nbsp;IRcvByte(uint8&nbsp;sla,&nbsp;uint8&nbsp;*dat)<br />{&nbsp;<br />&nbsp;&nbsp;&nbsp;uint8&nbsp;err;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;Rt;<br />&nbsp;/*&nbsp;参数设置&nbsp;*/<br />&nbsp;&nbsp;&nbsp;I2C_sla&nbsp;=&nbsp;sla+1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;读操作的器件地址<br />&nbsp;&nbsp;&nbsp;I2C_buf&nbsp;=&nbsp;dat;<br />&nbsp;&nbsp;&nbsp;I2C_num&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;I2C_suba_en&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;无子地址<br />&nbsp;&nbsp;&nbsp;I2C_end&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x2C;<br />&nbsp;&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;0x60;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置为主机,并启动总线<br />&nbsp;&nbsp;&nbsp;<br />/*&nbsp;Rt=(unsigned&nbsp;int)OSMboxPend(I2cMbox,&nbsp;0,&nbsp;&err);<br />&nbsp;&nbsp;&nbsp;&nbsp;if(Rt==I2C_READ_END)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;*/<br />&nbsp;&nbsp;&nbsp;while(0==I2C_end);<br />&nbsp;&nbsp;&nbsp;if(1==I2C_end)&nbsp;return(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;return(0);<br />}<br /><br /><br /><br />/****************************************************************************<br />*&nbsp;名称:IRcvStr()<br />*&nbsp;功能:向有子地址器件读取多字节数据。<br />*&nbsp;入口参数:sla&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;器件地址<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;s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数据接收缓冲区指针<br />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;no&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;读取数据个数<br />*&nbsp;出口参数:返回值为0时表示操作出错,为1时表示操作正确。<br />*&nbsp;说明:使用前要初始化好I2C引脚功能和I2C中断,并已使能I2C主模式<br />****************************************************************************/<br />uint8&nbsp;&nbsp;IRcvStr(uint8&nbsp;sla,&nbsp;uint8&nbsp;suba,&nbsp;uint8&nbsp;*s,&nbsp;uint8&nbsp;no)<br />{&nbsp;<br />&nbsp;uint8&nbsp;err;<br />&nbsp;&nbsp;unsigned&nbsp;int&nbsp;Rt;<br />&nbsp;if(0==no)&nbsp;return(0);<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;/*&nbsp;参数设置&nbsp;*/<br />&nbsp;&nbsp;&nbsp;I2C_sla&nbsp;=&nbsp;sla+1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;读操作的器件地址<br />&nbsp;&nbsp;&nbsp;I2C_suba&nbsp;=&nbsp;suba;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;I2C_buf&nbsp;=&nbsp;s;<br />&nbsp;&nbsp;&nbsp;I2C_num&nbsp;=&nbsp;no;<br />&nbsp;&nbsp;&nbsp;I2C_suba_en&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;有子地址读<br />&nbsp;&nbsp;&nbsp;I2C_end&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x2C;<br />&nbsp;&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;0x60;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置为主机,并启动总线<br />&nbsp;&nbsp;&nbsp;<br />/*&nbsp;Rt=(unsigned&nbsp;int)OSMboxPend(I2cMbox,&nbsp;0,&nbsp;&err);<br />&nbsp;&nbsp;&nbsp;&nbsp;if(Rt==I2C_READ_END)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;*/<br />&nbsp;&nbsp;&nbsp;while(0==I2C_end);<br />&nbsp;&nbsp;&nbsp;if(1==I2C_end)&nbsp;return(1);<br />&nbsp;&nbsp;&nbsp;else&nbsp;return(0);<br />}<br /><br /><br />//////////////////////////////////////////////////////////////<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_end&nbsp;=&nbsp;1;&nbsp;//此处是为了测试之用<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err=OSMboxPost(I2cWrite,(void&nbsp;*)1);<br />/////////问题是邮箱发送消息之后在中断程序结束时进入取数据中止,不知是何原因,不通过邮箱发送消息而直接通过全局变量就没任何问题.敬请周工及各位大侠指点.<br /><br />
 楼主| xkleee 发表于 2007-2-10 16:09 | 显示全部楼层

RE

顶一下,怕沉
 楼主| xkleee 发表于 2007-2-11 09:49 | 显示全部楼层

RE

再顶一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

62

帖子

0

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