Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: EP9302: как работает GPIO?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
AVR
Здравствуйте!
Прошу прощения за возможно глупый вопрос... (по сайту искал, гуглил...)
В документации на EP93XX пишется что GPIO тактируется частотой 14 с чем-то МГц, а сам контроллер работает на 200 МГц. Искал в документации ответ на такой вопрос, но так и не нашел: если состояние выводов обновляется с частотой 14 МГц, а контроллер работает на 200 МГц, то как осуществляется синхронизация чтобы можно было быстро вываливать следующее значение на порт как только будет выдано старое значение на выводы?..
Провел маленький эксперимент, но не могу самому себе объяснить результаты:
CS-EP9302 подключена к Altera-DE1 через шлейфик к портам A, B и F. В Cyclone II прошивка, которая считает число фронтов на одном из выводов порта A и выводит это число на светодиоды. На ARM'е крутится linux, работа с GPIO осуществляется из драйвера, в старотовый код которого вставлен такой фрагмент:
Код
__raw_writeb(0xFF, GPIO_PADDR);
for(i = 0; i < 16; i++)
{
    __raw_writeb(0xFF, GPIO_PADR);
    __raw_writeb(0x00, GPIO_PADR);
    __raw_writeb(0xFF, GPIO_PADR);
    __raw_writeb(0x00, GPIO_PADR);
    __raw_writeb(0xFF, GPIO_PADR);
    __raw_writeb(0x00, GPIO_PADR);
    asm("nop");
    asm("nop");
    asm("nop");
    __raw_writeb(0xFF, GPIO_PADR);
    __raw_writeb(0x00, GPIO_PADR);
}
Код генерирует ровно 64 такта, и что удивительно, ПЛИСка исправно ловит ровно 64 такта. Если добавить немного nop'ов чтобы привнести мешающую задержку, то все равно ловится 64 такта... Возможно nop'ы выбрасываются, но всё равно ведь для операция записи константы в порт потребуется тактов меньше чем имеется в запасе до следующего обновления состояния портов... или не так?

1) Почему получается такой результат? Процессор приостанавливается на момент вывода в порт и ждет пока он обновится?
2) Как заставить GCC вывести ассемблерный листинг (чтобы посмотреть что там нагенерировалось) если сборка драйвера осуществляется таким способом: make -C $KDIR SUBDIRS=$DIR modules ?
sensor_ua
Ядро подключено к GPIO через Peripheral Bus через Bus Bridge со всеми вытекающими последствиями. И не только к GPIO доступ по такой медленной шине, но и к остальной периферии (кроме USB и Ethernet MAC). Зато есть 12 каналов DMA
aaarrr
Хочу только уточнить, что шина APB отнюдь не медленная - 50MHz все-таки.
asen
У меня тож есть вопрос по теме я пытаюсь на EP9302 использовать на выход порты H ну как я не пытался в регитор данных записывать данные на выходе все время высокоимпедансное состояние может эти порты работают только на вход? или я их перегрел при пайке или я просто туплю ? код вот :
PHDDR =0xffff;
for (;;)
{
PHDR |=0xff;
Delay(100000);
PHDR =0x00;
Delay(100000);
}
aaarrr
Цитата(asen @ Mar 1 2008, 17:14) *
У меня тож есть вопрос по теме я пытаюсь на EP9302 использовать на выход порты H ну как я не пытался в регитор данных записывать данные на выходе все время высокоимпедансное состояние

Похоже, что бит HonIDE (DeviceCfg.11) сброшен.
asen
А разве в EP9302 оно вляяет на работу Порта Н ? почемуто туда даже не пишеться пушу туда а значение не меняеться !

DeviceCfg =1<<11;
aaarrr
Цитата(asen @ Mar 1 2008, 20:32) *
А разве в EP9302 оно вляяет на работу Порта Н ?

Влияет.

Цитата(asen @ Mar 1 2008, 20:32) *
почемуто туда даже не пишеться пушу туда а значение не меняеться !

DeviceCfg =1<<11;

SysSWLock записать забыли, наверное.
asen
Все заработало!!! Огромное спасибо в очередной раз! как все не просто в этом мире !!!
AVR
Цитата(aaarrr @ Mar 1 2008, 15:17) *
Хочу только уточнить, что шина APB отнюдь не медленная - 50MHz все-таки.
50 МГц в 3,5 раза больше чем 14 МГц, но синхронность всё равно соблюдается... По всей видимости имеются циклы ожидания и таким образом получается что у меня не выйдет выставить быстро порт А, порт Б, а на ножку порта F выдать фронт или спад, т.е. каждая запись в порт будет замедлять работу всего до 14 МГц... crying.gif
Большое спасибо за Ваши ответы, кажется прояснил ситуацию...
aaarrr
Цитата(AVR @ Mar 1 2008, 23:37) *
50 МГц в 3,5 раза больше чем 14 МГц, но синхронность всё равно соблюдается...

Если честно, я не припоминаю привязки к 14МГц. Где это упоминалось?

А вот частота PCLK и размерность данных при обращении к PxDR на скорость работы влияли.
К сожалению, реальные цифры раньше среды сказать не смогу - нет доступной железки.
sensor_ua
Цитата
я не припоминаю привязки к 14МГц. Где это упоминалось?

Не имею радости использования EP9302, но имею документ EPЗ9302_PP3.pdf
aaarrr
Цитата(sensor_ua @ Mar 2 2008, 01:08) *
Не имею радости использования EP9302, но имею документ EPЗ9302_PP3.pdf

Рад за Вас. И на какой же странице упоминается тактирование GPIO?
AVR
Цитата(aaarrr @ Mar 2 2008, 01:19) *
Рад за Вас. И на какой же странице упоминается тактирование GPIO?
Действительно, в EP93xx_Users_Guide_UM1.pdf нашел картинку 5-3 Bus Clock Generation, там показано что Pripheral Clock может быть MAX = 50 MHz... smile.gif
С толку сбивает то что картинке в даташите GPIO висит на одной шине с остальными периферийными штуковинами, а максимум тактовой для них судя по таблице 5-3 исходные 14 МГц, правда сам GPIO там не упоминается... smile.gif
aaarrr
По спецификации одна запись через APB занимает два такта PCLK. Т.е. максимальная частота "ногодрыганья" должна составить 50 / 4 = 12.5MHz.
aaarrr
Цитата(aaarrr @ Mar 2 2008, 11:43) *
максимальная частота "ногодрыганья" должна составить 50 / 4 = 12.5MHz.

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