İtme / çekme tahliye; pull-up / pull-down


49

Bir ARM Cortex yongasının veri sayfasını, özellikle GPIO bölümünü okuyorum. Sonuçta, çeşitli GPIO pinlerini SRAM'a okuma / yazma erişimi için "Alternatif İşlev" modunda kullanmak üzere yapılandırmak istiyorum.

Mevcut olan tüm GPIO kayıtlarından iki tanesini anlamıyorum: GPIO_PUPDRve GPIO_OTYPEbunlar sırasıyla "açılan / açılan kayıt" ve "çıkış tipi kayıt" dır.

Çünkü GPIO_PUPDRüç seçeneğim var:

  • Çekme veya çekme yok
  • Barfiks
  • Aşağı çek

Çünkü GPIO_0TYPEiki seçeneğim var:

  • Çıkış itme-çekme
  • Çıkış açık tahliye

Tüm farklı yapılandırmalar arasındaki fark nedir ve SRAM iletişimi için en uygun olan hangisidir?

Üzerinde çalıştığım panonun belgelerine buradan ulaşabilirsiniz (SRAM şemaları için sayfa 24'e bakınız). ARM Chip referans referansı burada bulunabilir (GPIO kayıtları için sayfa 145 ve 146'ya bakınız).


Kullandığınız SRAM ve ARM CPU veri sayfalarına model numaraları / linkler verebilir misiniz?
Dekan

@ Dean: Tabii. Sorumu iki bağlantı ile güncelledim.
Randomblue

Yanıtlar:


54

Bu cevap, işlemciler ve çevre birimleri için geneldir ve sonunda, belirli RAM ve CPU'nuzla muhtemelen ilgili olan SRAM'a özel bir yoruma sahiptir.

Çıkış pimleri üç farklı modda çalıştırılabilir:

  • açık tahliye - bir transistör alçaktan bağlanır ve başka bir şey yapmaz
  • açık tahliye, yukarı çekmeli - bir transistör düşüke ve bir direnç yüksek olana bağlı
  • itme-çekme - bir transistör yüksek, bir transistör düşüke bağlanır (bir seferde sadece biri çalıştırılır)

Giriş pinleri aşağıdakilere sahip bir geçit girişi olabilir:

  • pull-up - yüksekliğe bağlı bir direnç
  • aşağı açılır - alçakta bağlı bir direnç
  • yukarı çekme ve aşağı çekme - hem yükseklere bağlı bir direnç hem de düşüklere bağlı bir direnç (sadece nadir durumlarda kullanışlıdır).

Giriş piminin başlangıç ​​durumuna zayıf bir çekme ile çekildiği bir Schmitt tetiklenmiş giriş modu da vardır . Yalnız bırakıldığında, durumunda kalır, ancak minimum çabayla yeni bir duruma çekilebilir.

Açık tahliye, birden fazla kapı veya pim (harici veya dahili) bir çekme tertibatıyla birlikte bağlandığında kullanışlıdır. Tüm pimler yüksekse, hepsi açık devrelerdir ve çekme pimleri yüksek tutar. Herhangi bir pin düşükse, hepsi birbirine bağlandıkça düşük olurlar. Bu yapılandırma etkili bir ANDkapı oluşturur.

Bir SRAM sürerken, veri satırlarını veya adres satırlarını olabildiğince sağlam ve hızlı bir şekilde sürmek isteyebilirsiniz, böylece etkin yukarı ve aşağı sürücüye ihtiyaç duyulur, böylece itme-çekme gösterilir. Birden RAM ile Bazı durumlarda olabilir akıllıca bir şey yapmak ve başka mod daha uygun olabilir hatları, birleştirmek istiyorum.

Eğer RAM IC her zaman veri sağlıyorsa, SRAM'dan veri girişleri olan SRAM ile daha sonra, her zaman çekişi olmayan bir pim , RAM her zaman seviyeyi ayarlar ve muhtemelen yükü en aza indirir. RAM veri hatları bazen açık devre veya tristat ise, kendi geçerli durumlarını belirleyebilmeniz için giriş pinlerine ihtiyacınız olacaktır. Çok yüksek hızlı iletişim size olabilecek paralel etkili direnç sonlandırma direnci olduğunu ve otobüs boşta gerilim iki dirençler tarafından ayarlanır, ancak bu biraz uzmanı yüzden barfiks ve ve aa açılan menüyü kullanmak istiyorum.


Sadece açık olmak gerekirse, "alçaktan başka bir şeye bağlanmayan bir transistör" ile ne demek istiyorsunuz? Bir transistörde 3 pim vardır. Her pin nasıl bağlanır?
Randomblue

@Randomblue - pardon - transistör toplayıcı veya çıkış görevi görürken tahliye
Russell McMahon

"Aşağı çekme" konusundaki cevabınızı netleştirmek için, "toprak", "düşük" ve "-ve" arasındaki fark nedir?
Randomblue

Sorunuzla ilgili birçok düzenleme yaptım, lütfen hata yapmadığımı kontrol eder misiniz?
Randomblue

