⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2ceeprom.c

📁 基于 PLC935单片机的三相漏电检测系统
💻 C
字号:
#include"Reg935.h"
#include"UserDef.h"

/*******************************************************************
*                  申请总线
* 功能: 进行I2C总线的初始化----包括时钟选择,
		 I2C使能,发送起始信号等等。
*        I2EN为1,设置为主机;
		 CRSEL位为0,使用内部SCL发生器
*******************************************************************/

void GetBus()
{ 
	I2SCLH = 15;				    // 设置SCL高电平的PCLK周期数
  	I2SCLL = 15;              		//设置SCL低电平的PCLK周期数,6MHz 时为100Kbit/S 
		
    //申请成为主机,起动总线。使用内部SCL发生器,I2EN 和AA 置位
  	I2CON = RELEASE_BUS_STA; 		//I2CON = 0110 0100B = 0x64
  	while( SI==0 );        			// 等待起始位的发送
}


/*******************************************************************
*                    发送数据函数
* 功能:用于向总线发送数据 
* 入口参数:C   待发送的数据                   
*******************************************************************/

void SendByte(uchar c)
{ 
	I2DAT = c;
  	I2CON = RELEASE_BUS_ACK;    			//I2CON = 0100 0100B = 0x44 ,清除SI位等等
  	while( SI==0 );        					// 等待数据的发送
}


/*******************************************************************
*                    向有子地址器件发送多字节数据函数                 
* 功能:从启动总线到发送地址,子地址,数据,结束总线的全过程。
* 入口参数:    slvAddr--  从器件地址
*              subAddr--  子地址(从器件装载数据的地址)
*              s  --      发送内容的指针
*              num--      发送字节数
* 出口参数:   返回1 表示操作成功,否则操作有误。
********************************************************************/

bit ISendStr(uchar slvAddr, uint subAddr, uchar *s, uchar num)
{ 
	uchar i;
	uchar subAddrH, subAddrL;

	subAddrL = (subAddr & 0x00FF);
	subAddrH = (subAddr & 0xFF00)>>8;

  	GetBus();                				//启动总线  
	
  	SendByte(slvAddr & WRITE_DATA_COM);     //发送器件地址,WRITE_DATA_COM = 0 写控制

  	if( I2STAT!=0x18 )				        //已发送器件地址和写信号,并已接收应答信号
  	{ 
  		I2CON = GENERATE_STOP;
    	return(0);
  	}

  	SendByte(subAddrH);           		    //发送器件子地址高位
  	if( I2STAT!=0x28 )				        //已发送数据,并已接收应答信号
  	{ 
  		I2CON = GENERATE_STOP;				//I2CON = 0101 0100B = 0x54 ,产生停止信号
    	return(0);
  	}

	SendByte(subAddrL);           		    //发送器件子地址低位
  	if( I2STAT!=0x28 )				        //已发送数据,并已接收应答信号
  	{ 
  		I2CON = GENERATE_STOP;				//I2CON = 0101 0100B = 0x54 ,产生停止信号
    	return(0);
  	}
	
  	for(i=0; i<num; i++)
  	{ 
  		SendByte(*s);           			//发送数据
        if(I2STAT!=0x28)	                //已发送数据,并已接收应答信号
		{ 
			I2CON = GENERATE_STOP;			//I2CON = 0101 0100B = 0x54 ,产生停止信号
	  		return(0);
		}
    	s++;
  	} 

  	I2CON = GENERATE_STOP;   		        // 结束总线	
  	return(1);
}


/*******************************************************************
*                    向有子地址器件读取多字节数据函数                
*功能:从启动总线到发送地址,子地址,读数据,结束总线的全过程。
*入口参数:slvAddr--从器件地址
*          subAddr--子地址(从器件装载数据的地址)
*		   s	--  读出的内容存储区的指针
*          num--	读num个字节。
*出口参数:函数返回1表示操作成功,否则操作有误。
********************************************************************/

bit IRcvStr(uchar slvAddr, uint subAddr, uchar *s, uchar num)
{ 
	uchar i;
	uchar subAddrH, subAddrL;

	subAddrL = (subAddr & 0x00FF);
	subAddrH = (subAddr & 0xFF00)>>8;

  	GetBus();                				//启动总线		
  	
  	SendByte(slvAddr & WRITE_DATA_COM);     //发送器件地址
  	if( I2STAT!=0X18)					    //已发送器件地址和写信号,并已接收应答信号
  	{ 
  		I2CON = GENERATE_STOP;			    //I2CON = 0101 0100B = 0x54 ,产生停止信号
    	return(0);
  	}
	
  	SendByte(subAddrH);          			//发送器件子地址高位	
  	if( I2STAT!=0X28 )					    //已发送数据,并已接收应答信号
  	{ 
  		I2CON = GENERATE_STOP;				//I2CON = 0101 0100B = 0x54 ,产生停止信号
    	return(0);
  	}

	SendByte(subAddrL);          			//发送器件子地址低位	
  	if( I2STAT!=0X28 )					    //已发送数据,并已接收应答信号
  	{ 
  		I2CON = GENERATE_STOP;				//I2CON = 0101 0100B = 0x54 ,产生停止信号
    	return(0);
  	}

  	I2CON = RELEASE_BUS_STA;  			    //I2CON = 0110 0100B = 0x64 ,重新启动总线	
  	while( SI==0 );
	
  	SendByte(slvAddr | READ_DATA_COM);		//发送读数据信号
	
  	if( I2STAT!=0X40 )					    //已发送器件地址和读信号,并已接收应答信号
  	{ 
  		I2CON = GENERATE_STOP;				//I2CON = 0101 0100B = 0x54 ,产生停止信号
    	return(0);
  	} 
   
  	for(i=0; i<num-1; i++)
  	{ 
  		I2CON = RELEASE_BUS_ACK;  		    //I2CON = 0100 0100B = 0x44 ,接收一字节数据并发送应答位
    	while( SI==0 );            		    //等待接收数据
							
    	if( I2STAT!=0X50 )				    //已接收数据字节,已返回应答信号
		{ 	
			I2CON = GENERATE_STOP;		    //I2CON = 0101 0100B = 0x54 ,产生停止信号
	  		return(0);
		}
    	*s = I2DAT;               		    //读取数据
  	} 
	
    s++;
  	I2CON = RELEASE_BUS_NOACK;  		    //I2CON = 0100 0000B = 0x40 ,接收最后一字节数据并发送非应答位
  	while( SI==0 );  
  	*s = I2DAT;
  	I2CON = GENERATE_STOP;     			    //结束总线			
  	return(1);
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -