Відштовхувальний / відкритий злив; підтягування / підтягування


49

Я читаю таблицю даних мікросхеми ARM Cortex, зокрема, розділ GPIO. Зрештою, я хочу налаштувати різні штифти GPIO для використання їх у режимі «Альтернативна функція» для доступу до читання / запису до SRAM.

З усіх доступних регістрів GPIO я не розумію двох: GPIO_PUPDRа GPIO_OTYPEце відповідно "регістр підтягування / випадання" та "регістр виводу типу".

У GPIO_PUPDRмене є три варіанти:

  • Ніякого підтягування чи витягування
  • Потягни вверх
  • Тягнути вниз

У GPIO_0TYPEмене є два варіанти:

  • Вивести поштовх
  • Вихід з відкритим зливом

Яка різниця між усіма різними конфігураціями та яка була б найбільш підходяща для зв'язку SRAM?

Документація до плати, над якою я працюю, доступна тут (див. Сторінку 24 для схем SRAM). Довідковий посібник для мікросхема ARM доступний тут (див. Стор. 145 та 146 для регістрів GPIO).


Чи можете ви надати номери моделей / посилання на таблиці даних з процесором SRAM та ARM, який ви використовуєте.
Дін

@Dean: Звичайно. Я оновив своє запитання за двома посиланнями.
Randomblue

Відповіді:


54

Ця відповідь є загальною для процесорів та периферійних пристроїв, і в кінці є специфічний коментар SRAM, який, мабуть, стосується вашої конкретної оперативної пам'яті та процесора.

Вихідні штифти можна керувати в трьох різних режимах:

  • відкритий злив - транзистор підключається до низького і нічого іншого
  • відкритий злив, з підтягуванням - транзистор підключається до низького, а резистор підключається до високого
  • push-pull - транзистор підключається до високого, а транзистор підключається до низького (керується лише одним)

Вхідні штифти можуть бути вхідними воротами з:

  • підтягувач - резистор, підключений до високого
  • поворотний - резистор, підключений до низького
  • підтягування та витягування - як резистор, підключений до високого, так і резистор, підключений до низького (корисний лише у рідкісних випадках).

Існує також режим введення, що спрацьовує Шміттом, коли вхідний штифт тягнеться слабким підтягуванням до початкового стану. Залишившись одна, вона зберігається у своєму стані, але може бути виведена до нового стану з мінімальними зусиллями.

Відкритий злив корисний, коли кілька воріт або штифтів з'єднані разом із (зовнішнім або внутрішнім) підтяжкою. Якщо всі штифти високі, це всі відкриті ланцюги, і підтягувач приводить штирі високо. Якщо будь-який штифт низький, вони знижуються, коли вони зв'язалися. Ця конфігурація ефективно формує ANDворота.

Під час управління SRAM ви, мабуть, хочете рухати або рядки даних, або адресні лінії максимально міцно і швидко, так що потрібні активні диски вгору і вниз, тому вказується натискання. У деяких випадках з декількома оперативними пам'ятками ви можете зробити щось розумне і комбінувати лінії, де інший режим може бути більш підходящим.

Якщо SRAM з введеннями даних від SRAM, якщо ОЗУ оперативної пам’яті завжди стверджує дані, тоді, можливо, добре буде встановити штифт без підтягування, оскільки оперативна пам'ять завжди встановлює рівень, і це мінімізує навантаження. Якщо рядки даних оперативної пам’яті іноді мають розмикання або тристат, вам знадобляться вхідні штифти, щоб мати змогу встановити власний дійсний стан. У комунікаціях з високою швидкістю, можливо, ви хочете використовувати підтягуючий і аа-спадний, так що паралельний ефективний опір - це кінцевий опір, а напруга в холостому ході шини встановлюється двома резисторами, але це дещо спеціально.


Щоб було зрозуміло, що ви маєте на увазі під "транзистором, що підключається до низького і нічого іншого"? Транзистор має 3 штифта. Як пов'язаний кожен контактний штифт?
Випадковесвітлення

@Randomblue - вибачте - транзисторний колектор або злив, коли він виступає як вихід
Рассел Макмахон

Щоб уточнити свою відповідь на тему "тягніть вниз", яка різниця між "ґрунтом", "низьким" та "-ве"?
Randomblue

Я внесла багато змін у ваше запитання, чи можете ви, будь ласка, перевірити, чи я не помилився?
Randomblue

@Randomblue - Правки здаються гарними. Це змушує мене замислюватися про те, що я писав спочатку? Ви, здається, сказали те, що, на мою думку, думав :-).
Рассел Макмахон

17

Я знайшов цю відповідь у STM32 Розуміння налаштувань GPIO

  • GPIO_PuPd (підтяжка / пониження)

