- Apa itu Protokol Komunikasi I2C?
- Bagaimana Komunikasi I2C berfungsi?
- Di mana menggunakan komunikasi I2C?
- I2C dengan PIC16F877a menggunakan XC8 Compiler
- Pengaturcaraan menggunakan fail header I2C:
- Simulasi Proteus:
PIC Microcontrollers adalah platform hebat yang disediakan oleh microchip untuk projek terbenam, sifatnya yang serba boleh membuatnya dapat mencari jalan ke banyak aplikasi dan fasa masih berjalan. Sekiranya anda mengikuti tutorial PIC kami, maka anda akan menyedari bahawa kami telah merangkumi pelbagai tutorial mengenai mikrokontroler PIC bermula dari asasnya. Sejak sekarang, kami telah merangkumi asas-asas yang boleh kami masuki dalam perkara yang lebih menarik seperti portal komunikasi.
Dalam sistem aplikasi tertanam yang luas, tidak ada pengawal mikro yang dapat melakukan semua aktiviti dengan sendirinya. Pada tahap tertentu ia perlu berkomunikasi dengan peranti lain untuk berkongsi maklumat, terdapat banyak jenis protokol komunikasi untuk berkongsi maklumat ini, tetapi yang paling kerap 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.
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 ayam 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 sebagai hamba. Komunikasi harus dan akan selalu berlaku antara dua Tuan dan Budak. 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 bila-bila masa 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 dialamatkan hanya salve dengan alamat tertentu yang akan membalas dengan maklumat sementara yang lain berhenti. 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 dengan PIC16F877a menggunakan XC8 Compiler
Cukup perkenalan, mari masuk ke dalamnya dan pelajari bagaimana kita dapat menggunakan mikrokontroler untuk melakukan komunikasi I2C. Sebelum kita mulai menjelaskan bahawa tutorial ini hanya membincangkan tentang I2C di PIC16F877a menggunakan penyusun XC8, prosesnya akan sama untuk mikrokontroler lain tetapi sedikit perubahan mungkin diperlukan. Ingat juga bahawa untuk mikrokontroler lanjutan seperti siri PIC18F pengkompil itu sendiri mungkin mempunyai beberapa perpustakaan yang dibina untuk menggunakan ciri I2C, tetapi untuk PIC16F877A tidak ada yang serupa jadi mari kita bina sendiri. Perpustakaan yang dijelaskan di sini akan diberikan sebagai fail tajuk untuk dimuat di bahagian bawah yang dapat digunakan untuk PIC16F877A untuk berkomunikasi dengan peranti I2C lain.
Seperti biasa, tempat terbaik untuk memulakan sesuatu adalah lembaran data kami. Cari butiran mengenai I2C dalam lembar data dan periksa daftar mana yang harus dikonfigurasi. Saya tidak akan menerangkan secara terperinci kerana lembaran data telah melakukannya untuk anda. Di bawah ini saya akan menerangkan pelbagai fungsi yang terdapat dalam fail tajuk dan tanggungjawab mereka dalam program ini.
batal I2C_ Memulakan ()
Fungsi inisialisasi digunakan untuk memberitahu mikrokontroler bahawa kita akan menggunakan protokol I2C. Ini dapat dilakukan dengan menetapkan bit yang diperlukan pada daftar SSPCON dan SSPCON2. Langkah pertama adalah dengan menyatakan pin IIC sebagai pin input, di sini pin RC3 dan RC4 harus digunakan untuk komunikasi I2C sehingga kami menyatakannya sebagai pin input. Seterusnya kita harus menetapkan SSPCON dan SSPCON2 yang merupakan daftar kawalan MSSP. Kami mengendalikan PIC dalam mod induk IIC dengan frekuensi jam FOSC / (4 * (SSPADD + 1)). Rujuk nombor halaman dari lembar data yang disebutkan di baris komen di bawah untuk memahami mengapa daftar tertentu ditetapkan seperti itu.
Jadi seterusnya kita harus menetapkan frekuensi jam, frekuensi jam untuk aplikasi yang berlainan mungkin berbeza, oleh itu kita mendapat pilihan dari pengguna melalui pemboleh ubah feq_k dan menggunakannya dalam formula kita untuk menetapkan daftar SSPADD.
batal I2C_Initialize (const long unsigned long feq_K) // Mulakan IIC sebagai master { TRISC3 = 1; TRISC4 = 1; // Tetapkan pin SDA dan SCL sebagai pin input SSPCON = 0b00101000; // pg84 / 234 SSPCON2 = 0b00000000; // pg85 / 234 SSPADD = (_XTAL_FREQ / (4 * feq_K * 100)) - 1; // Menetapkan Kelajuan Jam pg99 / 234 SSPSTAT = 0b00000000; // ms83 / 234 }
Batal I2C_Tahan ()
Fungsi penting seterusnya adalah fungsi I2C_hold yang digunakan untuk menahan pelaksanaan peranti sehingga operasi I2C saat ini selesai. Kita harus memeriksa sama ada operasi I2C harus diadakan sebelum memulakan operasi baru. Ini dapat dilakukan dengan memeriksa daftar SSPSTAT dan SSPCON2. SSPSTAT mengandungi maklumat mengenai status bas I2C.
Program ini mungkin kelihatan agak rumit kerana melibatkan operator "dan" dan "atau" Apabila anda memecahkannya sebagai
SSPSTAT & 0b00000100 SSPCON2 & 0b00011111
Ini bermaksud bahawa kami memastikan bahawa bit kedua pada SSPSTAT adalah sifar dan bit yang sama dari 0 hingga 4 adalah sifar pada SSPCON2. Kemudian kami menggabungkan semua ini untuk memeriksa hasilnya adalah sifar. Sekiranya hasilnya sifar, program akan diteruskan jika tidak, ia akan bertahan sehingga ia mendapat sifar kerana ia digunakan dalam gelung sementara .
batal I2C_Hold () { sementara ((SSPCON2 & 0b00011111) - (SSPSTAT & 0b00000100)); // periksa daftar ini untuk memastikan IIC tidak berjalan }
Batal I2C_Begin () dan batal I2C_End ()
Setiap kali semasa kita menulis atau membaca data menggunakan bas I2C, kita harus memulakan dan Menamatkan sambungan I2C. Untuk memulakan komunikasi I2C kita harus menetapkan bit SEN dan untuk menamatkan komunikasi kita harus menetapkan bit status PEN. Sebelum menukar bit ini, kita juga harus memeriksa sama ada bas I2C sibuk dengan menggunakan fungsi I2C_Hold seperti yang dibincangkan di atas.
batal I2C_Begin () { I2C_Hold (); // Tahan program adalah I2C sibuk SEN = 1; // Mulakan IIC pg85 / 234 } batal I2C_End () { I2C_Hold (); // Tahan program adalah I2C sibuk PEN = 1; // Tamat IIC ms85 / 234 }
Batal I2C_Write ()
Fungsi menulis digunakan untuk menghantar data dari modul induk ke modul salve. Fungsi ini biasanya digunakan setelah fungsi permulaan I2C dan diikuti oleh fungsi I2C End. Data yang harus ditulis ke bas IIC disampaikan melalui data pemboleh ubah. Data ini kemudian dimuat ke dalam daftar penyangga SSPBUF untuk menghantarnya melalui bas I2C.
Biasanya sebelum menulis data alamat akan ditulis sehingga anda harus menggunakan fungsi menulis dua kali, sekali untuk menetapkan alamat dan waktu lain untuk mengirim data yang sebenarnya.
batal I2C_Write (data yang tidak ditandatangani) { I2C_Hold (); // Tahan program adalah I2C sibuk SSPBUF = data; // hlm82 / 234 }
I2C_Read pendek yang tidak ditandatangani ()
Fungsi terakhir yang harus kita ketahui adalah fungsi I2C_Read . Fungsi ini digunakan untuk membaca data yang ada pada bas I2C. Ia digunakan setelah meminta hamba menulis beberapa nilai pada bas. Nilai yang diterima akan berada di SSPBUF kita dapat memindahkan nilai tersebut ke mana-mana pemboleh ubah untuk operasi kita.
Semasa komunikasi I2C, hamba setelah mengirim data yang diminta oleh Master akan mengirim bit lain yang merupakan bit pengakuan, bit ini juga harus diperiksa oleh master untuk memastikan komunikasi itu berjaya. Setelah memeriksa bit ACKDT untuk pengakuan, ia harus diaktifkan dengan menetapkan bit ACKEN.
I2C_Read pendek yang tidak ditandatangani (ack pendek yang tidak ditandatangani) { masuk pendek yang tidak ditandatangani; I2C_Hold (); RCEN = 1; I2C_Hold (); masuk = SSPBUF; // dapatkan data yang disimpan di SSPBUF I2C_Hold (); ACKDT = (ack)? 0: 1; // periksa sama ada bit ack diterima ACKEN = 1; // ms 85/234 pulangan masuk; }
Begitulah, fungsi ini harus cukup untuk mengatur komunikasi I2C dan menulis atau membaca data dari peranti. Perhatikan juga bahawa terdapat banyak fungsi lain yang dapat dilakukan oleh komunikasi I2C tetapi demi kesederhanaan kami tidak membincangkannya di sini. Anda sentiasa boleh merujuk lembar data untuk mengetahui cara kerja lengkap
Kod lengkap dengan fail tajuk untuk komunikasi PIC16F877A I2C boleh dimuat turun dari pautan.
Pengaturcaraan menggunakan fail header I2C:
Sekarang setelah kita mengetahui bagaimana komunikasi I2C berfungsi 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 dalam bas.
Seperti biasa program bermula dengan mengatur bit Konfigurasi dan menetapkan frekuensi jam hingga 20 MHz seperti yang ditunjukkan di bawah
#pragma config FOSC = HS // Oscillator Selits bit (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit ( WDTabled ) #pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT diaktifkan) # pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Voltan Rendah (Bekalan Tunggal) In-Circuit Serial Programming Enable bit (RB3 digital I / O, HV aktif MCLR mesti digunakan untuk pengaturcaraan) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bit (Hapus perlindungan; semua memori program boleh ditulis oleh kawalan EECON) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Perlindungan kod mati) #define _XTAL_FREQ 20000000
Langkah seterusnya ialah menambahkan fail tajuk yang baru sahaja kita bincangkan. Fail tajuk dinamakan sebagai PIC16F877a_I2C.h dan boleh dimuat turun dari pautan yang kami bincangkan di atas. Pastikan fail tajuk ditambahkan dalam fail tajuk senarai projek anda, struktur fail projek anda akan kelihatan seperti ini
Setelah memastikan fail tajuk ditambahkan ke fail projek anda sertakan fail tajuk dalam fail utama C
#sertakan
Di dalam loop sementara kita akan memulakan komunikasi I2C menulis beberapa nilai rawak ke bus I2C dan kemudian Menamatkan komunikasi I2C. Nilai rawak yang saya pilih adalah D0, 88 dan FF. Anda boleh memasukkan nilai yang anda mahukan. Tetapi ingatlah nilai-nilai tersebut kerana kami akan mengesahkannya dalam simulasi kami.
sementara (1) { I2C_Begin (); I2C_Write (0xD0); I2C_Write (0x88); I2C_Write (0xFF); I2C_End (); __delay_ms (1000); }
Program lengkap boleh didapati di bahagian bawah halaman, anda boleh menggunakannya atau memuat turun fail zip lengkap program dari sini. Setelah mendapat program, susunlah dan bersiap sedia untuk simulasi.
Simulasi Proteus:
Proteus mempunyai instrumen yang bagus yang disebut I2C debugger yang dapat digunakan untuk membaca data pada bus I2C, jadi marilah kita membuat litar menggunakannya dan periksa apakah data berjaya ditulis. Gambarajah litar lengkap ditunjukkan di bawah
Muatkan fail hex yang dihasilkan oleh program kami dengan mengklik dua kali pada Mikrokontroler. Kemudian simulasi program. Anda akan melihat tetingkap muncul yang akan memaparkan semua maklumat mengenai bas I2C. Tingkap untuk program kami ditunjukkan di bawah.
Sekiranya anda melihat dengan teliti data yang ditulis, anda dapat melihat bahawa data tersebut sama seperti yang kami tulis dalam program kami. Nilai adalah D0, 88 dan FF. Nilai ditulis untuk setiap 1 saat sehingga masa juga dikemas kini seperti gambar di bawah. Anak panah biru menunjukkan bahawa ia ditulis dari tuan ke hamba, ia akan menunjukkan arah yang berlawanan jika sebaliknya. Gambaran lebih dekat mengenai data yang dihantar ditunjukkan di bawah.
Ini hanya sekilas dari apa yang dapat dilakukan oleh I2C, ia juga dapat membaca dan menulis data ke pelbagai peranti. Kami akan membahas lebih lanjut mengenai I2C dalam tutorial kami yang akan datang dengan menghubungkan pelbagai modul yang berfungsi dengan protokol I2C.
Harap anda memahami projek dan mengetahui sesuatu yang berguna daripadanya. Sekiranya anda mempunyai keraguan, hantarkannya di bahagian komen di bawah atau gunakan forum untuk bantuan teknikal.
Kod lengkap telah diberikan di bawah; anda boleh memuat turun fail tajuk dengan semua kod dari sini.