- Apa itu Protokol Komunikasi I2C?
- Bagaimana Komunikasi I2C Bekerja?
- Di mana Menggunakan Komunikasi I2C?
- I2C di Nuvoton N76E003 - Persyaratan Perangkat Keras
- Menghubungkan AT24LC64 dengan Nuvoton N76E003 - Diagram Sirkuit
- Pin I2C di Nuvoton N76E003
- Komunikasi I2C di N76E003
- Pemrograman N76E003 untuk Komunikasi I2C
- Mem-flash Kode dan Output
Dalam sistem aplikasi tertanam yang luas, tidak ada mikrokontroler yang dapat melakukan semua aktivitas dengan sendirinya. Pada beberapa tahap, ia harus berkomunikasi dengan perangkat lain untuk berbagi informasi, ada banyak jenis protokol komunikasi untuk berbagi informasi ini, tetapi yang paling banyak digunakan adalah USART, IIC, SPI, dan CAN. Setiap protokol komunikasi memiliki kelebihan dan kekurangannya masing-masing. Mari fokus pada bagian IIC untuk saat ini karena itulah yang akan kita pelajari dalam tutorial ini. Jika Anda baru di sini, lihat Tutorial Nuvoton di mana kami telah membahas setiap perangkat Mikrokontroler N76E003 dari tutorial memulai yang paling dasar. Jika Anda ingin mempelajari cara menggunakan I2C dengan mikrokontroler lain, Anda dapat melihat tautan di bawah ini.
- Cara menggunakan I2C di Arduino: Komunikasi antara dua Papan Arduino
- Komunikasi I2C dengan Mikrokontroler PIC PIC16F877
- Interfacing LCD 16X2 dengan ESP32 menggunakan I2C
- Komunikasi I2C dengan MSP430 Launchpad
- Interfacing LCD dengan NodeMCU tanpa menggunakan I2C
- Cara menangani multi komunikasi (I2C SPI UART) dalam satu program Arduino
I2C adalah protokol komunikasi penting yang dikembangkan oleh Philips (sekarang NXP). Dengan menggunakan protokol I2C ini, MCU dapat dihubungkan dengan beberapa perangkat dan memulai komunikasi. I2C bekerja hanya dengan dua kabel, yaitu SDA dan SCL. Dimana SDA adalah singkatan dari Serial data dan SCL adalah singkatan dari Serial Clock. Namun, kedua pin ini memerlukan resistor pull-up ke level tegangan VCC dan dengan resistor pull-up yang memadai, bus dapat mendukung 127 perangkat dengan alamat yang unik.
Apa itu Protokol Komunikasi I2C?
Istilah IIC adalah singkatan dari " Inter Integrated Circuits ". Biasanya dilambangkan sebagai I2C atau I kuadrat C atau bahkan sebagai protokol antarmuka 2-kabel (TWI) di beberapa tempat tetapi semuanya berarti sama. I2C adalah protokol komunikasi sinkron yang berarti, kedua perangkat yang berbagi informasi harus berbagi sinyal jam yang sama. Ia hanya memiliki dua kabel untuk berbagi informasi yang satu digunakan untuk sinyal clock dan yang lainnya digunakan untuk mengirim dan menerima data.
Bagaimana Komunikasi I2C Bekerja?
Komunikasi I2C pertama kali diperkenalkan oleh Phillips. Seperti yang dikatakan sebelumnya, ia memiliki dua kabel, kedua kabel ini akan dihubungkan di dua perangkat. Di sini satu perangkat disebut master dan perangkat lainnya disebut budak. Komunikasi harus dan akan selalu terjadi antara dua, Tuan dan Budak. Keuntungan dari komunikasi I2C adalah lebih dari satu slave dapat dihubungkan ke Master.
Komunikasi lengkap terjadi melalui dua kabel ini yaitu, Serial Clock (SCL) dan Serial Data (SDA).
Serial Clock (SCL): Membagikan sinyal clock yang dihasilkan oleh master dengan budak
Serial Data (SDA): Mengirim data ke dan dari antara Master dan slave.
Pada waktu tertentu, hanya master yang dapat memulai komunikasi. Karena ada lebih dari satu budak di dalam bus, majikan harus merujuk ke setiap budak menggunakan alamat yang berbeda. Ketika ditujukan hanya salep dengan alamat tertentu yang akan membalas kembali dengan informasi sementara yang lain diam. Dengan cara ini, kita dapat menggunakan bus yang sama untuk berkomunikasi dengan banyak perangkat.
Di mana Menggunakan Komunikasi I2C?
Komunikasi I2C hanya digunakan untuk komunikasi jarak pendek. Hal ini tentu dapat diandalkan sampai batas tertentu karena memiliki pulsa jam tersinkronisasi untuk membuatnya pintar. Protokol ini terutama digunakan untuk berkomunikasi dengan sensor atau perangkat lain yang harus mengirimkan informasi ke master. Ini sangat berguna ketika mikrokontroler harus berkomunikasi dengan banyak modul pendukung lainnya dengan menggunakan kabel minimum. Jika Anda mencari komunikasi jarak jauh, Anda harus mencoba RS232 dan jika Anda mencari komunikasi yang lebih andal, Anda harus mencoba protokol SPI.
I2C di Nuvoton N76E003 - Persyaratan Perangkat Keras
Sebagai persyaratan dari proyek ini adalah untuk mempelajari komunikasi I2C menggunakan N76E003, kita akan menggunakan EEPROM yang akan dihubungkan dengan jalur data I2C. Kami akan menyimpan beberapa data ke dalam EEPROM dan juga membacanya dan menampilkannya menggunakan layar UART.
Karena nilai yang disimpan akan dicetak di UART, semua jenis konverter USB ke UART diperlukan. Anda juga dapat melihat tutorial tentang UART dengan Nuvoton jika Anda baru mengenal komunikasi UART di N76E003. Untuk aplikasi kami, kami akan menggunakan konverter UART ke USB CP2102. Selain di atas, kami juga membutuhkan komponen-
- EEPROM 24C02
- 2 buah resistor 4.7k
Belum lagi selain komponen-komponen di atas, kita membutuhkan development board berbasis mikrokontroler N76E003 serta Nu-Link Programmer. Selain itu, kabel papan tempat memotong roti dan kabel pengait juga diperlukan untuk menghubungkan semua komponen.
Menghubungkan AT24LC64 dengan Nuvoton N76E003 - Diagram Sirkuit
Seperti yang dapat kita lihat pada skema di bawah ini, EEPROM terhubung dalam jalur I2C bersama dengan dua resistor pull up. Di sisi paling kiri, koneksi antarmuka pemrograman ditampilkan.
Saya menggunakan papan tempat memotong roti untuk IC AT24LC64 dan menghubungkan IC ke papan programmer nuvoton saya menggunakan kabel jumper. Pengaturan perangkat keras saya bersama dengan programmer nu-ink ditunjukkan di bawah ini.
Pin I2C di Nuvoton N76E003
Diagram pin N76E003 dapat dilihat pada gambar di bawah ini-
Seperti yang bisa kita lihat, setiap pin memiliki spesifikasi yang berbeda dan setiap pin dapat digunakan untuk berbagai keperluan. Namun, pin 1.4 digunakan sebagai pin I2C SDA, itu akan kehilangan PWM dan fungsionalitas lainnya. Tapi itu bukan masalah karena fungsionalitas lain tidak diperlukan untuk proyek ini. Hal yang sama akan terjadi untuk P1.3 adalah pin SCL dari I2C.
Karena pin I2C bertindak sebagai GPIO, maka perlu dikonfigurasi. Semua pin GPIO dapat dikonfigurasi dalam mode yang dijelaskan di bawah ini.
Sesuai lembar data, PxM1.n dan PxM2. n adalah dua register yang digunakan untuk menentukan operasi kontrol port I / O. Dalam lembar data, disebutkan bahwa untuk menggunakan fungsionalitas I2C, mode I / O perlu digunakan sebagai saluran terbuka untuk komunikasi terkait I2C.
Komunikasi I2C di N76E003
Periferal I2C merupakan hal penting untuk setiap unit mikrokontroler yang mendukung fitur I2C. Banyak jenis mikrokontroler yang berbeda dilengkapi dengan periferal I2C built-in. Namun, dalam beberapa kasus, I2C dapat dikonfigurasi secara manual menggunakan kontrol perangkat lunak di mana dukungan perangkat keras terkait I2C tidak tersedia (Misalnya, banyak mikrokontroler 8.051). Namun, nuvoton N76E003 hadir dengan dukungan periferal I2C.
M76E003 mendukung empat jenis operasi dalam mode I2C - Master Transmitter, Master Receiver, Slave Transmitter, dan Slave Receiver. Ini juga mendukung kecepatan standar (100kbps) dan cepat (hingga 400kbps) untuk jalur I2C. I2C bekerja dengan beberapa aturan umum di jalur sinyal SCL dan SDA.
Kondisi Mulai dan Berhenti:
Ini adalah hal penting dalam komunikasi I2C. Ketika data ditransfer ke jalur I2C, itu dimulai dengan kondisi awal dan diakhiri dengan kondisi berhenti.
Kondisi start adalah transisi tinggi-ke-rendah pada SDA ketika garis SCL tinggi dan kondisi berhenti adalah transisi rendah-ke-tinggi pada SDA ketika garis SCL tinggi. Kedua kondisi ini dihasilkan oleh master (MCU atau apapun yang mengendalikan perangkat pendukung lainnya). Jalur bus tetap sibuk pada keadaan ini ketika kondisi mulai dimulai dan tetap bebas lagi ketika kondisi berhenti dimulai.
Kondisi Mulai dan Berhenti ditampilkan dengan sangat baik dalam perspektif sinyal di lembar data N76E003-
Alamat 7-Bit dengan Format Data:
N76E003 mendukung alamat 7-bit dan format data. Setelah kondisi start dimulai, perangkat master perlu mengirim data ke jalur I2C. Data pertama adalah yang penting. Jika data ini tidak dibuat atau dikirim dengan benar, perangkat yang terhubung tidak akan diidentifikasi dan komunikasi lebih lanjut tidak dapat dilakukan.
Data terdiri dari alamat slave sepanjang 7-bit, dilambangkan sebagai SLA. Alamat panjang 7-bit ini harus unik untuk setiap perangkat jika beberapa perangkat terhubung di bus. Setelah alamat 7-bit, bit ke-8 adalah bit arah data. Artinya, bergantung pada bit ke-8, master mengirimkan informasi ke perangkat slave tentang apakah data akan ditulis di perangkat slave atau data akan dibaca dari perangkat slave. Bit ke-8 adalah bit R / W yang disebut sebagai Notifier Baca atau Tulis. Seperti kita ketahui informasi 8-bit dapat terdiri dari 128 jenis, sehingga mendukung 128 perangkat, tetapi I2C mendukung 127 jenis perangkat pada bus yang sama tetapi tidak 128. Karena alamat 0x00 adalah alamat yang dicadangkan yang disebut alamat panggilan umum. Jika master ingin mengirim informasi ke semua perangkat,itu akan membahas 0x00 dan setiap perangkat akan memutar ulang dengan cara yang sama sesuai konfigurasi perangkat lunak individu.
Jadi, transmisi datanya terlihat seperti di bawah ini-
Mengakui:
Pada gambar alamat data di atas, bit ke-9 diikuti oleh bit R / W disebut bit pengakuan. Ini penting karena menggunakan bit ini, master atau slave menanggapi pemancar data dengan menarik garis SDA rendah. Untuk mendapatkan bit pengakuan, pemancar harus melepaskan jalur SDA.
Pemrograman N76E003 untuk Komunikasi I2C
Program lengkap yang digunakan dalam tutorial ini dapat ditemukan di bagian bawah halaman ini. Penjelasan segmen penting dalam kode adalah sebagai berikut-
Tetapkan Pin sebagai Open Drain dan Konfigurasikan untuk I2C:
Mari kita mulai dengan bagian pin I2C terlebih dahulu. Seperti dijelaskan sebelumnya, port I2C SCL dan SDA perlu dikonfigurasi dan ditetapkan sebagai konfigurasi saluran terbuka. Untuk melakukan hal ini, kita menggunakan file header I2C.h bersama dengan file sumber I2C.c . Potongan kodenya terlihat seperti ini-
lakukan {P13_OpenDrain_Mode; P14_OpenDrain_Mode; clr_I2CPX;} sementara (0)
Kode di atas adalah setting P13 dan P14 sebagai pin Open-Drain dan clr_I2CPX digunakan untuk memilih P13 dan P14 sebagai pin SCL pada P1.3 dan pin SDA pada P1.4.
I2CPX ini adalah bit ke-0 dari register kontrol I2C I2CON. Jika I2C_PX ini diset sebagai 1, pin diubah menjadi P0.2 sebagai SCL dan P1.6 sebagai SDA. Namun, kami akan menggunakan P13 dan P14. Pin alternatif tidak digunakan di sini.
I2C Control Register I2CON:
Register kontrol I2C I2CON digunakan untuk mengontrol operasi I2C. Bit pertama adalah bit pemilihan pin I2C. Pengaturan itu 0 mengkonfigurasi pin I2C sebagai P13 dan P14.
Bit AA adalah tanda pengakuan pengakuan, jika tanda AA diatur, ACK akan dikembalikan selama pulsa jam yang diakui dari garis SCL. Jika dihapus, NACK (level tinggi pada SDA) akan dikembalikan selama pulsa clock yang diakui dari jalur SCL.
Bit berikutnya adalah SI yang merupakan interupsi status I2C. Jika Interupsi Status I2C diaktifkan, pengguna harus memeriksa register I2STAT untuk menentukan langkah mana yang telah dilalui dan harus mengambil tindakan.
STO adalah tanda STOP yang disetel dalam mode master. STO secara otomatis dihapus oleh perangkat keras setelah kondisi STOP terdeteksi.
Bit berikutnya adalah bit STA. Jika flag ini diset, maka I2C menghasilkan kondisi START jika busnya bebas. Jika bus sibuk, I2C menunggu kondisi STOP dan menghasilkan kondisi START berikut. Jika STA diset saat I2C sudah dalam mode master dan satu atau lebih byte telah dikirim atau diterima, I2C menghasilkan kondisi START berulang. STA perlu dihapus secara manual oleh perangkat lunak.
Yang terakhir, I2CEN adalah bus I2C yang mengaktifkan atau menonaktifkan bit.
EEPROM 24C02:
Sekarang, datang ke 24C02. Paket dukungan papan N76E003 memiliki kode I2C untuk 24LC64 dan dapat dimodifikasi dengan mudah. Namun, kami akan menggunakan metode sederhana untuk memahami fungsi I2C.
Jika ada yang ingin menggunakan antarmuka rinci dengan EEPROM 24C02, maka program EEPROM di BSP dapat digunakan.
Kami hanya akan menghubungkan 24C02 di I2C dimana N76E003 akan menjadi master dan EEPROM akan menjadi budak. Jadi, kami akan menulis data apa pun ke alamat EEPROM dan membacanya.
Pinout 24C02 EEPROM ditunjukkan di bawah ini-
A0, A1, dan A2 adalah tiga pin pemilihan alamat. Pin WP adalah pin proteksi tulis dan perlu dihubungkan dengan VSS untuk memungkinkan penulisan ke dalam EEPROM.
Fungsionalitas Byte Write ditunjukkan pada gambar di bawah ini-
Siklus penulisan penuh terjadi dengan bit mulai. Setelah itu, byte Kontrol perlu dikirimkan. Dalam byte kontrol, hal-hal berikut diperlukan-
Setelah bit awal, terdiri dari alamat budak. 1010 adalah statis dan A0, A1, dan A2 adalah alamat berbasis koneksi perangkat keras. Jika ketiga pin tersebut dihubungkan dengan supply GND atau VSS, maka akan terbaca sebagai 0. Sebaliknya jika dihubungkan dengan VCC akan terbaca sebagai 1. Dalam kasus kami, semua A0, A1, dan A2 terhubung dengan VSS. Jadi semua ini akan menjadi 0.
Pengeluaran untuk kondisi baca atau tulis. Nilai alamat dengan bit Baca atau Tulis akan menjadi - 0xA0 untuk Tulis dan 0xA1 untuk membaca. Berikutnya adalah bit Pengakuan dan setelah itu, alamat 8-bit akan dikirim di mana data perlu disimpan dan terakhir, data yang akan disimpan di lokasi masing-masing. Hal-hal ini dilakukan dalam format langkah demi langkah di fungsi utama.
Fungsi Utama dan While Loop:
kosongkan utama (kosong) {char c = 0x00; InitialUART0_Timer3 (115200); TI = 1; // Penting, gunakan fungsi prinft harus mengatur TI = 1; I2C_init (); sementara (1) {EEPROM_write (1,0x55); c = EEPROM_read (1); printf ("\ n Nilai yang dibaca adalah% x", c & 0xff); }; }
Fungsi utamanya sederhana, terus menerus menulis nilai ke EEPROM di alamat 1 dan membaca data. Data tersebut kemudian dicetak menggunakan fungsi printf. Printf sedang mencetak nilai dalam hex.
Fungsi tulis EEPROM terdiri dari hal-hal berikut yang dijelaskan di bagian EEPROM-
void EEPROM_write (alamat karakter tidak bertanda tangan, nilai karakter tidak bertanda tangan) {I2C_start (); I2C_write (0xA0); I2C_write (alamat); I2C_write (nilai); I2C_stop (); }
Fungsi start I2C terdiri dari hal-hal berikut-
batal I2C_start (batal) {ditandatangani waktu int = batas waktu; set_STA; clr_SI; sementara ((SI == 0) && (waktu> 0)) {waktu--; }; }
Dalam fungsi ini, status SI diperiksa bersama dengan periode waktu tunggu yang telah ditentukan sebelumnya (didefinisikan dalam I2C.h dimana waktu yang telah ditentukan ditetapkan sebagai 1000). Fungsi start dimulai dengan mengatur STA dan membersihkan SI.
batal I2C_stop (batal) {ditandatangani waktu int = batas waktu; clr_SI; set_STO; sementara ((STO == 1) && (waktu> 0)) {waktu--; }; }
Sama seperti Start, fungsi stop digunakan. Fungsi berhenti dimulai dengan menyiapkan STO diikuti dengan membersihkan SI. Fungsi di bawah ini adalah fungsi baca I2C-
unsigned char I2C_read (unsigned char ack_mode) {signed int time = timeout; nilai karakter tidak bertanda tangan = 0x00; set_AA; clr_SI; sementara ((SI == 0) && (t> 0)) {waktu--; }; nilai = I2DAT; jika (ack_mode == I2C_NACK) {t = timeout_count; clr_AA; clr_SI; sementara ((SI == 0) && (t> 0)) {waktu--; }; } nilai kembali; }
The ack_mode dan I2C_NACK , baik didefinisikan dalam I2C file header sebagai masing-masing 0 dan 1.
Demikian pula, fungsi tulis dibuat-
batal I2C_write (unsigned char value) {signed int time = timeout; I2DAT = nilai; clr_STA; clr_SI; sementara ((SI == 0) && (waktu> 0)) {waktu--; }; }
Mem-flash Kode dan Output
Kode mengembalikan 0 peringatan dan 0 Kesalahan dan di-flash menggunakan metode flashing default oleh Keil. Jika Anda baru, lihat tutorial memulai nuvoton untuk memahami cara mengunggah kode. Informasi kompilasi kode dapat ditemukan di bawah ini.
Bangun target 'I2C_EEPROM' yang menyusun I2C_EEPROM.c… menyusun I2C.c… menghubungkan… Ukuran Program: data = 59,2 xdata = 0 kode = 2409 membuat file hex dari ". \ Output \ I2C_EEPROM"… ". \ Output \ I2C_EEPROM "- 0 Error, 0 Peringatan. Waktu Pembuatan: 00:00:04 Ringkasan Batch-Build: 1 berhasil, 0 gagal, 0 dilewati - Waktu Berlalu: 00:00:04
Perangkat keras sedang disiapkan di papan tempat memotong roti dan berfungsi seperti yang diharapkan. Seperti yang Anda lihat pada gambar di bawah, kami dapat menulis nilai pada EEPROM dan membacanya kembali dari memori dan menampilkannya pada monitor serial.
Lihat video yang diberikan di bawah ini untuk demonstrasi lengkap tentang cara kerja papan untuk kode ini. Semoga Anda menikmati tutorial ini dan mempelajari sesuatu yang berguna jika Anda memiliki pertanyaan, tinggalkan di bagian komentar di bawah. Anda juga dapat menggunakan forum kami untuk memposting pertanyaan teknis lainnya.