Tiriskan push-pull / open; pull-up / pull-down

49

Saya membaca datasheet dari chip ARM Cortex, khususnya bab GPIO. Pada akhirnya, saya ingin mengonfigurasi berbagai pin GPIO untuk menggunakannya dalam mode "Fungsi Alternatif" untuk akses baca / tulis ke SRAM.

Dari semua register GPIO yang tersedia, saya tidak mengerti dua: GPIO_PUPDRdan GPIO_OTYPEyang masing-masing merupakan "pull-up / pull-down register" dan "register tipe keluaran".

Karena GPIO_PUPDRaku punya tiga pilihan:

  • Tidak ada pull-up atau pull-down
  • Tarik
  • Menurunkan

Karena GPIO_0TYPEaku punya dua pilihan:

  • Output push-pull
  • Keluaran drainase terbuka

Apa perbedaan antara semua konfigurasi yang berbeda, dan mana yang paling sesuai untuk komunikasi SRAM?

Dokumentasi untuk papan yang saya kerjakan tersedia di sini (lihat halaman 24 untuk skema SRAM). Manual referensi untuk Chip ARM tersedia di sini (lihat halaman 145 dan 146 untuk register GPIO).

Randomblue
sumber
Bisakah Anda memberikan nomor model / tautan ke lembar data SRAM dan ARM CPU yang Anda gunakan.
Dean
@Dean: Tentu. Saya telah memperbarui pertanyaan saya dengan dua tautan.
Randomblue

Jawaban:

54

Jawaban ini umum untuk prosesor dan periferal, dan memiliki komentar spesifik SRAM di bagian akhir, yang mungkin berkaitan dengan RAM dan CPU spesifik Anda.

Pin output dapat didorong dalam tiga mode berbeda:

  • tiriskan terbuka - transistor terhubung ke rendah dan tidak ada yang lain
  • tiriskan terbuka, dengan pull-up - transistor terhubung ke rendah, dan resistor terhubung ke tinggi
  • push-pull - transistor terhubung ke tinggi, dan transistor terhubung ke rendah (hanya satu yang dioperasikan pada suatu waktu)

Pin input dapat menjadi input gerbang dengan:

  • pull-up - resistor yang terhubung ke tinggi
  • pull-down - resistor yang terhubung ke rendah
  • pull-up dan pull-down - baik resistor terhubung ke tinggi dan resistor terhubung ke rendah (hanya berguna dalam kasus yang jarang terjadi).

Ada juga a mode input yang dipicu Schmitt di mana pin input ditarik dengan pull-up yang lemah ke keadaan awal. Ketika dibiarkan sendirian itu tetap dalam keadaannya, tetapi dapat ditarik ke negara baru dengan sedikit usaha.

Saluran terbuka bermanfaat ketika banyak gerbang atau pin dihubungkan bersama dengan pull-up (eksternal atau internal). Jika semua pin tinggi, semuanya adalah sirkuit terbuka dan pull-up mendorong pin tinggi. Jika ada pin yang rendah, mereka semua menjadi rendah saat diikat. Konfigurasi ini secara efektif membentukAND gerbang.

Saat mengendarai SRAM Anda mungkin ingin menggerakkan jalur data atau jalur alamat tinggi atau rendah sekuat dan secepat mungkin sehingga diperlukan drive yang aktif naik dan turun, sehingga tarikan-tarikan ditunjukkan. Dalam beberapa kasus dengan banyak RAM Anda mungkin ingin melakukan sesuatu yang pintar dan menggabungkan garis, di mana mode lain mungkin lebih cocok.

Dengan SRAM dengan input data dari SRAM jika IC RAM selalu menyatakan data maka pin tanpa pull-up mungkin OK karena RAM selalu mengatur level dan ini meminimalkan beban. Jika jalur data RAM kadang-kadang sirkuit terbuka atau tristate Anda akan memerlukan pin input untuk dapat mengatur negara mereka sendiri yang valid. Dalam komunikasi berkecepatan sangat tinggi, Anda mungkin ingin menggunakan pull-up dan dan pull-down sehingga resistansi paralel paralel adalah resistansi terminasi, dan voltase idle bus diatur oleh dua resistor, tetapi ini agak spesialis.

Russell McMahon
sumber
Hanya untuk menjadi jelas, apa yang Anda maksud dengan "transistor yang terhubung ke rendah dan tidak ada yang lain"? Transistor memiliki 3 pin. Bagaimana setiap pin terhubung?
Randomblue
@ Randomblue - maaf - kolektor transistor atau tiriskan ketika bertindak sebagai output
Russell McMahon
Untuk mengklarifikasi jawaban Anda pada "pull down", apa perbedaan antara "ground", "low", dan "-ve"?
Randomblue
Saya telah banyak mengedit pertanyaan Anda, dapatkah Anda memeriksa bahwa saya tidak melakukan kesalahan?
Randomblue
@Randomblue - Suntingan tampaknya bagus. Itu membuat saya bertanya-tanya apa yang saya tulis pada awalnya? Anda tampaknya telah mengatakan apa yang saya pikir saya pikir :-).
Russell McMahon
17

