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

📄 e2prom_function.c

📁 数字信号处理中的多缓冲口的AD转换编程程序,希望对大家有用
💻 C
📖 第 1 页 / 共 2 页
字号:
/* DATE CREATED.. Sun 08/20/2004 												*/
/********************************************************************************/

int MyI2C_Read(Uint16 *data,int length,int master,Uint16 slaveaddress,int transfermode,int timeout, int checkbus)  {

  	int i,j,k,m;
  	int old_intm;  
  	Uint16 temp;
  
  	//old_intm = IRQ_globalDisable();  
  
  	/* set in receive mode */
  	I2C_FSET(I2CMDR,TRX,0);
   
  	if (master==1) 
  	{
  		I2C_RSET(I2CSAR,slaveaddress); 		/* specify slave address */
  		I2C_FSET(I2CMDR,MST,1);      		/* turn master mode on */
  
  		/* setting the transfer mode */
  		if (transfermode==1) 
  		{   /* S-A-D..(n)..D-P mode */
  			I2C_FSET(I2CMDR,RM,0);
  			I2C_FSET(I2CMDR,STP,1);	 
  			I2C_RSET(I2CCNT,length);    	/* setting the data count in the ICCNT register */ 
  		}
  		else if (transfermode==2) 
  		{   /* S-A-D..(n)..D mode  (repeat n times)*/
  			I2C_FSET(I2CMDR,RM,0);
  			I2C_FSET(I2CMDR,STP,0);
  		}
  
  		else if (transfermode==3) 
  		{   /* S-A-D-D-D ... (repeat continuous) mode */
  			I2C_FSET(I2CMDR,RM,1);
  			I2C_FSET(I2CMDR,STP,0);
  		}
  
  		else 
  		{   /* if user specifies something else, go to idle mode */
  			I2C_FSET(I2CMDR,RM,0);
  			I2C_FSET(I2CMDR,STP,0);
  		}
  	}  /* end if master */
  	else 
  	{
  		I2C_FSET(I2CMDR,MST,0);  			/* if not master, set to slave */
  	}  /* end set up */   
      
  	if (checkbus==1) 
  	{	  
  		old_intm = IRQ_globalDisable(); 
  		for (i=0;i<=timeout;i++) 
  		{   								/* check for bus busy */
  			temp=I2C_FGET(I2CSTR,BB);
  			if (temp==0) break; 
  		}
  		
  		IRQ_globalRestore(old_intm);
  		if (i>=timeout)  					/* bus busy timeout error */
    	return 1;  
  	}  /* end of bus busy */
                       						/* generate start condition */
    I2C_FSET(I2CMDR,STT,1);  
                           					/* delay loop to receive data */
    for (i=0;i<32000;i++) 
    {
      	asm (" NOP");
    }
       
  	for (j=0;j<=timeout;j++)  
  	{   /* check for DRR status */
  		temp=I2C_FGET(I2CSTR,RRDY);
  		if (temp==1) break; 
  	}
    
  	if (j>=timeout) 
  	return 2;         						/* time out for receive DRR ready */ 
   
  	*data++ = I2C_RGET(I2CDRR);  			/* put first data value in DXR */
                 
  	for (k=1;k<length;k++)  				/* enter main loop for receiving data */
  	{   
      	for (i=0;i<32000;i++)  
      	{
      		asm (" NOP");
      	}
      	
  		for (m=0;m<=timeout;m++)  
  		{   /* check for DRR status */
  			temp=I2C_FGET(I2CSTR,RRDY);
  			if (temp==1) break; 
  		}
    
  		if (m>=timeout) 
  		return 4;        			 		/* time out for transmit DRR ready */ 	
  		*data++ = I2C_RGET(I2CDRR);  		/* put next data value in DXR */
  	} /* end of for loop */
                       
    for (i=0;i<32000;i++)  					/* last delay loop */
    {
      	asm (" NOP");
    }                                                                        
  //IRQ_globalRestore(old_intm); 
  return 0;  
}  /* end of I2C_Read */

