Bagaimana merancang dan men-debug sistem master-slave I2C khusus?

10

Bagaimana melanjutkan, ketika membutuhkan sistem master-slave I2C khusus?

Apa kriteria desain untuk diterapkan?

Apa alat debugging yang dapat digunakan untuk memecahkan masalah?

Igor Stoppa
sumber
Ini pertanyaan referensi. Saya telah menghapus beberapa komentar yang membuat ini kurang jelas. (Pertanyaan dijawab oleh penanya).
Nick Gammon

Jawaban:

10

Tutorial ini saya berikan di Konferensi Linux Tertanam mencoba untuk menjawab pertanyaan, memberikan tautan ke deskripsi yang lebih rinci dari topik yang dibahas dan menggunakan contoh praktis mengendarai drone 4WD, di mana Arduino Mini Pro bertindak sebagai budak dan mengendalikan 4 roda independen . Dokumen asli dapat ditemukan di sini .

Catatan: Jawaban ini saat ini sedang berlangsung, karena saya mengadaptasi highlight dari tautan.


Aplikasi Khas dari bus I2C

  • Berinteraksi dengan periferal yang relatif lambat. Mis: sensor, aktuator mekanik.
  • Mengontrol periferal "cepat", yang menggunakan saluran lain untuk bertukar data. Contoh: codec.

    Di PC, Sistem Operasi biasanya berinteraksi melalui I2C dengan:

    • meter suhu dan tegangan baterai;
    • pengendali kecepatan kipas;
    • codec audio.

Dalam hal beberapa pengendali bus tersedia, periferal dikelompokkan berdasarkan kecepatan, sehingga yang cepat tidak dihukum oleh yang lebih lambat.


Pengantar cepat untuk fitur kunci bus I2C

  • Serial bus.
  • Hanya 2 baris: Serial CLock dan Serial DAta (plus ground).
  • 4 kecepatan: 100kHz, 400kHz, 1MHz, 3.2MHz.
  • Biasanya, 1 perangkat master dan 1 atau lebih budak.
  • Komunikasi selalu diprakarsai oleh perangkat master.
  • Beberapa master dapat hidup berdampingan di bus yang sama (multi-master).
  • Open-Drain: SDA dan SCL membutuhkan resistor pull-up.
  • "Peregangan Jam"
    • Master mengontrol SCL, tetapi seorang budak dapat menahannya (karena drain terbuka), jika perlu menyesuaikan kecepatannya.
    • Master harus memeriksa skenario ini.
    • Seorang budak bisa macet dan macet bus: perlu untuk mengatur ulang garis dari master ke budak.
  • Biasanya pengalamatan 7-bit, tetapi juga 10 bit didukung.
  • Protokol logis: level tegangan aktual tidak ditentukan dan tergantung pada implementasi individual. Mis: 1.8V / 3.3V / 5.0V

URL referensi:

Contoh Konfigurasi Bus

Contoh Konfigurasi Bus


Karakteristik Protokol (disederhanakan)

  • 2 jenis pesan: baca dan tulis
  • Start / Stop bit - direpresentasikan sebagai "[" dan "]" di sisa jawaban
  • Alamat: 7 atau 10 bit
  • R / W bit: R = 1 / W = 0 Digunakan untuk membedakan jenis pesan yang dikirim.
  • Data di bus: (Alamat << 1 | R / W)
  • Mendaftar sebagai penangan informasi, dalam perangkat yang dipilih.

Contoh lalu lintas Bus

Contoh Lalu Lintas Bus Contoh Siklus Menulis Bus Contoh Siklus Baca Bus Bagian1 Contoh Siklus Baca Bus Bagian2


Budak Kustom

Mengapa membuat budak I2C khusus?

  • Sensor / aktuator yang diinginkan tidak tersedia dengan antarmuka I2C.
  • Lebih sedikit alamat unik yang tersedia daripada yang dibutuhkan budak.
  • Fungsi kustom yang diinginkan pada slave:
    • Reaksi semi-otonom terhadap rangsangan.
    • Memfilter / preprocessing data input.
  • Optimalisasi daya: “hub sensor” kustom berfungsi baik saat prosesor utama idle.
  • Respons waktu-nyata terhadap input.
  • [imajinasimu disini]

Bagaimana cara merancang budak I2C kustom?

  • Tetapkan persyaratan (lihat slide sebelumnya).
  • Pilih mikrokontroler atau mikroprosesor.
  • Pilih Penjadwal atau Sistem Operasi (jika ada).
  • Tentukan sub-protokol komunikasi:
    • Tentukan parameter dan perintah yang akan ditukar.
    • Atur mereka menjadi "register" dan pilih alamat gratis.

Desain Master I2C

Kriteria desain utama:

  • Berat / Dimensi.
  • Diperlukan daya komputasi dan latensi rata-rata.
  • Perangkat seperti PC
    • Perangkat tertanam, biasanya tanpa kepala.
    • Bahasa pemrograman yang disukai: ditafsirkan vs dikompilasi.
  • Ketersediaan bus / gpios untuk mengendarai budak:
    • Hanya GPIO: bitbang protokol
    • I2C: aplikasi ruang pengguna vs driver kernel.
    • Tidak ada antarmuka GPIO / I2C yang tersedia: adaptor USB ke I2C.

Debugging: Membagi dan Taklukkan

Kendalikan langsung bus dengan perangkat ad-hoc. Contoh:

  • Bajak Laut Bus (berguna juga untuk bus lain)
  • Adaptor USB to I2C Master, juga berbasiskan chip FTDI FT232R.
  • Perangkat khusus (bisa berupa proyek terpisah).
  • Mengintai bus dengan penganalisis logika atau pengukur lingkup / lanjutan. Contoh:

    • sigrok / pulseview dengan penganalisis logika yang kompatibel
    • 2-saluran lingkup / meter mandiri
    • Gunakan slug-spesifik In Circuit Debugger / In Circuit Emulator.

      Contoh: AVR Dragon untuk chip AVR (Arduino UNO, Nano, Mini, MiniPro)


