_ATTR_DRIVER_CODE_ BOOL TimerPeriodSet( UINT32 usTick, uint32 nsTick) { UINT32 count,Pclk; BOOL Retval = TRUE; TimerusTickBak = usTick; TimernsTickBak = nsTick; Pclk = GetPclkFreq(); count = (Pclk * usTick + Pclk * nsTick / 1000)/1000; if(count > 0x00ffffff) { count = 0x00ffffff; Retval = FALSE; } /* Disable the timer ,usermode,mask*/ TimerDisable(); Timer->ControlReg |= TIMR_USER_MODE; Timer->LoadCountRegister = count; /* free mode and enable the timer £¬not mask*/ TimerEnable(); return Retval; }
/* -------------------------------------------------------------------------------- Function name : I2CSetSpeed(UINT16 speed) Author : yangwenjie Description : Input : speed -- unit is k,for example 400 is mean 400k Return :TRUE -- success FALSE -- failure History: <author> <time> <version> yangwenjie 2009-1-14 Ver1.0 desc: ORG -------------------------------------------------------------------------------- */ BOOL I2CSetSpeed(eI2C_CHANNEL i2cPort,UINT16 speed) { UINT32 exp; UINT32 rem; UINT32 scalespeed; UINT32 freqbase; I2CReg_t * pReg; pReg = I2CPORT(i2cPort); pReg->I2C_OPR &= ~( I2C_OPR_ENABLE); freqbase = (GetPclkFreq()*1000) / 5;//by YWJ 04.19 scalespeed = speed << 3; // speed以K为单位 (rem+1)<=8 ,先以8来确定exp for (exp = 0;exp < 7;exp++) { scalespeed = scalespeed << 1; if (scalespeed > freqbase) { break; } } rem = (freqbase) / speed / (1 << (exp + 1))/* - 1*/; pReg->I2C_OPR &= ~(I2C_OPR_DIV_SPEED_MASK); pReg->I2C_OPR |= ((rem << 3) | exp); pReg->I2C_OPR |= I2C_OPR_ENABLE; return TRUE; }