Untuk proyek saya ingin tiga PIC (dua budak PIC18F4620, satu master PIC18F46K22) untuk berkomunikasi melalui bus I2C. Kemudian, lebih banyak budak dapat ditambahkan (seperti EEPROM, SRAM, ...). Saya menulis kode untuk PIC ini dalam C menggunakan kompiler C18. Saya sudah sering melihat-lihat di internet, tetapi tidak dapat menemukan perpustakaan untuk menangani perangkat (M) SSP. Saya telah membaca lembar data dari kedua PIC pada periferal (M) SSP dalam mode I2C tetapi tidak dapat menemukan cara antarmuka bus.
Jadi saya perlu perpustakaan master dan slave.
Apa yang kamu sarankan? Apakah Anda memiliki perpustakaan seperti itu di suatu tempat? Apakah sudah ada di dalam kompiler dan jika ya, di mana? Apakah ada tutorial yang bagus di suatu tempat di internet?
Jawaban:
Microchip menulis catatan aplikasi tentang ini:
Catatan aplikasi bekerja dengan ASM tetapi itu dapat porting ke C dengan mudah.
Kompiler C18 dan XC8 gratis dari Microchip memiliki fungsi I2C. Anda dapat membaca lebih lanjut tentang mereka di dokumentasi perpustakaan kompiler , bagian 2.4. Inilah beberapa info mulai cepat:
Pengaturan
Anda sudah memiliki kompiler C18 atau XC8 dari Microchip. Keduanya memiliki fungsi I2C bawaan. Untuk menggunakannya, Anda harus memasukkan
i2c.h
:Jika Anda ingin melihat kode sumbernya, Anda dapat menemukannya di sini:
installation_path
/v
x.xx
/h/i2c.h
installation_path
/v
x.xx
/src/pmc_common/i2c/
installation_path
/v
x.xx
/include/plib/i2c.h
installation_path
/v
x.xx
/sources/pic18/plib/i2c/
Dalam dokumentasi, Anda dapat menemukan di file mana dalam
/i2c/
folder suatu fungsi berada.Membuka koneksi
Jika Anda terbiasa dengan modul MSSP Microchip, Anda akan tahu mereka harus diinisialisasi terlebih dahulu. Anda dapat membuka koneksi I2C pada port MSSP menggunakan
OpenI2C
fungsi ini. Inilah yang didefinisikan:Dengan
sync_mode
, Anda dapat memilih apakah perangkat itu master atau slave, dan, jika itu adalah slave, apakah itu harus menggunakan alamat 10-bit atau 7-bit. Sebagian besar waktu, 7-bit digunakan, terutama dalam aplikasi kecil. Opsi untuksync_mode
adalah:SLAVE_7
- Mode Slave, alamat 7-bitSLAVE_10
- Mode Slave, alamat 10-bitMASTER
- Mode MasterDengan
slew
, Anda dapat memilih apakah perangkat harus menggunakan laju perubahan tegangan. Lebih lanjut tentang apa yang ada di sini: Berapa laju perubahan tegangan untuk I2C?Dua modul MSSP
Ada sesuatu yang istimewa tentang perangkat dengan dua modul MSSP, seperti PIC18F46K22 . Mereka memiliki dua set fungsi, satu untuk modul 1 dan satu untuk modul 2. Misalnya, alih-alih
OpenI2C()
, mereka memilikiOpenI2C1()
danopenI2C2()
.Oke, jadi Anda sudah mengatur semuanya dan membuka koneksi. Sekarang mari kita lakukan beberapa contoh:
Contohnya
Tuan tulis contoh
Jika Anda terbiasa dengan protokol I2C, Anda akan tahu urutan penulisan master khas terlihat seperti ini:
Pada awalnya, kami mengirim kondisi MULAI. Pertimbangkan ini mengangkat telepon. Kemudian, alamat dengan bit Tulis - memanggil nomor tersebut. Pada titik ini, budak dengan alamat yang dikirim tahu dia dipanggil. Dia mengirimkan Pengakuan ("Halo"). Sekarang, perangkat master dapat mengirim data - dia mulai berbicara. Dia mengirimkan jumlah byte. Setelah setiap byte, budak harus ACK data yang diterima ("ya, saya mendengar Anda"). Ketika perangkat master selesai berbicara, dia menutup dengan kondisi STOP.
Di C, urutan penulisan master akan terlihat seperti ini untuk master:
Tuan baca contoh
Urutan baca master sedikit berbeda dari urutan tulis:
Sekali lagi, master memulai panggilan dan memanggil nomor tersebut. Namun, dia sekarang ingin mendapatkan informasi. Budak pertama menjawab panggilan, kemudian mulai berbicara (mengirim data). Master mengakui setiap byte sampai ia memiliki informasi yang cukup. Kemudian ia mengirim Not-ACK dan menutup dengan kondisi STOP.
Dalam C, ini akan terlihat seperti ini untuk bagian master:
Kode budak
Untuk budak, yang terbaik adalah menggunakan Interrupt Service Routine atau ISR. Anda dapat mengatur mikrokontroler Anda untuk menerima interupsi ketika alamat Anda dipanggil. Dengan begitu Anda tidak perlu memeriksa bus terus-menerus.
Pertama, mari kita buat dasar-dasar untuk interupsi. Anda harus mengaktifkan interupsi, dan menambahkan ISR. Penting bahwa PIC18 memiliki dua tingkat interupsi: tinggi dan rendah. Kita akan mengatur I2C sebagai interupsi prioritas tinggi, karena itu sangat penting untuk membalas panggilan I2C. Apa yang akan kita lakukan adalah sebagai berikut:
GOTO
instruksi ke ISR umum pada vektor interupsi prioritas tinggi. Kami tidak dapat meletakkan ISR umum langsung pada vektor karena terlalu besar dalam banyak kasus.Berikut contoh kode:
Hal berikutnya yang harus dilakukan adalah mengaktifkan interupsi prioritas tinggi ketika chip menginisialisasi. Ini dapat dilakukan dengan beberapa manipulasi register sederhana:
Sekarang, kami memiliki interupsi yang berfungsi. Jika Anda menerapkan ini, saya akan memeriksanya sekarang. Tulis dasar
SSPISR()
untuk mulai berkedip LED ketika gangguan SSP terjadi.Oke, jadi interupsi Anda berfungsi. Sekarang mari kita menulis beberapa kode nyata untuk
SSPISR()
fungsi ini. Tetapi pertama-tama beberapa teori. Kami membedakan lima jenis interupsi I2C yang berbeda:Anda dapat memeriksa keadaan Anda saat ini dengan memeriksa bit dalam
SSPSTAT
register. Daftar ini adalah sebagai berikut dalam mode I2C (bit yang tidak digunakan atau tidak relevan dihilangkan):Dengan data ini, mudah untuk melihat bagaimana melihat status modul I2C:
Dalam perangkat lunak, yang terbaik adalah menggunakan state 5 sebagai default, yang diasumsikan ketika persyaratan untuk negara-negara lain tidak terpenuhi. Dengan begitu, Anda tidak menjawab ketika Anda tidak tahu apa yang terjadi, karena budak tidak menanggapi NACK.
Bagaimanapun, mari kita lihat kodenya:
Anda dapat melihat bagaimana Anda dapat memeriksa
SSPSTAT
register (pertama-tama ANDed0x2d
sehingga kami hanya memiliki bit yang berguna) menggunakan bitmask untuk melihat jenis interupsi yang kami miliki.Adalah tugas Anda untuk mengetahui apa yang harus Anda kirim atau lakukan ketika Anda merespons interupsi: tergantung pada aplikasi Anda.
Referensi
Sekali lagi, saya ingin menyebutkan catatan aplikasi yang ditulis Microchip tentang I2C:
Ada dokumentasi untuk pustaka kompilator: Kompilasi pustaka dokumentasi
Saat mengatur sesuatu sendiri, periksa lembar data chip Anda pada bagian (M) SSP untuk komunikasi I2C. Saya menggunakan PIC18F46K22 untuk bagian master dan PIC18F4620 untuk bagian budak.
sumber
Pertama, saya akan merekomendasikan untuk mengganti ke kompiler XC8 hanya karena itu yang terbaru. Ada perpustakaan periferal yang tersedia, tetapi saya belum pernah menggunakannya. Periksa situs web Microchips untuk perincian dan dokumentasinya.
Oke, saya punya beberapa rutinitas dasar yang sangat lama di sini untuk I2C eeprom comms yang saya gunakan dulu dengan PIC16F dan kompiler mid-range Microhip lama (mungkin yang Hi-Tech), tapi saya pikir mereka bisa bekerja dengan baik dengan PIC18, karena saya pikir perangkatnya sama. Anda akan mengetahuinya dengan sangat cepat jika semuanya berbeda.
Mereka adalah bagian dari file yang lebih besar yang digunakan dengan proyek temperatur logger, jadi saya dengan cepat menghapus semua fungsi yang tidak berhubungan lainnya dan disimpan sebagai file di bawah ini, jadi mungkin saya telah membuat sedikit kekacauan, tapi semoga Anda akan bisa mendapatkan beberapa ide tentang apa yang dibutuhkan (bahkan mungkin hanya berfungsi, Anda tidak pernah tahu ;-))
Anda perlu memastikan file header utama sudah benar, dan periksa / ubah pin untuk memastikan mereka adalah pin periferal I2C yang benar, dan nama register jika berasal dari kompiler Hi-Tech, yang melakukan hal-hal sedikit berbeda tentang konvensi penamaan daftar.
File I2C.c:
File Header I2C.h:
sumber
SSP1ADD = ((_XTAL_FREQ/100000)/4)-1;
1KHz, dll.Kompiler XC8 dan XC16 menyertakan pustaka untuk I2C.
Masalah yang saya temui adalah bahwa dokumentasi tidak terlalu bagus! Jika Anda menggunakan contoh-contoh dari dokumentasi Microchip, Anda kurang beruntung. Bahkan dukungan Microchip tidak dapat membantu Anda. Saya telah berada di sana sendiri.
Beberapa waktu yang lalu saya bekerja dengan mikrokontroler seri PIC24EP512GP dan perpustakaan tidak bekerja untuk saya seperti yang didokumentasikan oleh Microchip.
sumber