- Apa itu Protokol Komunikasi I2C?
- Bagaimana I2C Communication bekerja?
- Di mana menggunakan komunikasi I2C?
- I2C dengan PIC16F877a menggunakan XC8 Compiler
- Pemrograman menggunakan file header I2C:
- Simulasi Proteus:
PIC Microcontrollers adalah platform kuat yang disediakan oleh microchip untuk proyek yang disematkan, sifatnya yang serba guna telah membuatnya menemukan cara untuk masuk ke banyak aplikasi dan fase tersebut masih berjalan. Jika Anda telah mengikuti tutorial PIC kami, maka Anda akan memperhatikan bahwa kami telah membahas berbagai macam tutorial tentang mikrokontroler PIC mulai dari yang paling dasar. Sejak sekarang, kami telah membahas dasar-dasar untuk masuk ke hal-hal yang lebih menarik seperti portal komunikasi.
Dalam sistem aplikasi tertanam yang luas, tidak ada mikrokontroler yang dapat melakukan semua aktivitas dengan sendirinya. Pada beberapa tahap waktu itu 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.
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. Ini hanya memiliki dua kabel untuk berbagi informasi yang satu digunakan untuk sinyal ayam dan yang lainnya digunakan untuk mengirim dan menerima data.
Bagaimana I2C Communication 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 slave. Komunikasi harus dan akan selalu terjadi antara dua Tuan dan seorang 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 tetap keluar. 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 dengan PIC16F877a menggunakan XC8 Compiler
Cukup perkenalan, mari kita bahas dan pelajari bagaimana kita dapat menggunakan mikrokontroler untuk melakukan komunikasi I2C. Sebelum kita mulai menjelaskan bahwa tutorial ini hanya berbicara tentang I2C di PIC16F877a menggunakan compiler XC8, prosesnya akan sama untuk mikrokontroler lain tetapi mungkin diperlukan sedikit perubahan. Juga ingat bahwa untuk mikrokontroler tingkat lanjut seperti seri PIC18F, kompiler itu sendiri mungkin memiliki beberapa perpustakaan built-in untuk menggunakan fitur I2C, tetapi untuk PIC16F877A tidak ada yang seperti itu, jadi mari kita buat sendiri. Pustaka yang dijelaskan di sini akan diberikan sebagai file header untuk diunduh di bagian bawah yang dapat digunakan untuk PIC16F877A untuk berkomunikasi dengan perangkat I2C lainnya.
Seperti biasa, tempat terbaik untuk memulai apa pun adalah lembar data kami. Cari detail tentang I2C di lembar data dan periksa register mana yang harus dikonfigurasi. Saya tidak akan menjelaskan secara rinci karena datasheet telah melakukannya untuk Anda. Lebih jauh di bawah ini saya akan menjelaskan berbagai fungsi yang ada di file header dan tanggung jawabnya dalam program.
batal I2C_Initialize ()
Fungsi inisialisasi digunakan untuk memberi tahu mikrokontroler bahwa kita akan menggunakan protokol I2C. Ini dapat dilakukan dengan mengatur bit yang diperlukan pada register SSPCON dan SSPCON2. Langkah pertama adalah mendeklarasikan pin IIC sebagai pin input, disini pin RC3 dan RC4 harus digunakan untuk komunikasi I2C sehingga kami mendeklarasikannya sebagai pin input. Selanjutnya kita harus mengatur SSPCON dan SSPCON2 yang merupakan register kontrol MSSP. Kami mengoperasikan PIC dalam mode master IIC dengan frekuensi clock FOSC / (4 * (SSPADD + 1)). Lihat nomor halaman dari lembar data yang disebutkan di baris komentar di bawah ini untuk memahami mengapa register khusus itu diatur seperti itu.
Jadi selanjutnya kita harus mengatur frekuensi clock, frekuensi clock untuk aplikasi yang berbeda mungkin berbeda, oleh karena itu kita mendapatkan pilihan dari pengguna melalui variabel feq_k dan menggunakannya dalam rumus kita untuk mengatur register SSPADD.
void I2C_Initialize (const unsigned long feq_K) // Mulai IIC sebagai master { TRISC3 = 1; TRISC4 = 1; // Atur pin SDA dan SCL sebagai pin input SSPCON = 0b00101000; // pg84 / 234 SSPCON2 = 0b00000000; // pg85 / 234 SSPADD = (_XTAL_FREQ / (4 * feq_K * 100)) - 1; // Mengatur Kecepatan Jam pg99 / 234 SSPSTAT = 0b00000000; // pg83 / 234 }
Batal I2C_Hold ()
Fungsi penting berikutnya adalah fungsi I2C_hold yang digunakan untuk menahan eksekusi perangkat hingga operasi I2C saat ini selesai. Kami harus memeriksa apakah operasi I2C harus ditahan sebelum memulai operasi baru. Ini dapat dilakukan dengan memeriksa register SSPSTAT dan SSPCON2. SSPSTAT berisi informasi tentang status bus I2C.
Program ini mungkin tampak sedikit rumit karena melibatkan operator “dan” dan “atau”. Saat Anda memecahkannya sebagai
SSPSTAT & 0b00000100 SSPCON2 & 0b00011111
</s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> orang </s>
Ini berarti bahwa kita memastikan bahwa 2 nd sedikit di SSPSTAT adalah nol dan sama bit dari 0 sampai 4 adalah nol pada SSPCON2. Kemudian kami menggabungkan semua ini untuk memeriksa hasilnya nol. Jika hasilnya nol, program akan melanjutkan jika tidak, ia akan bertahan di sana sampai nol karena digunakan dalam loop sementara .
batal I2C_Hold () { while ((SSPCON2 & 0b00011111) - (SSPSTAT & 0b00000100)); // periksa ini di register untuk memastikan IIC tidak sedang berjalan }
Batalkan I2C_Begin () dan batal I2C_End ()
Setiap kali kita menulis atau membaca data menggunakan bus I2C, kita harus memulai dan Mengakhiri koneksi I2C. Untuk memulai komunikasi I2C kita harus mengatur bit SEN dan untuk mengakhiri komunikasi kita harus mengatur bit status PEN. Sebelum mengubah bit-bit ini, kita juga harus memeriksa apakah bus I2C sibuk dengan menggunakan fungsi I2C_Hold seperti yang dibahas di atas.
batal I2C_Begin () { I2C_Hold (); // Tahan program ini I2C sedang sibuk SEN = 1; // Mulai IIC pg85 / 234 } batal I2C_End () { I2C_Hold (); // Tahan program ini I2C sedang sibuk PEN = 1; // Akhiri IIC pg85 / 234 }
Batal I2C_Write ()
Fungsi tulis digunakan untuk mengirim data apa pun dari modul master ke modul salve. Fungsi ini biasanya digunakan setelah fungsi I2C start dan diikuti oleh fungsi I2C End. Data yang harus ditulis ke bus IIC dilewatkan melalui data variabel. Data ini kemudian dimuat ke register buffer SSPBUF untuk dikirim melalui bus I2C.
Biasanya sebelum menulis data sebuah alamat akan ditulis sehingga Anda harus menggunakan fungsi tulis dua kali, satu kali untuk mengatur alamat dan waktu lainnya untuk mengirim data sebenarnya.
batal I2C_Write (data tidak bertanda tangan) { I2C_Hold (); // Tahan program ini I2C sedang sibuk SSPBUF = data; // pg82 / 234 }
I2C_Read () pendek tanpa tanda tangan
Fungsi terakhir yang harus kita ketahui adalah fungsi I2C_Read . Fungsi ini digunakan untuk membaca data yang ada di bus I2C. Ini digunakan setelah meminta seorang budak untuk menuliskan beberapa nilai ke bus. Nilai yang diterima akan ada di SSPBUF kita dapat mentransfer nilai tersebut ke variabel manapun untuk operasi kita.
Selama komunikasi I2C, slave setelah mengirimkan data yang diminta oleh Master akan mengirimkan bit lagi yang merupakan bit pengakuan, bit ini juga harus diperiksa oleh master untuk memastikan komunikasi berhasil. Setelah memeriksa bit ACKDT untuk pengakuan, itu harus diaktifkan dengan mengatur bit ACKEN.
unsigned short I2C_Read (unsigned short ack) { unsigned short incoming; I2C_Hold (); RCEN = 1; I2C_Hold (); masuk = SSPBUF; // dapatkan data yang disimpan di SSPBUF I2C_Hold (); ACKDT = (ack)? 0: 1; // periksa apakah bit ack menerima ACKEN = 1; // pg 85/234 kembali masuk; }
Itu saja, fungsi-fungsi ini seharusnya cukup untuk mengatur komunikasi I2C dan menulis atau membaca data dari perangkat. Juga perhatikan bahwa ada banyak fungsi lain yang dapat dilakukan oleh komunikasi I2C tetapi demi kesederhanaan, kami tidak membahasnya di sini. Anda selalu dapat merujuk lembar data untuk mengetahui pekerjaan lengkap file
Kode lengkap dengan file header untuk komunikasi PIC16F877A I2C dapat diunduh dari tautan.
Pemrograman menggunakan file header I2C:
Sekarang kita telah mempelajari cara kerja komunikasi I2C dan bagaimana kita dapat menggunakan file header yang dibuat untuknya, mari kita membuat program sederhana di mana kita akan menggunakan file header dan menulis beberapa nilai ke baris I2C. Kami kemudian akan mensimulasikan program ini dan memeriksa apakah nilai-nilai ini ditulis di bus.
Seperti biasa, program dimulai dengan mengatur bit Konfigurasi dan mengatur frekuensi clock ke 20 MHz seperti yang ditunjukkan di bawah ini
#pragma config FOSC = HS // Bit pilihan osilator (osilator HS) #pragma config WDTE = OFF // Pengatur Waktu Pengawas Bit pengaktifan (WDT dinonaktifkan) #pragma config PWRTE = ON // Pengatur Waktu Penyalaan Bit pengaktifan (PWRT diaktifkan) # pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Tegangan Rendah (Pasokan Tunggal) In-Circuit Serial Programming Enable bit (RB3 adalah I / O digital, HV aktif MCLR harus digunakan untuk pemrograman) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Perlindungan kode EEPROM Data mati) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory dapat ditulis oleh kontrol EECON) #pragma config CP = OFF // Bit Perlindungan Kode Memori Program Flash (Perlindungan kode nonaktif) #define _XTAL_FREQ 20000000
Langkah selanjutnya adalah menambahkan file header yang baru saja kita diskusikan. File header bernama PIC16F877a_I2C.h dan dapat didownload dari link yang kita diskusikan di atas. Pastikan file header ditambahkan di file header daftar proyek Anda, struktur file proyek Anda akan terlihat seperti ini
Setelah memastikan file header ditambahkan ke file proyek Anda, sertakan file header di file C utama
#include
Di dalam loop while kita akan memulai komunikasi I2C dengan menulis beberapa nilai acak ke bus I2C dan kemudian Akhiri komunikasi I2C. Nilai acak yang saya pilih adalah D0, 88 dan FF. Anda dapat memasukkan nilai apa pun yang Anda inginkan. Tapi ingat nilai-nilai itu karena kita akan memverifikasinya dalam simulasi kita.
sementara (1) { I2C_Begin (); I2C_Write (0xD0); I2C_Write (0x88); I2C_Write (0xFF); I2C_End (); __delay_ms (1000); }
Program lengkap dapat ditemukan di bagian bawah halaman, Anda dapat menggunakannya atau mengunduh file zip lengkap program dari sini. Setelah mendapatkan programnya, kompile dan bersiaplah untuk simulasi.
Simulasi Proteus:
Proteus memiliki instrumen bagus yang disebut debugger I2C yang dapat digunakan untuk membaca data pada bus I2C, jadi mari kita membangun sirkuit menggunakannya dan memeriksa apakah data berhasil ditulis. Diagram sirkuit lengkap ditunjukkan di bawah ini
Muat file hex yang dihasilkan oleh program kami dengan mengklik dua kali pada Mikrokontroler. Kemudian simulasikan programnya. Anda akan melihat jendela pop up yang akan menampilkan semua informasi tentang bus I2C. Jendela untuk program kami ditampilkan di bawah ini.
Jika Anda mencermati data yang sedang ditulis, Anda dapat melihat bahwa data tersebut sama dengan yang kami tulis di program kami. Nilainya adalah D0, 88 dan FF. Nilainya ditulis untuk setiap 1 detik sehingga waktu juga diperbarui seperti yang ditunjukkan di bawah ini. Panah biru menunjukkan bahwa itu ditulis dari master ke slave itu akan menunjuk ke arah yang berlawanan jika sebaliknya. Tampilan lebih dekat dari data yang dikirim ditunjukkan di bawah ini.
Ini hanyalah sekilas tentang apa yang dapat dilakukan I2C, itu juga dapat membaca dan menulis data ke banyak perangkat. Kami akan membahas lebih lanjut tentang I2C dalam tutorial mendatang kami dengan menghubungkan berbagai modul yang bekerja dengan protokol I2C.
Semoga Anda memahami proyek ini dan belajar sesuatu yang bermanfaat darinya. Jika Anda ragu posting mereka di bagian komentar di bawah atau gunakan forum untuk bantuan teknis.
Kode lengkap telah diberikan di bawah ini; Anda dapat mengunduh file header dengan semua kode dari sini.