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
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
Jawaban:
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
Mengontrol periferal "cepat", yang menggunakan saluran lain untuk bertukar data. Contoh: codec.
Di PC, Sistem Operasi biasanya berinteraksi melalui I2C dengan:
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
URL referensi:
Contoh Konfigurasi Bus
Karakteristik Protokol (disederhanakan)
Contoh lalu lintas Bus
Budak Kustom
Mengapa membuat budak I2C khusus?
Bagaimana cara merancang budak I2C kustom?
Desain Master I2C
Kriteria desain utama:
Debugging: Membagi dan Taklukkan
Kendalikan langsung bus dengan perangkat ad-hoc. Contoh:
Mengintai bus dengan penganalisis logika atau pengukur lingkup / lanjutan. Contoh:
Gunakan slug-spesifik In Circuit Debugger / In Circuit Emulator.
Contoh: AVR Dragon untuk chip AVR (Arduino UNO, Nano, Mini, MiniPro)
Bajak Laut BUS
USB ke I2C Adapter
sigrok dan pulseview
logo sigrok (komponen bakend)
contoh pulseview (visualizer)
Contoh dari low end logic Analyzer
Contoh: menyetir drone 4WD
Prototipe dibangun menggunakan 2 Arduino Mini Pro.
Apa yang dilakukan budak dalam contoh?
Budak I2C:
Diagram blok tingkat tinggi dari I2C Slave.
Memilih Budak: Arduino Mini Pro
ICD khusus budak: AVR Dragon
Memilih OS: ChibiOS
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.
Periode rata-rata di antara slot enkode optik - 2 byte.
Indeks Parameter - 1 menggigit:
Indeks roda - 1 gigitan:
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]
Mobil berputar searah jarum jam.
sumber