作者:雁舞白沙
声明:未经本人同意禁止任何形式的转载
信箱:buaijun@yahoo.com.cn
博客:redbug.21ic.org
更多程序请参见博客...
#include <REG932.h> #include <Define.h> #include <Stdio.h> #include <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; }
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=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 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; } */ 相关链接:http://redbug.21ic.org |