Bajak Laut BUS

Bajak Laut Bus

  • Terutama untuk tujuan pengembangan.
  • Keduanya bisa mengendus bus dan mengendarainya.
  • Port antarmuka antar serial (ttyACM) konsol, termasuk makro, atau akses terprogram untuk beberapa bahasa pemrograman.
  • Resistor pullup bawaan dan sumber tegangan (5V / 3.3V)
  • Mendukung banyak protokol lain.
  • Referensi: Wikipedia , halaman utama

USB ke I2C Adapter

usbtoi2c

  • Jejak kaki kecil.
  • Cocok untuk instalasi permanen.
  • Tidak perlu koneksi khusus pada host: itu dapat digunakan untuk antarmuka dengan PC biasa.
  • Tersedia varian yang juga mampu SPI.
  • Tidak ada antarmuka konsol, hanya protokol biner seri.
  • Membutuhkan pembungkus protokol .
  • Referensi: protokol

sigrok dan pulseview

logo sigrok (komponen bakend)

sigrok

contoh pulseview (visualizer)

pulsaview

Contoh dari low end logic Analyzer

saleae

  • Standar de-facto untuk pengukuran berbasis PC di linux (tetapi juga tersedia di OS lain).
  • Dukungan untuk berbagai macam analisa logika, ruang lingkup dan meter.
  • Berbagai protokol decoder, termasuk I2C.
  • Berguna untuk memvisualisasikan sinyal logis dan kesalahan protokol debugging.
  • Bahkan sangat rendah, HW yang murah dapat memberikan dimensi baru untuk debugging.
  • Referensi: sigrok , pulseview , perangkat keras yang didukung

Contoh: menyetir drone 4WD

Prototipe dibangun menggunakan 2 Arduino Mini Pro. Dengung


Apa yang dilakukan budak dalam contoh?

Budak I2C:

  • Mengontrol jumlah torsi yang diterapkan pada setiap roda.
  • Mengontrol arah setiap roda berputar.
  • Mengukur kecepatan rotasi setiap roda melalui encoder optik (Odometer).
  • Mengekspos parameter di atas ke Master I2C.

Peran Budak

Diagram blok tingkat tinggi dari I2C Slave.


Memilih Budak: Arduino Mini Pro

MiniPro

  • Pin / fungsi yang cukup untuk menyediakan untuk setiap roda:
    • 1 output PWM dengan konfigurasi independen dari siklus tugas.
    • 1 GPIO untuk mendaftarkan input odometer sebagai IRQ.
    • 2 GPIO untuk memilih:
      • Meneruskan
      • Membalikkan
      • Diam
      • Mengunci
  • Blok I2C HW untuk pertukaran i2c yang digerakkan oleh interrupt.
  • Pin khusus untuk pemrograman berbasis SPI.
  • Jejak kaki kecil.
  • Biaya rendah.
  • Tata letak papan klon yang diwakili dalam gambar dioptimalkan untuk pemasangan pada soket DIL.

ICD khusus budak: AVR Dragon

AVR Dragon


Memilih OS: ChibiOS

ChibiOS

  • RTOS: preemption, task, semaphores, tic sistem dinamis, dll.
  • Jejak kecil: tautan hanya menggunakan kode / data.
  • Perbedaan antara RTOS dan BSP melalui HAL.
  • GPLv3 untuk penggunaan non-komersial.
  • Dikembangkan secara aktif, tetapi sudah matang.
  • Mendukung AVR 8bit.

Namun itu memiliki dukungan BSP terbatas untuk AVR, kurangnya: - menginterupsi driver untuk AVR GPIOs (ditambahkan). - Dukungan I2C untuk mode slave AVR (khusus). Yang harus dikembangkan secara terpisah sebagai bagian dari Drone SW untuk AVR .


Mendefinisikan Parameter Komunikasi

Untuk setiap roda:

  • Duty Cycle dari sinyal PWM yang digunakan untuk mengendarainya - 1 byte. 0xFF = torsi maksimum / 0x00 = tidak ada torsi.

  • Arah rotasi - 1 byte.

    • 0x00 = idle
    • 0x01 = mundur
    • 0x02 = maju
    • 0x03 = terkunci
  • Periode rata-rata di antara slot enkode optik - 2 byte.

    • Menulis apa pun akan mengatur ulang pengukuran.
  • Indeks Parameter - 1 menggigit:

    • 0 = Siklus Tugas
    • 1 = Arah
    • 2 = Periode Rata-Rata
  • Indeks roda - 1 gigitan:

    • 0 = Kiri Belakang
    • 1 = Kanan Belakang
    • 2 = Kanan Depan
    • 3 = Kiri Depan
    • 4 = Semua

Sub Protokol: Menentukan Register

Format register: 0xαβ - α = Indeks Parameter - β = Indeks Roda

Alamat (dipilih secara sewenang-wenang): 0x10

Format Pirate Bus: - [= bit awal -] = bit akhir - r = byte baca - alamat kali 2 (shift kiri 1), untuk bit R / W


Contoh - dalam Format Bajak Laut Bus

[i2c_addr reg_addr = (parm, wheel) reg_value]

[0x20 0x20 0x02]  Left Rear Forward
[0x20 0x21 0x01]  Right Rear Backward
[0x20 0x22 0x01]  Right Front Backward
[0x20 0x23 0x02]  Left Front Forward
[0x20 0x14 0xFF]  Wheels set to max torque

Mobil berputar searah jarum jam.

Igor Stoppa
sumber