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