📄 e2prom_function.c
字号:
/* 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 + -