/********************************************************************************/
/* MODULE.NAME... I2C															*/
/* FUNCTIONNAME...... Set_WorkMode()											*/
/* DATE CREATED.. Sun 08/20/2004 												*/
/********************************************************************************/
void Set_WorkMode(int Master, Uint16 SlaveAddress, int TransferMode )
{
	/* set in transmit mode */
  	I2C_FSET(I2CMDR,TRX,1);
  	/* set the count register */
  	I2C_RSET(I2CCNT,4);   				/* length set to 4 */
  	 
	if (Master == 1) 
  	{
    	I2C_RSET(I2CSAR,SlaveAddress); 	/* specify slave address */
    	I2C_FSET(I2CMDR,MST,1);      	/* turn master mode on */
  
  		/* setting the transfer mode */
    	if (TransferMode == 1) 
    	{   						/* S-A-D..(n)..D-P mode */
      		I2C_FSET(I2CMDR,RM,0);
      		I2C_FSET(I2CMDR,STP,1);
    	}
    	else if (TransferMode == 2) 
    	{   						/* S-A-D..(n)..D mode  (repeat n times)*/
      		I2C_FSET(I2CMDR,RM,0);
      		I2C_FSET(I2CMDR,STP,0);
    	}
    	else if (TransferMode == 3) 
    	{   						/* S-A-D-D-D ... (repeat continuous) mode */
      		I2C_FSET(I2CMDR,RM,1);
      		I2C_FSET(I2CMDR,STP,0);
    	}
    	else 
    	{   						/* if user specifies something else, go to idle mode */
      		I2C_FSET(I2CMDR,RM,0);
      		I2C_FSET(I2CMDR,STP,0);
    	}  
  	}  	/* end if master */
  	else 
  	{
    	I2C_FSET(I2CMDR,MST,0);  	/* if not master, set to slave */
  	}   /* end set up */
}

/********************************************************************************/
/* MODULE.NAME... I2C															*/
/* FUNCTIONNAME...... Judge_I2cStatus()											*/
/* DATE CREATED.. Sun 08/20/2004 												*/
/********************************************************************************/
int Judge_I2cStatus(int TimeOut)
{
	unsigned int i, m;
	int old_intm;
	Uint16 Temp = 1;
	
	old_intm = IRQ_globalDisable();
	for (i = 0; i <= TimeOut; i++)  
    {   							/* check for bus busy */
    	Temp = I2C_FGET(I2CSTR,BB);
    	if (Temp == 0) break; 
    }
  	IRQ_globalRestore(old_intm);
  	
  	if (i >= TimeOut) 
  	{  								/* bus busy timeout error */
    	//IRQ_globalRestore(old_intm);
    	return 1;
  	}  
             
  	for (m = 0; m <= TimeOut; m++)  
  	{   							/* check for DXR status before first write*/
    	Temp = I2C_FGET(I2CSTR,XRDY);
    	if (Temp == 1) break;                  
  	}
          
  	if (m >= TimeOut) 
  	{
    	//IRQ_globalRestore(old_intm);
    	return 2;         			/* time out for transmit DXR ready */   
  	}
  	return 0;
}

