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

📄 i2c.c

📁 OMAP1030 处理器的ARM 侧硬件测试代码 OMAP1030 是TI的双核处理器
💻 C
📖 第 1 页 / 共 3 页
字号:
/*-------------------------------------------------------------------------------*/

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