#i nclude <Define.h>
#i nclude <Stdio.h>
#i nclude <Intrins.h>
//起始信号
//延时等候
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
_nop_();//16
_nop_();//17
_nop_();//18
_nop_();//19
_nop_();//20
_nop_();//21
_nop_();//22
_nop_();//23
_nop_();//24
_nop_();//25
}
void IicStart(void)
{
IicSda=1;
IicWait();
IicScl=1;
IicWait();
IicSda=0;
IicWait();
IicScl=0;
IicWait();
}
//停止信号
void IicStop(void)
{
IicSda=0;
IicWait();
IicScl=1;
IicWait();
IicSda=1;
IicWait();
}
//应答信号
void SendAcknowledge(bit ack)
{
IicSda=ack;
IicScl=1;
IicWait();
IicScl=0;
IicWait();
}
//从slave端读取一个数据*/
unsigned char IicReceiveByte(void)
{
unsigned char data i;
unsigned char data 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 data 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;
}
void SendAcknowledge(bit ack)
{
IicSda=ack;
IicScl=1;
IicWait();
IicScl=0;
IicWait();
}
//从slave端读取一个数据*/
unsigned char IicReceiveByte(void)
{
unsigned char data i;
unsigned char data 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 data 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 data 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 data 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[i]=IicReceiveByte();
SendAcknowledge(0);
}
IIcBuf[i]=IicReceiveByte();
SendAcknowledge(1);
IicStop();
ET1=1;
}
*/
//无扇区写---单字节
//写入指定器件无扇区指定地址中的单字节数据
//Device=器件地址---单字节
//DataAdd=字节地址---双字节
void IicByteWrite(unsigned char Device,unsigned char DataAdd,unsigned char DataByte)
{
unsigned char data i;
bit ack;
EA=0;
IicWp=0;
Delay(50);
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)break;
}
IicWp=1;
EA=1;
Delay(500);
}
//无扇区写---多字节
//写入指定器件无扇区指定地址中的多字节数据
//Device=器件地址---单字节
//DataAdd=字节地址---双字节
//DataByte=被存放数据的地址
//DataLend=被存放数据的长度
void IicMuchByteWrite(unsigned char Device,unsigned char DataAdd,unsigned char *DataDptr,unsigned char DataLend)
{
unsigned char data i,j;
bit ack;
EA=0;
IicWp=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)break;
}
IicWp=1;
EA=1;
Delay(500);
}
/*
//有扇区写---单字节
//写入指定器件有扇区指定地址中的单字节数据
//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;
}
*/
//无扇区读---单字节
//读取指定器件无扇区指定地址单字节的数据
//Device=器件地址---单字节
//DataAdd=字节地址---单字节
unsigned char IicByteRead(unsigned char Device,unsigned char DataAdd)
{
unsigned char data 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 data 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[i]=IicReceiveByte();
SendAcknowledge(0);
}
IIcBuf[i]=IicReceiveByte();
SendAcknowledge(1);
IicStop();
ET1=1;
}
*/
//无扇区写---单字节
//写入指定器件无扇区指定地址中的单字节数据
//Device=器件地址---单字节
//DataAdd=字节地址---双字节
void IicByteWrite(unsigned char Device,unsigned char DataAdd,unsigned char DataByte)
{
unsigned char data i;
bit ack;
EA=0;
IicWp=0;
Delay(50);
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)break;
}
IicWp=1;
EA=1;
Delay(500);
}
//无扇区写---多字节
//写入指定器件无扇区指定地址中的多字节数据
//Device=器件地址---单字节
//DataAdd=字节地址---双字节
//DataByte=被存放数据的地址
//DataLend=被存放数据的长度
void IicMuchByteWrite(unsigned char Device,unsigned char DataAdd,unsigned char *DataDptr,unsigned char DataLend)
{
unsigned char data i,j;
bit ack;
EA=0;
IicWp=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)break;
}
IicWp=1;
EA=1;
Delay(500);
}
/*
//有扇区写---单字节
//写入指定器件有扇区指定地址中的单字节数据
//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;
}
*/