📄 i2c.c
字号:
/*-------------------------------------------------------------------------------*/
/* 15 values */
if (I2C_Config(speed,3,15,1) != RES_OK)
{
RES_Set(I2CERROR_DURING_CONFIG);
i2cerror=1;
}
if (I2C_Write(85,100,3,15,0,0,0) == RES_BAD)
{
RES_Set(I2CERROR_DURING_WRITE);
i2cerror=1;
}
/* Check the values written */
if (I2C_Read(85,100,3,0,0) == RES_BAD)
{
RES_Set(I2CERROR_DURING_READ);
i2cerror=1;
}
for (i=1;i<=14;i++)
{
if (I2C_Read(85,100,3+i,1,0) == RES_BAD )
{
RES_Set(I2CERROR_DURING_READ);
i2cerror=1;
}
}
/* Wait the end of the transfer by testing the interrupt bit*/
while (I2C_IrqCount != 1);
/* Test if the FIFO is not full */
if (I2CFIFO_FULL != 0)
{
RES_Set(I2CERROR_FIFO_FULL);
i2cerror=1;
}
if ( i2cerror == 1 )
return RES_BAD;
RES_Set(TEST_OK);
return RES_OK;
}
/*-------------------------------------------------------------------------------*/
/**************************************
Test 4 : Same as test number 4 but with
7, 1 and 15, 1 values
Interrupts unused
**************************************/
UWORD32 I2C_TestI2cTransferIdle(void)
{
UWORD32 i2cerror=0;
UWORD32 i;
I2CSOFT_RESET;
for(i=1;i<=10;i++) ;
I2CNO_SOFT_RESET;
for(i=1;i<=10;i++) ;
// I2C_CLOCK_ENABLE;
/*-------------------------------------------------------------------------------*/
/* Write 7 value */
if (I2C_Config(100,3,7,0) != RES_OK)
{
RES_Set(I2CERROR_DURING_CONFIG);
i2cerror=1;
}
if (I2C_Write(85,100,1,7,0,1,0) == RES_BAD)
{
RES_Set(I2CERROR_DURING_WRITE);
i2cerror=1;
}
/* Check the value written */
if (I2C_Read(85,100,1,0,1) == RES_BAD)
{
RES_Set(I2CERROR_DURING_READ);
i2cerror=1;
}
for (i=1;i<=6;i++)
{
if (I2C_Read(85,100,1+i,1,1) == RES_BAD)
{
RES_Set(I2CERROR_DURING_READ);
i2cerror=1;
}
}
/*-------------------------------------------------------------------------------*/
/* 1 values */
if (I2C_Config(100,3,1,0) != RES_OK)
{
RES_Set(I2CERROR_DURING_CONFIG);
i2cerror=1;
}
if (I2C_Write(85,100,2,1,0,1,0) == RES_BAD)
{
RES_Set(I2CERROR_DURING_WRITE);
i2cerror=1;
}
/* Check the value written */
if (I2C_Read(85,100,2,0,1) == RES_BAD)
{
RES_Set(I2CERROR_DURING_READ);
i2cerror=1;
}
/*-------------------------------------------------------------------------------*/
/* Soft reset */
I2CSOFT_RESET;
for (i=1;i<=10;i++);
I2CNO_SOFT_RESET;
/*-------------------------------------------------------------------------------*/
/* 15 values */
if (I2C_Config(100,3,15,0) != RES_OK)
{
RES_Set(I2CERROR_DURING_CONFIG);
i2cerror=1;
}
if (I2C_Write(85,100,3,15,1,1,0) == RES_BAD)
{
RES_Set(I2CERROR_DURING_WRITE);
i2cerror=1;
}
/* Write one value in the middle of the transfer to check
it isn't take into account */
I2C_Write(85,100,0xff,1,1,1,0);
if (!I2C_WaitCompletedTransfer()) RES_Set(I2CERROR_DURING_READ);
/* Check the values written */
if (I2C_Read(85,100,3,0,1) == RES_BAD)
{
RES_Set(I2CERROR_DURING_READ);
i2cerror=1;
}
for (i=1;i<=14;i++)
{
if (I2C_Read(85,100,3+i,1,1) == RES_BAD)
{
RES_Set(I2CERROR_DURING_READ);
i2cerror=1;
}
}
/*-------------------------------------------------------------------------------*/
/* Write 1 value */
I2C_Config(100,3,1,0);
if (I2C_Write(85,100,3,1,0,1,0) == RES_BAD)
{
RES_Set(I2CERROR_DURING_WRITE);
i2cerror=1;
}
/* Check the value written */
if (I2C_Read(85,100,3,0,1) == RES_BAD)
{
RES_Set(I2CERROR_DURING_READ);
i2cerror=1;
}
if ( i2cerror == 1 )
return RES_BAD;
RES_Set(TEST_OK);
return RES_OK;
}
/***************************************
Test 5 : reset Soft when FIFO not empty
What will happen ?
***************************************/
UWORD32 I2C_TestI2cSoftReset(UWORD32 speed)
{
UWORD32 i2cerror,i;
I2CSOFT_RESET;
for(i=1;i<=10;i++) ;
I2CNO_SOFT_RESET;
for(i=1;i<=10;i++) ;
// I2C_CLOCK_ENABLE;
if (I2C_Config(speed,3,7,0) != RES_OK )
{
RES_Set(I2CERROR_DURING_CONFIG);
i2cerror=1;
}
if (I2C_Write(85,100,3,7,0,1,1) == RES_BAD)
{
RES_Set(I2CERROR_DURING_WRITE);
i2cerror=1;
}
I2CNO_SOFT_RESET;
if ( i2cerror == 1 )
return RES_BAD;
RES_Set(TEST_OK);
return RES_OK;
}
/***********************************************
Test 6 : Errors on device, sub-address and data
***********************************************/
UWORD32 I2C_TestI2cErrors(UWORD32 speed)
{
UWORD32 i2cerror,i;
I2CSOFT_RESET;
for(i=1;i<=10;i++) ;
I2CNO_SOFT_RESET;
for(i=1;i<=10;i++) ;
// I2C_CLOCK_ENABLE;
/* Error on device */
if (I2C_Config(speed,3,1,0) != RES_OK)
{
RES_Set(I2CERROR_DURING_CONFIG);
i2cerror=1;
}
if (I2C_Write(10,100,20,1,0,1,0) != RES_BAD)
{
RES_Set(I2CERROR_BAD_DEVICE); /* no device error detected */
i2cerror=1;
}
/* Error on sub-address */
if (I2C_Config(speed,3,1,0) != RES_OK)
{
RES_Set(I2CERROR_DURING_CONFIG);
i2cerror=1;
}
if (I2C_Write(42,105,200,1,0,1,0) != RES_BAD)
{
RES_Set(I2CERROR_BAD_SUB_ADDRESS); /* No sub-address error detected */
i2cerror=1;
}
/* Error on data */
if (I2C_Config(speed,3,1,0) == RES_BAD)
{
RES_Set(I2CERROR_DURING_CONFIG);
i2cerror=1;
}
if (I2C_Write(42,100,101,1,0,1,0) != RES_BAD)
{
RES_Set(I2CERROR_BAD_DATA); /* No data error detected */
i2cerror=1;
}
if ( i2cerror == 1 )
return RES_BAD;
return RES_OK;
}
/*************************************************************************************************
NAME : I2C_WriteHelen
SYNOPSIS : UWORD32 I2C_WriteHelen (UWORD8 device, UWORD8 address, UWORD8 data, UWORD32 number_of_data,UWORD32 waitornot, UWORD32
polorUWORD32)
DESCRIPTION : Execute a write access on the I2C bus.
PARAMETERS : - device is the address of the select device
- address is the suRES_BADdress
- data is the data to write
- waitornot wait bus free after transfer when equal to 0.
- polorint = 1 for polling, = 0 otherwise
- test_five_parameter is 1 for test number 5 and 0 otherwise
- BYTES IS THE NUMBER OF BYTES TRANSMITTED
RETURN VALUE : the return value is RES_OK if no problem occured.
LIMITATIONS : device, address and data must be valid. waitornot must be 0 or 1.
**************************************************************************************************/
UWORD32 I2C_WriteHelen ( UWORD8 device, UWORD8 address, UWORD8 data,
UWORD32 number_of_data,UWORD32 waitornot,
UWORD32 polorint,UWORD32 test_five_parameter,UWORD16 bytes)
{
UWORD32 errdev, errdat, fifo;
UWORD16 i;
I2C_IrqCount = 0;
I2CWRITE;
I2CDEVICE(device);
I2CADDRESS(address);
fifo = I2C_WriteFifo(data,number_of_data,test_five_parameter);
if (fifo == RES_BAD) return RES_BAD;
I2CSTART;
if (waitornot == 0)
{
if (polorint == 1)
{
//we are waiting for the register is correct in reading
for (i=0;i<10;i++);
// now we are waiting for the idle mode (idle bit at 0)
for (i=0;i<TIME_TO_WAIT*(bytes+2);i++)
{
if (!I2C_IsIdle()) break;
}
if (i==TIME_TO_WAIT*(bytes + 2))
{
RES_Set(I2C_IS_IDLE_ERROR_FUNC);
return RES_BAD;
}
}
else
{
//interrupt mode
for (i=0;i<TIME_TO_WAIT*(bytes+2);i++)
{
if (I2C_IrqCount == 1) break;
}
if (i==TIME_TO_WAIT*(bytes+2))
{
RES_Set(I2C_IS_IDLE_ERROR_FUNC);
return RES_BAD;
}
}
errdev = I2C_IsErrorDevice();
errdat = I2C_IsErrorData();
if (errdev == I2C_IS || errdat == I2C_IS )
{
RES_Set(I2CERROR_DURING_WRITE);
return RES_BAD;
}
}
RES_Set(TEST_OK);
return RES_OK;
}
/*******************************************************************************
NAME : I2C_ReadHelen
SYNOPSIS : UWORD32 I2C_ReadHelen (UWORD8 device, UWORD8 address, UWORD32 simpleornot,UWORD32 polorint)
DESCRIPTION : Read Cycle
PARAMETERS : - device is the address of the select device
- address is the suRES_BADdress
- simpleornot = 1 for simple read, = 0 for combined read
- polorint = 1 for polling, = 0 otherwise
RETURN VALUE : the return value is RES_OK if no problem occured.
LIMITATIONS : device and address must be valid. simpleornot must be 0 or 1.
********************************************************************************/
UWORD32 I2C_ReadHelen (UWORD8 device, UWORD8 address,UWORD8 data, \
UWORD32 simpleornot,UWORD32 polorint)
{
UWORD32 errdev;
UWORD16 i,counter;
I2C_IrqCount = 0;
I2CDEVICE(device);
if (simpleornot == 1)
I2C_Config_read_mode(1);
else
{
I2C_Config_read_mode(0);
I2CADDRESS(address);
}
I2CSTART;
if (simpleornot) counter=2*TIME_TO_WAIT;
else counter=4*TIME_TO_WAIT;
if (polorint == 1)
{
//idle mode: first we wait the transmission
for (i=0; i<10;i++);
// now we are waiting for the idle mode (idle bit at 0)
for (i=0;i<counter;i++)
{
if (!I2C_IsIdle()) break;
}
if (i==counter)
{
RES_Set(I2C_IS_IDLE_ERROR_FUNC);
return RES_BAD;
}
}
else
{
//interrupt mode
for (i=0;i<counter;i++)
{
if (I2C_IrqCount == 1) break;
}
if (i==counter)
{
RES_Set(I2C_IS_IDLE_ERROR_FUNC);
return RES_BAD;
}
}
errdev = I2C_IsErrorDevice();
if (errdev == I2C_IS)
return RES_BAD;
if ((I2C_DATA_READ_REG) != data)
{
RES_Set(I2CERROR_DURING_READ);
return RES_BAD;
}
RES_Set(TEST_OK);
return RES_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -