#define YANSHI 60<br />void delay (uint32 i)<br />{<br /> while(--i);<br />}<br /><br />void Start_I2c()<br />{<br /> IO0DIR=(IO0DIR&0xfffffff7)|0x00000008;//SDA输出<br /> IO0SET=(IO0PIN&0xfffffff7)|0x00000008; //SDA置1<br /> delay(YANSHI);<br /> IO0SET=(IO0PIN&0xfffffffb)|0x00000004; //SCL置1<br /> delay(YANSHI);<br /> IO0CLR=(IO0PIN&0xfffffff7)|0x00000008; //SDA置0<br /> delay(YANSHI);<br /> IO0CLR=(IO0PIN&0xfffffffb)|0x00000004; //SCL置0<br /> delay(YANSHI);<br />}<br />void Stop_I2c()<br />{<br /> <br /> IO0DIR=(IO0DIR&0xfffffff7)|0x00000008;//SDA输出<br /> IO0CLR=(IO0PIN&0xfffffff7)|0x00000008;//SDA置0<br /> delay(YANSHI);<br /> IO0CLR=(IO0PIN&0xfffffffb)|0x00000004;<br /> delay(YANSHI);<br /> IO0SET=(IO0PIN&0xfffffffb)|0x00000004;//SCL置1<br /> delay(YANSHI);<br /> IO0SET=(IO0PIN&0xfffffff7)|0x00000008;//SDA置1<br /> delay(YANSHI);<br />}<br />/***********************************<br />字节数据传送函数<br />函数原理:void SendByte(uchar c);<br />功能:将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对此状态位进行操作(不应答或非应答都使ack=0 假)。<br />发送数据正常,ack=1;ack=0表示被控器无应答或损坏。<br />****************************************/<br />void SendByte(uint8 c)<br />{<br /> uint8 BitCnt;<br /> IO0DIR=(IO0DIR&0xfffffff7)|0x00000008; //SDA输出<br /> for(BitCnt=0;BitCnt<8;BitCnt++)<br /> { <br /> if((c&0x80)==0x80)<br /> IO0SET=(IO0PIN&0xfffffff7)|0x00000008;//SDA置1<br /> else <br /> IO0CLR=(IO0PIN&0xfffffff7)|0x00000008;//SDA置0<br /> delay(YANSHI);<br /> IO0SET=(IO0PIN&0xfffffffb)|0x00000004; //SCL置1<br /> delay(YANSHI);<br /> IO0CLR=(IO0PIN&0xfffffffb)|0x00000004; //SCL置0<br /> c=c<<1;<br /> }<br /> delay(YANSHI);<br /> IO0SET=(IO0PIN&0xfffffff7)|0x00000008; //SDA置1<br /> delay(YANSHI);<br /> IO0SET=(IO0PIN&0xfffffffb)|0x00000004; //SCL置1<br /> delay(YANSHI);<br /> IO0DIR=(IO0DIR&0xfffffff7); //SDA输入<br /> delay(YANSHI);<br /> sda_value=IO0PIN;<br /> if((IO0PIN&0x00000008)==0x00000008)<br /> ack=0;<br /> else<br /> ack=1;<br /> IO0CLR=(IO0PIN&0xfffffffb)|0x00000004; //SCL置0<br /> delay(YANSHI);<br />}<br />/*****************************************<br />字节数据传送函数<br />函数原形:uchar RcvByte();<br />功能:用来接收从器件传来的数据,并判断总线错误(不发应答信号),<br /> 发完后请用应答函数。<br />*******************************************/<br />uint8 RcvByte()<br />{<br /> uint8 retc;<br /> uint8 BitCnt;<br /> retc=0;<br /> IO0DIR=(IO0DIR&0xfffffff7)|0x00000008; //SDA输出<br /> IO0SET=(IO0PIN&0xfffffff7)|0x00000008; //SDA置1<br /> IO0DIR=(IO0DIR&0xfffffff7);//SDA输入<br /> for(BitCnt=0;BitCnt<8;BitCnt++)<br /> {<br /> delay(YANSHI);<br /> IO0CLR=(IO0PIN&0xfffffffb)|0x00000004; //SCL置0<br /> delay(YANSHI);<br /> IO0SET=(IO0PIN&0xfffffffb)|0x00000004; //SCL置1<br /> delay(YANSHI);<br /> retc=retc<<1;<br /> if((IO0PIN&0x00000008)==0x00000008)<br /> retc=retc+1;<br /> delay(YANSHI);<br /> }<br /> IO0CLR=(IO0PIN&0xfffffffb)|0x00000004; //SCL置0<br /> delay(YANSHI);<br /> return(retc);<br />}<br />/*******************************************<br />应答子函数<br />原形:viod Ack_I2c(bit a);<br />功能:主控器进行应答信号,(可以是应答或非应答信号)<br />**********************************************/<br />void Ack_I2c(uint8 a)<br />{<br /> IO0DIR=(IO0DIR&0xfffffff7)|0x00000008;//SDA输出<br /> if(a==1)<br /> IO0SET=(IO0PIN&0xfffffff7)|0x00000008;//SDA置1<br /> else<br /> IO0CLR=(IO0PIN&0xfffffff7)|0x00000008;//SDA置0<br /> delay(YANSHI);<br /> IO0SET=(IO0PIN&0xfffffffb)|0x00000004;//SCL置1<br /> delay(YANSHI);<br /> IO0CLR=(IO0PIN&0xfffffffb)|0x00000004;//SCL置0<br /> delay(YANSHI);<br />}<br /><br /> |
|