Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопросы по I2C (TWI)
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
EnRyo
Начнем с инициализации.

Перед тем, как использовать TWI блок, нужно выполнить три вещи:

1. Включить TWI Clock в модуле Peripheral Clock.

Делается в две строчки:
Цитата
AT91PS_PMC PMC = (AT91S_PMC*)0xFFFFFC00;
//Set Peripheral Clock Enable Register to turn on TWI power
PMC->PMC_PCER = 1<<AT91C_ID_TWI; //9 bit is a two wire interface


2. Запрограммировать PIO контроллер, так как линии TWI мультиплексируются с с линиями ввода-вывода. С этим уже сложнее, ибо в PIO три порта и куча регистров, и пока вообще непонятно что и чем там нужно устанавливать.

3. Настроить TWI Clock Generator Regsiter. С этим тоже трудности, ибо вообще непонятно чем его нужно устанавливать.
Нашел такой вот кусочек кода но тоже непонятно что он делает и зачем.
Если кто-то объяснить в чем здесь здесь соль был бы очень благодарен.
Цитата
// Configure clock
while (!ok) {
#if defined(__ARMCC_VERSION)
cldiv = ((mck / (2 * twck)) - 3) / pow(2, ckdiv);
#else
cldiv = ((mck / (2 * twck)) - 3) / pow(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;

kovigor
Цитата(EnRyo @ Mar 14 2013, 15:34) *
Если кто-то объяснить в чем здесь здесь соль был бы очень благодарен.

Давно было дело, деталей не помню. Запускал TWI на AT91SAM9XE512. Если надо, найду тот проект. Вообще-то, там нет никаких принципиальных сложностей. Даташита и книжки Редькина "Микроконтроллеры ARM7 семейства AT91SAM7 фирмы Atmel" лично мне хватило ...


Genadi Zawidowski
Ждал, думал вопрос более конкретный...
Не дождался - потому в сотый раз даю ссылку на рабочий проект (лежит в первом сообщении темы http://www.cqham.ru/forum/showthread.php?t=9688).
РАзбираться с проектами советую с помощью IDE, имеющей функцию поиска по файлам - будет понятнее, как правильно инициализировать и в каком порядке вызывать функции.
Файл с основными функциями - TWI.C. Дополнительно HARDWARE.C. Как пример с интенсивными использованием - SI570.C
Там проект под несколько процессоров - под Atmel овскиие ARMы, под STM32, ATMega. Есть запасной вариант - с "ногодрыганием".

А насчёт PIO там всё просто:
Код
/* программированеи выводов на вывод, без присоединения к периферии - открытый сток */
void
arm_hardware_pioa_opendrain(unsigned long opins, unsigned long initialstate)
{
#if CPUSTYLE_AT91SAM7

    AT91C_BASE_PMC->PMC_PCER = 1UL << AT91C_ID_PIOA; // разрешить тактированние этого блока

    AT91C_BASE_PIOA->PIO_SODR = (opins & initialstate);    // Установка единицы в регистре данных
    AT91C_BASE_PIOA->PIO_CODR = (opins & ~ initialstate);    // Установка нулей в регистре данных

    AT91C_BASE_PIOA->PIO_OER = opins;    // Разрешение выхода
    AT91C_BASE_PIOA->PIO_PPUDR = opins;    // disable pull-up resistors
    AT91C_BASE_PIOA->PIO_MDER = opins;    // 5 volt (open drain) output

#elif CPUSTYLE_ATSAM3S

    PMC->PMC_PCER0 = (1UL << ID_PIOA);

    PIOA->PIO_SODR = (opins & initialstate);    // Установка единицы в регистре данных
    PIOA->PIO_CODR = (opins & ~ initialstate);    // Установка нулей в регистре данных

    PIOA->PIO_OER = opins; // эти выводы на вывод - похоже, при работе с перииферийными устройствами не требуется.
    PIOA->PIO_PUER = opins;
    PIOA->PIO_MDER = opins;    // 5 volt (open drain) output

#elif CPUSTYLE_STM32F103

    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;    /* I/O port A clock enable */
    // Установка начального состояния битов
    GPIOA->BSRR = (GPIO_BSRR_BS0 * (initialstate & opins)) | (GPIO_BSRR_BR0 * (~ initialstate & opins));
    // Установка режима выводов
    arm_stm32f10x_hardware_pio_prog(GPIOA, opins, 1, 2);    /* CNF=2, MODE=2: Open drain, Max. output speed 2 MHz */

#else
    #error Undefined CPUSTYLE_XXX
#endif
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.