/********************************************************************************/
/* */
/* 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++)
{
FFT算法的DSP实现
5星 · 超过95%的资源 需积分: 48 54 浏览量
2011-03-14
10:50:17
上传
评论 5
收藏 119KB RAR 举报
lanfeng0425
- 粉丝: 1
- 资源: 1
- 1
- 2
前往页