Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Алгоритм программирования частоты TWI
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
LoLo
Как программируется частота TWI в AT91sam7x? Какой алгоритм?
Если можно, то функцию привести.
Georg_M_B0
Вообщето непонятно почему спрашиваете, вот из Атмеловского примера:

//------------------------------------------------------------------------------
/// Configures a TWI peripheral to operate in master mode, at the given
/// frequency (in Hz). The duty cycle of the TWI clock is set to 50%.
/// \param pTwi Pointer to an AT91S_TWI instance.
/// \param twck Desired TWI clock frequency.
/// \param mck Master clock frequency.
//------------------------------------------------------------------------------
void TWI_ConfigureMaster(AT91S_TWI *pTwi, unsigned int twck, unsigned int mck)
{
unsigned int ckdiv = 0;
unsigned int cldiv;
unsigned char ok = 0;

TRACE_DEBUG("TWI_ConfigureMaster()\n\r");
SANITY_CHECK(pTwi);

#ifdef AT91C_TWI_SVEN // TWI slave
// SVEN: TWI Slave Mode Enabled
pTwi->TWI_CR = AT91C_TWI_SVEN;
#endif
// Reset the TWI
pTwi->TWI_CR = AT91C_TWI_SWRST;
pTwi->TWI_RHR;

// TWI Slave Mode Disabled, TWI Master Mode Disabled
#ifdef AT91C_TWI_SVEN // TWI slave
pTwi->TWI_CR = AT91C_TWI_SVDIS;
#endif
pTwi->TWI_CR = AT91C_TWI_MSDIS;

// Set master mode
pTwi->TWI_CR = AT91C_TWI_MSEN;

// Configure clock
while (!ok) {
#if defined(__ARMCC_VERSION)
cldiv = ((mck / (2 * twck)) - 3) / pow(2, ckdiv);
#else
cldiv = ((mck / (2 * twck)) - 3) / power(2, ckdiv);
#endif
if (cldiv <= 255) {

ok = 1;
}
else {

ckdiv++;
}
}

ASSERT(ckdiv < 8, "-F- Cannot find valid TWI clock parameters\n\r");
TRACE_DEBUG("Using CKDIV = %u and CLDIV/CHDIV = %u\n\r", ckdiv, cldiv);
pTwi->TWI_CWGR = 0;
pTwi->TWI_CWGR = (ckdiv << 16) | (cldiv << 8) | cldiv;
}


Вызов
TWI_ConfigureMaster(AT91C_BASE_TWI, TWCK, BOARD_MCK);

TWCK частота TWI в герцах,
BOARD_MCK частота прцесора в герцах.
aaarrr
Цитата(Georg_M_B0 @ Apr 18 2011, 20:12) *
cldiv = ((mck / (2 * twck)) - 3) / pow(2, ckdiv);

Все же атмеловские индусы не перестают радовать. Двойку они в степень возводят, ога.
AHTOXA
ST-шные индусы круче, вместо банального
Код
  USARTx->BRR = apbclock / BaudRate;


наворотили вон чего:

Код
  integerdivider = ((25 * apbclock) / (4 * (BaudRate)));    
  tmpreg = (integerdivider / 100) << 4;

  fractionaldivider = integerdivider - (100 * (tmpreg >> 4));

  tmpreg |= ((((fractionaldivider * 16) + 50) / 100)) & ((uint8_t)0x0F);
  
  USARTx->BRR = (uint16_t)tmpreg;


Я очень долго искал в этом рациональное зерноsm.gif
aaarrr
Цитата(AHTOXA @ Apr 19 2011, 14:17) *
Я очень долго искал в этом рациональное зерноsm.gif

Ну, подобная конструкция и у атмеловских попадалась. Но попроще, конечно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.