У цифрових схемах важливо, щоб сигнальні лінії ніколи не дозволяли «плавати». Тобто вони завжди повинні бути у високому або низькому стані. Під час плавання стан не визначений і викликає кілька різних типів проблем.

Спосіб виправити це - додати резистор із сигнальної лінії до Vcc чи Gnd. Таким чином, якщо лінія не ведеться активно або високо, чи низько, резистор призведе до відтоку потенціалу до відомого рівня.

АРМ (та інші мікроконтролери) мають вбудовану схему для цього. Таким чином, вам не потрібно додавати іншу частину до схеми. Якщо ви вибрали, наприклад, "GPIO_PuPd_UP", це рівнозначно додати резистор між сигнальною лінією та Vcc.

  • GPIO_OType (тип виходу):

Push-Pull: це вихідний тип, який більшість людей вважають "стандартним". Коли вихід знижується, він активно «тягнеться» на землю. І навпаки, коли вихід встановлений на високий, він активно «висувається» у бік Vcc. Спрощено, це виглядає приблизно так: введіть тут опис зображення

З іншого боку, вихід з відкритим стоком активний лише в одному напрямку. Він може тягнути штифт до землі, але він не може загнати його високо. Уявіть попереднє зображення, але без верхнього MOSFET. Коли він не тягнеться до землі, (нижня сторона) MOSFET просто не проводить, що призводить до виходу плаваючого.

Для цього виду виходу в ланцюг повинен бути доданий резистор, що підтягується, що призведе до того, що лінія буде виходити високо, коли вона не буде низькою. Це можна зробити за допомогою зовнішньої частини або встановивши значення GPIO_PuPd на GPIO_PuPd_UP.

Назва походить від того, що стік MOSFET внутрішньо ні до чого не пов'язаний. Цей тип виводу також називається "відкритим колектором" при використанні BJT замість MOSFET.

  • GPIO_Speed

В основному, це регулює швидкість повороту (час підйому і час падіння) вихідного сигналу. Чим швидше швидкість холостого ходу, тим більше шуму випромінюється від ланцюга. Це хороша практика тримати повільний показник повільно, а збільшувати його лише у випадку, якщо у вас є конкретні причини.


3

Ще один маленький охайний біт: для мікроконтролерів, які не мають чіткого режиму "відкритого зливу", таких як AVR та Arduino ATmega328 на основі плат, таких як Uno, цей режим "відкритого зливу" можна змоделювати, записавши функцію обгортки який просто встановлює штифт на "Output LOW", коли ви надсилаєте його a, 0і який налаштовує штифт як "Input LOW" (режим високого опору, внутрішній резистор НЕ включений), коли ви надсилаєте його 1. Таким чином ви отримуєте той же ефект. Ці сучасні 32-бітні ARM-ядерні мікроконтролери просто мають набагато більше варіантів.

Крім того, p146 довідкового посібника STM32, пов'язаного з вищезазначеним, визначає наступне [мої доповнення є у квадратних дужках] :

- Відкрити режим зливу: "0" у вихідному регістрі активує N-MOS [тим самим активно запускаючи LOW шляхом підключення штифта до GND], тоді як "1" у вихідному регістрі залишає порт в Hi-Z (P- MOS ніколи не активується) [режим високого опору - те саме, що плаваючий вхід без резисторів, що піднімаються або що падають]

- Режим "Push-pull": "0" у вихідному регістрі активує N-MOS [активно рухає НИЗКО за допомогою підключення штифта до GND], тоді як "1" у вихідному регістрі активує P-MOS [активно рухає ВИСОК підключенням шпильку до VCC]


У коді Ардуїно, що "функція обгортки" може бути реалізована так:

digitalWriteOpenDrain(byte pin, bool state)
{
    // Actively drive LOW
    if (state==LOW)
    {
        pinMode(pin, OUTPUT);
        digitalWrite(pin, LOW);
    }
    // High impedance mode 
    // (note that an internal or external pull-up resistor can optionally be added if you like, according to your requirements)
    else //state==HIGH
    {
        pinMode(pin, INPUT);
        digitalWrite(pin, LOW);
    }
}

Або спрощено:

digitalWriteOpenDrain(byte pin, bool state)
{
    digitalWrite(pin, LOW);

    // Actively drive LOW
    if (state==LOW)
    {
        pinMode(pin, OUTPUT);
    }
    // High impedance mode
    // (note that an internal or external pull-up resistor can optionally be added if you like, according to your requirements)
    else //state==HIGH
    {
        pinMode(pin, INPUT);
    }
}

Зауважте, що для включення внутрішнього резистора на Arduino ви можете:

pinMode(pin, INPUT_PULLUP);

АБО (те саме):

pinMode(pin, INPUT);
digitalWrite(pin, HIGH);

Додаткове читання:

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.