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

📄 e2prom_function.c

📁 数字信号处理中的多缓冲口的AD转换编程程序,希望对大家有用
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************/
/*  Copyright 2004 by SEED Electronic Technology LTD.                         */
/*  All rights reserved. SEED Electronic Technology LTD.                      */
/*  Restricted rights to use, duplicate or disclose this code are             */
/*  granted through contract.                                                 */
/*                                                                            */
/*  MODULE NAME... Mcbsp											          */
/*  FILENAME...... comunication.c   										  */
/*  DESCRIPTION:  															  */
/*  This is an fuction which is just for comunication                             */	
/*                                                                            */
/*  作者:黄林生                                                               */
/*  版本:1.0                                                                  */
/*  日期:06.10.24                                                             */
/******************************************************************************/

/********************************************************************************/
/*																				*/
/*	Filename:	E2PROM_Function.c												*/
/*  Function:	Realize E2PROM`s writing and reading operation					*/
/*																				*/
/********************************************************************************/

#include <csl_i2c.h>

/********************************************************************************/
/* MODULE.NAME... I2C															*/
/* FUNCTIONNAME...... I2C_Write()												*/
/* DATE CREATED.. Sun 08/20/2004 												*/
/********************************************************************************/
void MyI2C_setup(I2C_Setup *Init) {

  int old_intm;
  Uint16 IPSC_calc;

  old_intm = IRQ_globalDisable();  
  
  
  /* 将下面的IRS域作了修改,让IIC模块处于复位状态,然后进行时钟的配置 */
  I2C_RSET(I2CMDR,I2C_I2CMDR_RMK(Init->free,0,0,0,1,1,Init->addrmode,0,Init->dlb,0,0,0,Init->bitbyte));
    
/* set own address */  

  I2C_RSET(I2COAR,Init->ownaddr); /* if slave, need to specify own address */
  
/* calculating the IPSC value */
   	
  IPSC_calc = (Init->sysinclock)/12;  /* must correct rounding issue */
  I2C_RSET(I2CPSC,IPSC_calc);
  
/* calculating the ICCLKL and ICCLKH register values */ 
  
  I2C_RSET(I2CCLKL,15);
  I2C_RSET(I2CCLKH,15);    
  
  /* 使能IIC模块 */
  I2C_FSET(I2CMDR,IRS,1);
    
  IRQ_globalRestore(old_intm);   

}   /* end of init  */

int MyI2C_Write(Uint16 *data,int length,int master,Uint16 slaveaddress,int transfermode,int timeout)  
{
  	int i,j,k,l,m;
  	int old_intm;  
  	Uint16 temp=1;
  
  	//old_intm = IRQ_globalDisable();  
  
  	/* set in transmit mode */
  	I2C_FSET(I2CMDR,TRX,1);
  	/* set the count register */
  	I2C_RSET(I2CCNT,length);    

  	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 */

  	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 */   
  	}
    
  	I2C_RSET(I2CDXR,*data++);  		/* put first data value in DXR */                     	
  	I2C_FSET(I2CMDR,STT,1);			/* generate start condition */
            
  	for (k=1;k<length;k++)  
  	{   							/* enter main loop for transmitting data */
    	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 */ 
    	}
    	
    	I2C_RSET(I2CDXR,*data++);  		/* put next data value in DXR */  
  	} /* end of for loop */
   
   	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 */                                                             
  	}  
  //IRQ_globalRestore(old_intm);
  return 0;
}  /* end of I2C_Write */

int MyI2C_WriteAD(Uint16 *data,Uint16 rate,int length,int master,Uint16 slaveaddress,int transfermode,int timeout)  
{
  	int i,j,k,l,m;
  	int old_intm;  
  	Uint16 temp=1;
  
  	//old_intm = IRQ_globalDisable();  
  
  	/* set in transmit mode */
  	I2C_FSET(I2CMDR,TRX,1);
  	/* set the count register */
  	I2C_RSET(I2CCNT,length);    

  	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 */

  	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 */   
  	}
    
  	I2C_RSET(I2CDXR,*data++);  		/* put first data value in DXR */                     	
  	I2C_FSET(I2CMDR,STT,1);			/* generate start condition */
            
  	for (k=1;k<length;k++)  
  	{   							/* enter main loop for transmitting data */
    	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 */ 
    	}
    	
    	I2C_RSET(I2CDXR,rate);  		/* put next data value in DXR */  
  	} /* end of for loop */
   
   	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 */                                                             
  	}  
  //IRQ_globalRestore(old_intm);
  return 0;
}  /* end of I2C_Write */

/********************************************************************************/
/* MODULE.NAME... I2C															*/
/* FUNCTIONNAME...... I2C_Read()												*/

⌨️ 快捷键说明

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