uint8_t OPA_Cali()

in CORTEX_M0_FT32F072_KEIL/Source/Libraries/FT32F0xx_Driver/Src/ft32f0xx_opa.c [173:242]


uint8_t OPA_Cali(void)
{
  uint32_t  opadelay;
  uint32_t   outstate;
  uint8_t  CalDA, CalDB;
  uint32_t opatmp32;

  /* Enable the selected OPA peripheral */
    OPA->CR |= (uint32_t) (1<<0);

  /* Enable OP0TM */
    OPA->CR |= (uint32_t) (1<<8);

  /* OP0NSEL = 00   ,  SET TO GND */
    OPA->CR &= (uint32_t) (~(3<<13));

  /* OP0PSEL = 1   ,  SET TO GND */
    OPA->CR |= (uint32_t) ((1<<15));

  /* OP0FCAPE = 0 */
    OPA->CR &= (uint32_t) (~(1<<9));

  /* OPTODIG = 1 */
    OPA->CR |= (uint32_t) ((1<<7));

  /* OP0FR = 000 */
    OPA->CR &= (uint32_t) (~(7<<10));
  
  /* PA2 TO FLOAT */
  GPIOA ->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << ((uint16_t)2 * 2));	

  //
  /* OP0COF = 00000 */
   OPA->CR &= (uint32_t) (~(0x1F<<1));
  CalDA=0;
  opadelay=0X0FFF;
  while(opadelay--);
  outstate=OPA->CR;		// save
  while(1){
  	CalDA++;
	if(CalDA>=0x1F) break;
	opatmp32=OPA->CR&(~(0x1f<<1));
	OPA->CR=opatmp32|(CalDA<<1);
  	opadelay=0X0FFF;
	while(opadelay--);
	if((outstate^OPA->CR)&(1<<16)) break;
  }

  outstate=OPA->CR;		// save
  CalDB=CalDA;
   while(1){
   	if(0==CalDB) break;
  	CalDB--;
	opatmp32=OPA->CR&(~(0x1f<<1));
	OPA->CR=opatmp32|(CalDB<<1);
  	opadelay=0X0FFF;
	while(opadelay--);
	if((outstate^OPA->CR)&(1<<16)) break;
  }

  //
  CalDA+=CalDB;
  CalDA/=2;
  opatmp32=OPA->CR&(~(0x1f<<1));
  OPA->CR=opatmp32|(CalDA<<1);

  //
  return CalDA;

}