Saya menemukan jawaban ini dari STM32 Memahami Pengaturan GPIO

  • GPIO_PuPd (Pull-up / Pull-down)

Dalam sirkuit digital, penting bahwa garis sinyal tidak pernah diizinkan untuk "mengambang". Artinya, mereka harus selalu dalam kondisi tinggi atau rendah. Saat mengambang, keadaan tidak dapat ditentukan, dan menyebabkan beberapa jenis masalah.

Cara untuk memperbaikinya adalah dengan menambahkan resistor dari jalur sinyal ke Vcc atau Gnd. Dengan begitu, jika saluran tidak sedang aktif didorong tinggi atau rendah, resistor akan menyebabkan potensi melayang ke tingkat yang diketahui.

ARM (dan mikrokontroler lainnya) memiliki sirkuit bawaan untuk melakukan ini. Dengan begitu, Anda tidak perlu menambahkan bagian lain ke sirkuit Anda. Jika Anda memilih "GPIO_PuPd_UP", misalnya, sama saja dengan menambahkan resistor antara garis sinyal dan Vcc.

  • GPIO_OType (Jenis Output):

Push-Pull: Ini adalah tipe output yang kebanyakan orang anggap sebagai "standar". Ketika output rendah, secara aktif "ditarik" ke ground. Sebaliknya, ketika output diatur ke tinggi, secara aktif "didorong" ke arah Vcc. Sederhana, tampilannya seperti ini: masukkan deskripsi gambar di sini

Output Open-Drain, di sisi lain, hanya aktif dalam satu arah. Ini dapat menarik pin ke tanah, tetapi tidak dapat mendorongnya tinggi. Bayangkan gambar sebelumnya, tetapi tanpa MOSFET atas. Ketika tidak menarik ke tanah, MOSFET (sisi bawah) hanyalah non-konduktif, yang menyebabkan output mengambang.

Untuk jenis output ini, perlu ada resistor pull-up yang ditambahkan ke sirkuit, yang akan menyebabkan garis naik tinggi ketika tidak didorong rendah. Anda dapat melakukan ini dengan bagian eksternal, atau dengan mengatur nilai GPIO_PuPd ke GPIO_PuPd_UP.

Namanya berasal dari fakta bahwa saluran MOSFET tidak terhubung secara internal dengan apa pun. Jenis output ini juga disebut "kolektor terbuka" saat menggunakan BJT, bukan MOSFET.

  • GPIO_Speed

Pada dasarnya, ini mengontrol laju perubahan tegangan (waktu naik dan turun) sinyal keluaran. Semakin cepat laju perubahan tegangan, semakin banyak noise yang dipancarkan dari sirkuit. Ini adalah praktik yang baik untuk menjaga laju perubahan tegangan lambat, dan hanya meningkatkannya jika Anda memiliki alasan tertentu.

Abhishek
sumber
3

Satu lagi sedikit tid-bit: untuk mikrokontroler yang tidak memiliki mode "saluran terbuka" yang eksplisit, seperti papan berbasis AVR dan Arduino ATmega328 seperti Uno, mode "saluran terbuka" ini dapat disimulasikan dengan menulis fungsi pembungkus yang hanya menetapkan pin ke "Output LOW" ketika Anda mengirimnya 0dan yang mengkonfigurasi pin sebagai "Input LOW" (mode impedansi tinggi, resistor pullup internal TIDAK aktif) ketika Anda mengirimnya1 . Dengan cara ini Anda mendapatkan efek yang sama. Mikrokontroler ARM-core 32-bit modern ini hanya memiliki lebih banyak opsi.

Juga, hal. 14 dari Manual Referensi STM32 yang ditautkan dengan menyatakan di atas berikut [tambahan saya adalah dalam tanda kurung] :

- Buka mode pengurasan: A "0" di register Output mengaktifkan N-MOS [sehingga secara aktif mengemudi RENDAH dengan menghubungkan pin ke GND] sedangkan "1" di register Output meninggalkan port di Hi-Z (P- MOS tidak pernah diaktifkan) [mode impedansi tinggi - sama dengan input mengambang tanpa resistor pull-up atau pull-down]

- Mode push-pull: A "0" di register Output mengaktifkan N-MOS [secara aktif menggerakkan RENDAH dengan menghubungkan pin ke GND] sedangkan "1" di register Output mengaktifkan P-MOS [secara aktif menggerakkan TINGGI dengan menghubungkan pin ke VCC]


Dalam kode Arduino, "fungsi pembungkus" dapat diimplementasikan seperti ini:

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

Atau disederhanakan:

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

Perhatikan bahwa untuk mengaktifkan resistor pullup internal pada Arduino yang dapat Anda lakukan:

pinMode(pin, INPUT_PULLUP);

ATAU (hal yang sama):

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

Bacaan tambahan:

Gabriel Staples
sumber