/********************************************************************************/
/* MODULE.NAME... I2C															*/
/* FUNCTIONNAME...... WriteSigWord_Deal()										*/
/* DATE CREATED.. Sun 08/20/2004 												*/
/********************************************************************************/
int WriteSigWord_Deal(int TimeOut)
{ 
    unsigned int i, j, l, m;
    Uint16 Temp = 1;
    
	for (i=0;i<2000;i++) 
    {
     	for(j=0;j<1000;j++)				/* delay loop */
      	{  
      		asm (" NOP");
      	}
    }             
    for (l=0;l<=TimeOut;l++)  
    {   
     	Temp=I2C_FGET(I2CSTR,NACK);		/* check for NACK status */
     	if (Temp==0) break; 
    } 
    if (l>=TimeOut) 
    { 
     	//IRQ_globalRestore(old_intm);
     	return 3;        				/* No acknowledge bit is set, NACK error */
    }

    for (m=0;m<=TimeOut;m++)  
    {   								/* check for DXR status */
     	Temp=I2C_FGET(I2CSTR,XRDY);
     	if (Temp==1) break;                
    }
      
    if (m>=TimeOut) 
    {
      	//IRQ_globalRestore(old_intm);
  	 	return 4;         				/* time out for transmit DXR ready */ 
    }
    return 0; 
}

/********************************************************************************/
/* MODULE.NAME... I2C															*/
/* FUNCTIONNAME...... LastByte_Deal()											*/
/* DATE CREATED.. Sun 08/20/2004 												*/
/********************************************************************************/
int  LastByte_Deal(int TimeOut)
{
	int i,j,l; 
  	Uint16 Temp = 1;
  	
	for (j=0;j<10;j++) 
    {    								/* last delay loop for last data transferred*/
      	for (i = 0; i < 32000; i++)  
      	{
       		asm (" NOP");
      	}
    }
    
   	for (l=0;l<=TimeOut;l++)  
    {   								/* check for NACK status for last data byte transferred*/
     	Temp = I2C_FGET(I2CSTR,NACK);
     	if (Temp == 0) break; 
    }
    
  	if (l >= TimeOut) 
  	{
      	//IRQ_globalRestore(old_intm); 
  		return 5;        				/* No acknowledge bit is set, NACK error */                                                             
  	}  
  	return 0;
}

/********************************************************************************/
/* MODULE.NAME... I2C															*/
/* FUNCTIONNAME...... I2C_WriteSigWord()										*/
/* DATE CREATED.. Sun 08/20/2004 												*/
/********************************************************************************/
int MyI2C_WriteSigWord(unsigned int OwnAdd, unsigned int data, int master, Uint16 slaveaddress, int transfermode, int timeout)
{
	unsigned int HighAdd, LowAdd;
	unsigned int HighByte, LowByte;	
	int RetValue;
	
	HighAdd = (OwnAdd & 0xFF00)>>8;
	LowAdd = OwnAdd & 0x00FF;
	
	HighByte = (data & 0xFF00)>>8;
	LowByte = data & 0x00FF;

	/* Set I2C working mode */
  	Set_WorkMode(master, slaveaddress, transfermode);
  	
  	//old_intm = IRQ_globalDisable();  
  	      
    RetValue = Judge_I2cStatus(timeout);
    if(RetValue != 0)
    return(RetValue);
    
    /* put first data value in DXR */ 
  	I2C_RSET(I2CDXR,HighAdd);
  	 
  	/* generate start condition */ 		                    	
  	I2C_FSET(I2CMDR,STT,1);			
  	
  	RetValue = WriteSigWord_Deal(timeout);
  	if(RetValue != 0)
    return(RetValue);
    
    /* put next data value in DXR */	
    I2C_RSET(I2CDXR,LowAdd);  
    
    RetValue = WriteSigWord_Deal(timeout);
  	if(RetValue != 0)
    return(RetValue);	
    
    /* put next data value in DXR */	
    I2C_RSET(I2CDXR,HighByte);	
    
    RetValue = WriteSigWord_Deal(timeout);
  	if(RetValue != 0)
    return(RetValue);
    
    /* put next data value in DXR */	
    I2C_RSET(I2CDXR,LowByte);	
    
    RetValue = LastByte_Deal(timeout);
    if(RetValue != 0)
    return(RetValue);
    
    return 0;
}	/* end of I2C_WriteSigWord */

/**************************************************************************************************/
//	No	more
/**************************************************************************************************/

⌨️ 快捷键说明

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