Как программируется частота TWI в AT91sam7x? Какой алгоритм?
Если можно, то функцию привести.
Georg_M_B0
Apr 18 2011, 16:12
Вообщето непонятно почему спрашиваете, вот из Атмеловского примера:
//------------------------------------------------------------------------------
/// 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
Apr 18 2011, 16:29
Цитата(Georg_M_B0 @ Apr 18 2011, 20:12)

cldiv = ((mck / (2 * twck)) - 3) / pow(2, ckdiv);
Все же атмеловские индусы не перестают радовать. Двойку они в степень возводят, ога.
AHTOXA
Apr 19 2011, 10:17
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;
Я очень долго искал в этом рациональное зерно
aaarrr
Apr 19 2011, 11:42
Цитата(AHTOXA @ Apr 19 2011, 14:17)

Я очень долго искал в этом рациональное зерно

Ну, подобная конструкция и у атмеловских попадалась. Но попроще, конечно.