реклама на сайте
подробности

 
 
> Алгоритм программирования частоты TWI
LoLo
сообщение Apr 18 2011, 09:43
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 22-12-08
Пользователь №: 42 664



Как программируется частота TWI в AT91sam7x? Какой алгоритм?
Если можно, то функцию привести.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
Georg_M_B0
сообщение Apr 18 2011, 16:12
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 33
Регистрация: 1-02-07
Пользователь №: 24 958



Вообщето непонятно почему спрашиваете, вот из Атмеловского примера:

//------------------------------------------------------------------------------
/// 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 частота прцесора в герцах.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 18 2011, 16:29
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Georg_M_B0 @ Apr 18 2011, 20:12) *
cldiv = ((mck / (2 * twck)) - 3) / pow(2, ckdiv);

Все же атмеловские индусы не перестают радовать. Двойку они в степень возводят, ога.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 19 2011, 10:17
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 19 2011, 11:42
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

Ну, подобная конструкция и у атмеловских попадалась. Но попроще, конечно.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 10:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01358 секунд с 7
ELECTRONIX ©2004-2016