@Randomblue - Düzenlemeler iyi görünüyor. Başlangıçta ne yazdığımı merak ediyor mu? Sanırım ne düşündüğümü söylemiştin :-).
Russell McMahon

17

Bu cevabı STM32'den buldum GPIO Ayarlarını Anlama

  • GPIO_PuPd (Yukarı Çekme / Aşağı Çekme)

Dijital devrelerde, sinyal hatlarının asla "yüzmesine" izin verilmemesi önemlidir. Yani, her zaman yüksek veya düşük bir durumda olmaları gerekir. Yüzerken, durum saptanmaz ve birkaç farklı soruna neden olur.

Bunu düzeltmenin yolu, sinyal hattından Vcc veya Gnd'ye bir direnç eklemektir. Bu şekilde, çizgi aktif olarak yüksek veya düşük sürülmüyorsa, direnç potansiyelin bilinen bir düzeye kaymasına neden olur.

ARM (ve diğer mikrodenetleyiciler) bunu yapmak için yerleşik devrelere sahiptir. Bu şekilde, devrenize başka bir parça eklemeniz gerekmez. Örneğin, "GPIO_PuPd_UP" öğesini seçerseniz, sinyal hattı ile Vcc arasına bir direnç eklemeye eşdeğerdir.

  • GPIO_OType (Çıkış Tipi):

Push-Pull: Bu, çoğu kişinin "standart" olarak düşündüğü çıktı türüdür. Çıkış düşük olduğunda, aktif olarak toprağa "çekilir". Tersine, çıkış yüksek olarak ayarlandığında, aktif olarak Vcc'ye doğru "itilir". Basitleştirilmiş, bu gibi görünüyor: görüntü tanımını buraya girin

Bir Açık Tahliye çıkışı, diğer taraftan, yalnızca bir yönde aktiftir. Pimi zemine doğru çekebilir, ancak yukarı doğru süremez. Önceki görüntüyü, ancak üst MOSFET'in olmadığını düşünün. Toprağa çekilmediğinde, (alt taraf) MOSFET iletken değildir, bu da çıkışın yüzmesine neden olur.

Bu tür bir çıkış için, devreye alınmadığında hattın yükselmesine neden olacak, devreye eklenmiş bir direnç direnci olması gerekir. Bunu harici bir parça ile veya GPIO_PuPd değerini GPIO_PuPd_UP olarak ayarlayarak yapabilirsiniz.

İsim, MOSFET'in drenajının dahili olarak hiçbir şeye bağlı olmamasından kaynaklanıyor. Bu tür bir çıktıya MOSFET yerine BJT kullanılırken "açık kollektör" adı verilir.

  • GPIO_Speed

Temel olarak, bu çıkış sinyalinin dönüş hızını (yükselme zamanı ve düşme zamanı) kontrol eder. Çevirme hızı ne kadar hızlı olursa, devreden o kadar fazla gürültü yayılır. Çevirme hızını yavaş tutmak ve yalnızca belirli bir nedeniniz varsa, arttırmak iyi bir uygulamadır.


3

Bir tane daha küçük tid-bit: Uno gibi AVR ve Arduino ATmega328 tabanlı panolar gibi açık bir "açık tahliye" moduna sahip olmayan mikro denetleyiciler için, bu "açık tahliye" modu, bir sarmalayıcı işlevi yazılarak simüle edilebilir bu sadece bir a gönderdiğinizde bir pimi "Çıkış DÜŞÜK" olarak ayarlar ve pimi gönderirken 0"giriş DÜŞÜK" (yüksek empedans modu, dahili çekme direnci AÇIK değil) olarak yapılandırır 1. Bu şekilde aynı etkiyi elde edersiniz. Bu 32-bit ARM çekirdekli mikrodenetleyicilerin hepsi sadece çok daha fazla seçeneğe sahip.

Ayrıca, yukarıda belirtilen STM32 Referans Kılavuzunun p146'sı aşağıdakileri belirtir [eklemeler köşeli parantez içerisindedir] :

- Açık tahliye modu: Çıkış kaydındaki “0”, N-MOS'u [pimi GND'ye bağlayarak aktif olarak DÜŞÜK sürüş] özelliğini etkinleştirirken, Çıkış kaydındaki “1”, bağlantı noktasını Hi-Z (P-) konumunda bırakır. MOS asla etkinleşmez) [yüksek empedans modu - yukarı çekme veya aşağı çekme direnci olmayan kayan girişle aynı]

- İtme-çekme modu: Çıkış kaydındaki “0”, N-MOS'u [pimi GND'ye bağlayarak aktif olarak DÜŞÜK] etkinleştirirken, Çıkış kaydındaki “1” P-MOS'u [aktif olarak HIGH tahrik ederek ] etkinleştirir pin VCC]


Arduino kodunda "sarmalayıcı işlevi" şu şekilde uygulanabilir:

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);
    }
}

Veya basitleştirilmiş:

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);
    }
}

Buna Not iç pullup direnci devrede yapabileceğiniz bir Arduino tarih:

pinMode(pin, INPUT_PULLUP);

VEYA (aynı şey):

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

Ek okuma:

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.