//-----***-IIC延时-***-----// void IicWait(void) { _nop_();//01 _nop_();//02 _nop_();//03 _nop_();//04 _nop_();//05 _nop_();//06 _nop_();//07 _nop_();//08 _nop_();//09 _nop_();//10 _nop_();//11 _nop_();//12 //_nop_();//13 //_nop_();//14 //_nop_();//15 } //-----***-IIC启示-***-----// void IicStart(void) { IicSda=1; IicWait(); IicScl=1; IicWait(); IicSda=0; IicWait(); IicScl=0; IicWait(); } //-----***-IIC停止-***-----// void IicStop(void) { IicSda=0; IicWait(); IicScl=1; IicWait(); IicSda=1; IicWait(); } //-----***-IIC应答-***-----// void SendAcknowledge(bit ack) { IicSda=ack; IicScl=1; IicWait(); IicScl=0; IicWait(); } //-----***-从slave端读取一个数据-***-----// unsigned char IicReceiveByte(void) { unsigned char i; unsigned char bytedata=0; IicSda=1; for(i=0;i<8;i++) { IicScl=1; IicWait(); bytedata<<=1; if (IicSda) bytedata |=0x01; IicScl=0; IicWait(); } return bytedata; } //-----***-传送一个 Byte 数据到 slave-***-----// bit IicSentByte(unsigned char DataByte) { unsigned char i; bit ack; for(i=0;i<8;i++) { if(DataByte & 0x80) { IicSda=1; } else { IicSda=0; } DataByte <<=1; IicWait(); IicScl=1; IicWait(); IicScl=0; IicWait(); } IicSda=1; IicWait(); IicScl=1; IicWait(); ack=IicSda; IicScl=0; IicWait(); return ack; } //-----***-无扇区读---单字节-***-----// unsigned char FgTimeout; //读取指定器件无扇区指定地址单字节的数据 //Device=器件地址---单字节 //DataAdd=字节地址---单字节 unsigned char IicByteRead(unsigned char Device,unsigned char DataAdd) { unsigned char bytedata; EA=0; IicStart(); IicSentByte(Device); IicSentByte(DataAdd); IicStart(); IicSentByte(Device|0x01); bytedata=IicReceiveByte(); SendAcknowledge(1); IicStop(); EA=1; return bytedata; } //-----***-无扇区读---多字节-***-----// //读取指定器件无扇区指定地址多字节数据到指定地址 //Device=器件地址---单字节 //DataAdd=字节地址---单字节 void IicMuchByteRead(unsigned char Device,unsigned char DataAdd,unsigned char *DataDptr,unsigned char DataLend) { unsigned char i; EA=0; IicStart(); IicSentByte(Device); IicSentByte(DataAdd); IicStart(); IicSentByte(Device|0x01); for(i=0;i<DataLend-1;i++) { *DataDptr=IicReceiveByte(); DataDptr++; SendAcknowledge(0); } *DataDptr=IicReceiveByte(); SendAcknowledge(1); IicStop(); EA=1; } /* //-----***-有扇区读---单字节-***-----// //读取指定器件有扇区指定地址中单字节的数据 //Device=器件地址---单字节 //DataPage=扇区地址---单字节 //DataAdd=字节地址---双字节) unsigned char IicPageByteRead(unsigned char Device,unsigned char DataPage,unsigned char DataAdd) { unsigned char data bytedata; ET1=0; IicStart(); IicSentByte(Device); IicSentByte(DataPage); IicSentByte(DataAdd); IicStart(); IicSentByte(Device|0x01); bytedata=IicReceiveByte(); SendAcknowledge(1); IicStop(); ET1=1; return bytedata; } //-----***-有扇区读---多字节-***-----// //读取指定器件有扇区指定地址中的多字节数据 //Device=器件地址---单字节 //DataPage=扇区地址---单字节 //DataAdd=字节地址---双字节) void IicPageMuchByteRead(unsigned char Device,unsigned char DataPage,unsigned char DataAdd,unsigned char DataLend) //读取指定器件指定地址中的数据 { unsigned char i; ET1=0; IicStart(); IicSentByte(Device); IicSentByte(DataPage); IicSentByte(DataAdd); IicStart(); IicSentByte(Device|0x01); for(i=0;i<DataLend-1;i++) { IIcBuf=IicReceiveByte(); SendAcknowledge(0); } IIcBuf=IicReceiveByte(); SendAcknowledge(1); IicStop(); ET1=1; } */ //-----***-无扇区写---单字节-***-----// //写入指定器件无扇区指定地址中的单字节数据 //Device=器件地址---单字节 //DataAdd=字节地址---双字节 void IicByteWrite(unsigned char Device,unsigned char DataAdd,unsigned char DataByte) { unsigned char i; bit ack; if(PgIIcEn) { IicWp=0; EA=0; for(i=0;i<3;i++) { IicStart(); ack=IicSentByte(Device);if(ack==1){IicStop();continue;} ack=IicSentByte(DataAdd);if(ack==1){IicStop();continue;} ack=IicSentByte(DataByte);if(ack==1){IicStop();continue;} IicStop(); if(ack==0) { MataStData&=0xfd; break; } else { MataStData|=0x02;//硬件故障---IIC故障 } } IicWp=1; EA=1; Delay(1000); } } //-----***-无扇区写---多字节-***-----// //写入指定器件无扇区指定地址中的多字节数据 //Device=器件地址---单字节 //DataAdd=字节地址---双字节 //DataByte=被存放数据的地址 //DataLend=被存放数据的长度 void IicMuchByteWrite(unsigned char Device,unsigned char DataAdd,unsigned char *DataDptr,unsigned char DataLend) { unsigned char i,j; bit ack; if(PgIIcEn) { IicWp=0; EA=0; for(i=0;i<3;i++) { IicStart(); ack=IicSentByte(Device);if(ack==1){IicStop();continue;} ack=IicSentByte(DataAdd);if(ack==1){IicStop();continue;} for(j=0;j<DataLend;j++) { ack=IicSentByte(*DataDptr);if(ack==1){IicStop();continue;} DataDptr++; } IicStop(); if(ack==0) { MataStData&=0xfd; break; } else { MataStData|=0x02;//硬件故障---IIC故障 } } IicWp=1; EA=1; Delay(1500); } } /* //-----***-有扇区写---单字节-***-----// //写入指定器件有扇区指定地址中的单字节数据 //Device=器件地址---单字节 //DataPage=扇区地址---单字节 //DataAdd=字节地址---双字节 void IicPageByteWrite(unsigned char Device,unsigned char DataPage,unsigned char DataAdd,unsigned char DataByte) { unsigned char data i; bit ack; ET1=0; FgTimeout=1; IicWp=0; for(i=0;i<3;i++) { IicStart(); ack=IicSentByte(Device);if(ack==1){IicStop();continue;} ack=IicSentByte(DataPage);if(ack==1){IicStop();continue;} ack=IicSentByte(DataAdd);if(ack==1){IicStop();continue;} ack=IicSentByte(DataByte); if(ack==1){IicStop();continue;} IicStop(); FgTimeout=0; if(ack==0)break; } Delay(50); IicWp=1; ET1=1; } //-----***-有扇区写---多字节-***-----// //写入指定器件有扇区指定地址中的多字节数据 //Device=器件地址---单字节 //DataPage=扇区地址---单字节 //DataAdd=字节地址---双字节 //DataByte=被存放数据的地址 //DataLend=被存放数据的长度 void IicPageMuchByteWrite(unsigned char Device,unsigned char DataPage,unsigned char DataAdd,unsigned int *DataDptr,unsigned char DataLend) { unsigned char data i,j; bit ack; ET1=0; FgTimeout=1; IicWp=0; for(i=0;i<3;i++) { IicStart(); ack=IicSentByte(Device);if(ack==1){IicStop();continue;} ack=IicSentByte(DataPage);if(ack==1){IicStop();continue;} ack=IicSentByte(DataAdd);if(ack==1){IicStop();continue;} for(j=0;j<DataLend;j++) { ack=IicSentByte(*DataDptr); if(ack==1){IicStop();continue;} DataDptr++; } IicStop(); FgTimeout=0; if(ack==0)break; } Delay(50); IicWp=1; ET1=1; } */ |