- Apa itu Protokol Komunikasi I2C?
- Bagaimana Komunikasi I2C Berfungsi?
- Di mana Menggunakan Komunikasi I2C?
- I2C pada Nuvoton N76E003 - Keperluan Perkakasan
- Antara muka AT24LC64 dengan Nuvoton N76E003 - Diagram Litar
- Pin I2C di Nuvoton N76E003
- Komunikasi I2C di N76E003
- Pengaturcaraan N76E003 untuk Komunikasi I2C
- Berkelip Kod dan Hasilnya
Dalam sistem aplikasi tertanam yang luas, tidak ada pengawal mikro yang dapat melakukan semua aktiviti dengan sendirinya. Pada tahap tertentu, ia mesti berkomunikasi dengan peranti lain untuk berkongsi maklumat, terdapat banyak jenis protokol komunikasi untuk berkongsi maklumat ini, tetapi yang paling sering digunakan adalah USART, IIC, SPI, dan CAN. Setiap protokol komunikasi mempunyai kelebihan dan kekurangannya sendiri. Mari fokus pada bahagian IIC buat masa ini kerana itulah yang akan kita pelajari dalam tutorial ini. Sekiranya anda baru di sini, lihat Tutorial Nuvoton di mana kami telah membincangkan setiap perisian mikrokontroler N76E003 dari tutorial permulaan yang sangat asas. Sekiranya anda ingin mempelajari cara menggunakan I2C dengan pengawal mikro lain, anda boleh melihat pautan di bawah.
- Cara menggunakan I2C di Arduino: Komunikasi antara dua Papan Arduino
- Komunikasi I2C dengan PIC Microcontroller PIC16F877
- Memadankan LCD 16X2 dengan ESP32 menggunakan I2C
- Komunikasi I2C dengan MSP430 Launchpad
- Memadankan LCD dengan NodeMCU tanpa menggunakan I2C
- Cara menangani pelbagai 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 pelbagai peranti dan memulakan komunikasi. I2C berfungsi dengan hanya dua wayar, iaitu SDA dan SCL. Di mana SDA bermaksud Serial data dan SCL bermaksud Serial Clock. Walau bagaimanapun, kedua pin ini memerlukan resistor penarik ke tahap voltan VCC dan dengan perintang penarik yang mencukupi, bas dapat menyokong 127 peranti dengan alamat yang unik.
Apa itu Protokol Komunikasi I2C?
Istilah IIC bermaksud " Inter Integrated Circuits ". Biasanya dilambangkan sebagai I2C atau I kuadrat C atau bahkan sebagai protokol antara muka 2-wayar (TWI) di beberapa tempat tetapi semuanya bererti sama. I2C adalah makna protokol komunikasi segerak, kedua-dua peranti yang berkongsi maklumat mesti berkongsi isyarat jam yang sama. Ia hanya mempunyai dua wayar untuk berkongsi maklumat yang mana satu digunakan untuk isyarat jam dan yang lain digunakan untuk menghantar dan menerima data.
Bagaimana Komunikasi I2C Berfungsi?
Komunikasi I2C pertama kali diperkenalkan oleh Phillips. Seperti yang dinyatakan sebelumnya, ia mempunyai dua wayar, kedua-dua wayar ini akan disambungkan di dua peranti. Di sini satu peranti dipanggil master dan peranti lain dipanggil hamba. Komunikasi harus dan akan selalu berlaku antara dua orang, seorang Master dan seorang hamba. Kelebihan komunikasi I2C adalah lebih daripada satu hamba dapat dihubungkan dengan Master.
Komunikasi lengkap berlaku melalui dua wayar ini iaitu, Serial Clock (SCL) dan Serial Data (SDA).
Serial Clock (SCL): Berkongsi isyarat jam yang dihasilkan oleh tuan dengan hamba
Data Bersiri (SDA): Menghantar data ke dan dari antara Tuan dan hamba.
Pada waktu tertentu, hanya tuan yang dapat memulakan komunikasi. Oleh kerana terdapat lebih dari satu hamba di dalam bas, tuan harus merujuk kepada setiap hamba menggunakan alamat yang berbeza. Apabila diatasi hanya selawat dengan alamat tertentu yang akan membalas dengan maklumat sementara yang lain diam. Dengan cara ini, kita dapat menggunakan bas yang sama untuk berkomunikasi dengan pelbagai peranti.
Di mana Menggunakan Komunikasi I2C?
Komunikasi I2C hanya digunakan untuk komunikasi jarak dekat. Ia semestinya boleh dipercayai sehingga mempunyai denyut jam yang disegerakkan untuk menjadikannya pintar. Protokol ini digunakan terutamanya untuk berkomunikasi dengan sensor atau peranti lain yang harus menghantar maklumat kepada master. Sangat berguna apabila mikrokontroler harus berkomunikasi dengan banyak modul hamba lain dengan menggunakan wayar minimum. Sekiranya anda mencari komunikasi jarak jauh, anda harus mencuba RS232 dan jika anda mencari komunikasi yang lebih dipercayai, anda harus mencuba protokol SPI.
I2C pada Nuvoton N76E003 - Keperluan Perkakasan
Oleh kerana keperluan projek ini adalah mempelajari komunikasi I2C menggunakan N76E003, kami akan menggunakan EEPROM yang akan dihubungkan dengan garis data I2C. Kami akan menyimpan beberapa data ke dalam EEPROM dan juga membacanya dan memaparkannya menggunakan skrin UART.
Oleh kerana nilai yang disimpan akan dicetak dalam UART, apa-apa jenis penukar USB ke UART diperlukan. Anda juga boleh melihat tutorial tentang UART dengan Nuvoton jika anda baru dalam komunikasi UART di N76E003. Untuk aplikasi kami, kami akan menggunakan penukar CP2102 UART ke USB. Selain daripada perkara di atas, kami juga memerlukan komponen berikut-
- EEPROM 24C02
- 2pcs perintang 4.7k
Tidak ketinggalan, selain komponen di atas, kita memerlukan papan pengembangan berasaskan mikrokontroler N76E003 dan juga Pengaturcara Nu-Link. Selain itu, papan roti dan wayar penyambung juga diperlukan untuk menyambungkan semua komponen.
Antara muka AT24LC64 dengan Nuvoton N76E003 - Diagram Litar
Seperti yang dapat kita lihat dalam skema di bawah ini, EEPROM disambungkan dalam garis I2C bersama dengan dua perintang penarik. Di kiri paling kiri, sambungan antara muka pengaturcaraan ditunjukkan.
Saya menggunakan papan roti untuk IC AT24LC64 dan menghubungkan IC ke papan pengatur nuvoton saya menggunakan wayar jumper. Penyediaan perkakasan saya bersama dengan programmer nu-ink ditunjukkan di bawah.
Pin I2C di Nuvoton N76E003
Gambarajah pin N76E003 dapat dilihat pada gambar di bawah-
Seperti yang kita lihat, setiap pin mempunyai spesifikasi yang berbeza dan setiap pin dapat digunakan untuk pelbagai tujuan. Walau bagaimanapun, pin 1.4 digunakan sebagai pin SDA I2C, ia akan kehilangan PWM dan fungsi lain. Tetapi itu tidak menjadi masalah kerana fungsi lain tidak diperlukan untuk projek ini. Perkara yang sama akan berlaku untuk P1.3 ialah pin SCL I2C.
Oleh kerana pin I2C bertindak sebagai GPIO, ia perlu dikonfigurasikan. Semua pin GPIO boleh dikonfigurasi dalam mod yang dijelaskan di bawah.
Mengikut lembaran data, PxM1.n dan PxM2. n adalah dua register yang digunakan untuk menentukan operasi kawalan port I / O. Dalam lembar data, dinyatakan bahawa untuk menggunakan fungsi I2C, mod I / O perlu digunakan sebagai Open-drain untuk komunikasi yang berkaitan dengan I2C.
Komunikasi I2C di N76E003
Perisian I2C adalah perkara penting bagi mana-mana unit mikrokontroler yang menyokong ciri I2C. Banyak jenis mikrokontroler yang berbeza dilengkapi dengan periferal I2C terbina dalam. Walau bagaimanapun, dalam beberapa kes, I2C dapat dikonfigurasi secara manual menggunakan kawalan perisian di mana sokongan perkakasan yang berkaitan dengan I2C tidak tersedia (Contohnya, banyak 8051 mikrokontroler). Walau bagaimanapun, nuvoton N76E003 hadir dengan sokongan periferal I2C.
M76E003 menyokong empat jenis operasi dalam mod I2C - Master Transmitter, Master Receiver, Slave Transmitter, dan Slave Receiver. Ia juga menyokong kelajuan standard (100kbps) dan cepat (hingga 400kbps) untuk garis I2C. I2C berfungsi dengan beberapa peraturan generik dalam garis isyarat SCL dan SDA.
Keadaan Mula dan Hentikan:
Ini adalah perkara penting dalam komunikasi I2C. Apabila data dipindahkan ke garis I2C, ia bermula dengan keadaan mula dan berakhir dengan keadaan berhenti.
Keadaan permulaan adalah peralihan tinggi-ke-rendah pada SDA ketika garis SCL tinggi dan keadaan berhenti adalah peralihan rendah-ke-tinggi pada SDA ketika garis SCL tinggi. Kedua-dua syarat ini dihasilkan oleh master (MCU atau apa sahaja yang mengawal peranti hamba yang lain). Laluan bas tetap sibuk di keadaan ini apabila keadaan mula dimulakan dan tetap bebas lagi apabila keadaan berhenti dimulakan.
Keadaan Mula dan Berhenti ditunjukkan dengan baik dalam perspektif isyarat dalam lembaran data N76E003-
Alamat 7-Bit dengan Format Data:
N76E003 menyokong alamat dan format data 7-bit. Setelah keadaan mula dimulakan, peranti induk perlu menghantar data ke talian I2C. Data pertama adalah penting. Sekiranya data ini tidak dibuat atau dikirim dengan benar, peranti yang disambungkan tidak akan dikenal pasti dan komunikasi lebih lanjut tidak dapat dibuat.
Data terdiri daripada alamat hamba panjang 7-bit, dilambangkan sebagai SLA. Alamat panjang 7-bit ini mesti unik untuk setiap peranti sekiranya banyak peranti disambungkan di dalam bas. Selepas alamat 7-bit, bit ke-8 adalah bit arah data. Ini bermaksud, bergantung pada bit ke-8, master menghantar maklumat ke peranti hamba mengenai sama ada data akan ditulis dalam peranti hamba atau data akan dibaca dari peranti hamba. Bit ke-8 adalah bit R / W yang disebut sebagai pemberitahuan Baca atau Tulis. Seperti yang kita semua tahu, maklumat 8-bit boleh menjadi 128 jenis, dengan itu menyokong 128 peranti, tetapi I2C menyokong 127 jenis peranti pada bus yang sama tetapi tidak 128. Kerana alamat 0x00 adalah alamat yang dikhaskan yang disebut sebagai alamat panggilan umum. Sekiranya tuan ingin menghantar maklumat ke semua peranti,ia akan menangani 0x00 dan setiap peranti akan dimainkan semula dengan cara yang sama seperti konfigurasi perisian individu.
Oleh itu, penghantaran data kelihatan seperti di bawah-
Akui:
Dalam gambar alamat data di atas, bit ke-9 diikuti oleh bit R / W disebut bit mengakui. Ini penting kerana menggunakan bit ini, tuan atau hamba bertindak balas terhadap pemancar data dengan menarik garis SDA rendah. Untuk mendapatkan bit pengakuan, pemancar perlu melepaskan talian SDA.
Pengaturcaraan N76E003 untuk Komunikasi I2C
Program lengkap yang digunakan dalam tutorial ini terdapat di bahagian bawah halaman ini. Penjelasan segmen penting dalam kod adalah seperti berikut-
Tetapkan Pin sebagai Longkang Terbuka dan Konfigurasikannya untuk I2C:
Mari mulakan dengan bahagian pin I2C terlebih dahulu. Seperti yang dijelaskan sebelumnya, port I2C SCL dan SDA perlu dikonfigurasi dan ditetapkan sebagai konfigurasi longkang terbuka. Untuk melakukan ini, kami menggunakan fail header I2C.h bersama-sama dengan fail sumber I2C.c . Coretan kod kelihatan seperti ini-
lakukan {P13_OpenDrain_Mode; P14_OpenDrain_Mode; clr_I2CPX;} sementara (0)
Kod di atas menetapkan 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.
Ini I2CPX adalah sedikit 0TH kawalan I2C daftar I2CON. Sekiranya I2C_PX ini ditetapkan sebagai 1, pin diubah menjadi P0.2 sebagai SCL dan P1.6 sebagai SDA. Walau bagaimanapun, kami akan menggunakan P13 dan P14. Pin alternatif tidak digunakan di sini.
Daftar Kawalan I2C I2CON:
Daftar kawalan I2C I2CON digunakan untuk mengawal operasi I2C. Bit pertama adalah bit pemilihan pin I2C. Menetapkannya 0 mengkonfigurasi pin I2C sebagai P13 dan P14.
AA bit adalah bendera penegasan Akui, jika bendera AA diatur, ACK akan dikembalikan semasa denyut jam mengakui garis SCL. Sekiranya dibersihkan, NACK (tahap tinggi pada SDA) akan dikembalikan semasa denyutan jam yang diakui pada garis SCL.
Bit seterusnya adalah SI yang merupakan status I2C mengganggu. Sekiranya Interrupt Status I2C diaktifkan, pengguna harus memeriksa daftar I2STAT untuk menentukan langkah mana yang telah dilalui dan harus mengambil tindakan.
STO adalah bendera STOP yang ditetapkan dalam mod induk. STO dibersihkan secara automatik oleh perkakasan setelah keadaan STOP dikesan.
Bit seterusnya adalah bit STA. Sekiranya bendera ini ditetapkan, maka I2C akan menghasilkan keadaan MULAI jika bas percuma. Sekiranya bas sibuk, I2C menunggu keadaan BERHENTI dan menghasilkan keadaan MULAI berikut. Sekiranya STA ditetapkan semasa I2C sudah berada dalam mod induk dan satu atau lebih bait telah dihantar atau diterima, I2C menghasilkan keadaan MULAI berulang. STA perlu dibersihkan secara manual oleh perisian.
Yang terakhir, I2CEN ialah bas I2C mengaktifkan atau mematikan.
EEPROM 24C02:
Sekarang, datang ke 24C02. Pakej sokongan papan N76E003 mempunyai kod I2C untuk 24LC64 dan dapat diubahsuai dengan mudah. Walau bagaimanapun, kami akan menggunakan kaedah mudah untuk memahami fungsi I2C.
Sekiranya ada yang ingin menggunakan antaramuka terperinci dengan EEPROM 24C02, maka program EEPROM dalam BSP dapat digunakan.
Kami hanya akan menghubungkan 24C02 di I2C di mana N76E003 akan menjadi master dan EEPROM akan menjadi hamba. Oleh itu, kami akan menulis sebarang data ke alamat EEPROM dan membacanya sama.
Pinout 24C02 EEPROM ditunjukkan di bawah-
A0, A1, dan A2 adalah tiga pin pemilihan alamat. Pin WP adalah pin pelindung Tulis dan perlu dihubungkan dengan VSS untuk membolehkan penulisan di EEPROM.
Fungsi Byte Write ditunjukkan pada gambar di bawah-
Kitaran menulis penuh berlaku dengan sedikit permulaan. Selepas itu, bait kawalan perlu dihantar. Dalam bait kawalan, perkara berikut diperlukan-
Selepas bit permulaan, terdiri daripada alamat hamba. 1010 adalah statik dan A0, A1, dan A2 adalah alamat berdasarkan sambungan perkakasan. Sekiranya ketiga-tiga pin dihubungkan dengan bekalan GND atau VSS, ia akan dibaca sebagai 0. Jika tidak, jika disambungkan dengan VCC, ia akan dibaca sebagai 1. Dalam kes kita, semua A0, A1, dan A2 disambungkan dengan VSS. Oleh itu semua ini akan menjadi 0.
Membelanjakan untuk keadaan membaca atau menulis. Nilai alamat dengan bit Baca atau Tulis akan menjadi - 0xA0 untuk Tulis dan 0xA1 untuk membaca. Seterusnya adalah bit Pengakuan dan selepas itu, alamat 8-bit akan dihantar di mana data perlu disimpan dan akhirnya, data yang akan disimpan di lokasi masing-masing. Perkara-perkara ini dilakukan dalam format langkah demi langkah dalam fungsi utama.
Fungsi Utama dan Gelung Semasa:
kekosongan utama (kekosongan) {char c = 0x00; PermulaanUART0_Timer3 (115200); TI = 1; // Penting, gunakan fungsi prinft mesti menetapkan 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 adalah mudah, ia terus menulis nilai ke EEPROM di alamat 1 dan membaca data. Data kemudian dicetak menggunakan fungsi printf. Printf mencetak nilai dalam hex.
Fungsi menulis EEPROM terdiri daripada perkara-perkara berikut yang dijelaskan dalam bahagian EEPROM-
batal EEPROM_write (alamat char yang tidak ditandatangani, nilai char yang tidak ditandatangani) {I2C_start (); I2C_write (0xA0); I2C_write (alamat); I2C_write (nilai); I2C_stop (); }
Fungsi permulaan I2C terdiri daripada perkara berikut-
batal I2C_start (batal) {ditandatangani int time = timeout; set_STA; clr_SI; sementara ((SI == 0) && (masa> 0)) {masa--; }; }
Dalam fungsi ini, status SI diperiksa bersamaan dengan jangka waktu tamat yang telah ditentukan (ditentukan dalam I2C.h di mana masa yang telah ditetapkan ditetapkan sebagai 1000). Fungsi permulaan bermula dengan menetapkan STA dan membersihkan SI.
batal I2C_stop (tidak sah) {ditandatangani int time = timeout; clr_SI; tetapkan_STO; sementara ((STO == 1) && (masa> 0)) {masa--; }; }
Sama seperti fungsi Mula, berhenti digunakan. The stop fungsi dimulakan dengan menubuhkan STO yang sejajar dengan mengosongkan SI. Fungsi di bawah adalah fungsi baca I2C-
char I2C_read yang tidak ditandatangani (char ack_mode yang tidak ditandatangani) {ditandatangani int time = timeout; nilai char yang tidak ditandatangani = 0x00; set_AA; clr_SI; sementara ((SI == 0) && (t> 0)) {masa--; }; nilai = I2DAT; jika (ack_mode == I2C_NACK) {t = timeout_count; clr_AA; clr_SI; sementara ((SI == 0) && (t> 0)) {masa--; }; } nilai pulangan; }
The ack_mode dan I2C_NACK , kedua ditakrifkan dalam fail header I2C sebagai masing-masing 0 dan 1.
Begitu juga, fungsi menulis dibuat-
batal I2C_write (nilai char yang tidak ditandatangani) {ditandatangani int time = timeout; I2DAT = nilai; clr_STA; clr_SI; sementara ((SI == 0) && (masa> 0)) {masa--; }; }
Berkelip Kod dan Hasilnya
Kod tersebut mengembalikan 0 amaran dan 0 Kesalahan dan dikedip menggunakan kaedah flashing default oleh Keil. Sekiranya anda baru, periksa tutorial bermula dengan nuvoton untuk memahami cara memuat naik kod. Maklumat penyusun kod boleh didapati di bawah.
Membangun sasaran 'I2C_EEPROM' menyusun I2C_EEPROM.c… menyusun I2C.c… menghubungkan… Saiz Program: data = 59.2 xdata = 0 kod = 2409 membuat fail hex dari ". \ Output \ I2C_EEPROM"… ". \ Output \ I2C_EEPROM "- 0 Ralat, 0 Amaran. Masa Binaan Berlalu: 00:00:04 Ringkasan Batch-Build: 1 berjaya, 0 gagal, 0 dilangkau - Masa Berlalu: 00:00:04
Perkakasan sedang disiapkan di papan roti dan berfungsi seperti yang diharapkan. Seperti yang anda lihat pada gambar di bawah ini, kami dapat menulis nilai di EEPROM dan membacanya kembali dari memori dan memaparkannya di monitor bersiri.
Lihat video yang diberikan di bawah ini untuk demonstrasi lengkap mengenai bagaimana papan berfungsi untuk kod ini. Semoga anda menikmati tutorial dan mempelajari sesuatu yang berguna jika anda mempunyai sebarang pertanyaan, tinggalkan di bahagian komen di bawah. Anda juga boleh menggunakan forum kami untuk menghantar soalan teknikal lain.