Apa itu antarmuka spi 4 kawat. Cara bekerja dengan SPI - Teori. Diagram waktu sinyal

Hari ini kita mulai mengenal ban SPI (Antarmuka Periferal Serial).

Bus ini sangat banyak digunakan dalam bidang elektronik. Sangat nyaman karena sinkron dan dupleks penuh, oleh karena itu digunakan di banyak sirkuit untuk komunikasi antara berbagai perangkat digital - sensor, pengontrol, driver, dan perangkat lainnya.

Faktor penting lainnya yang perlu kita kenali adalah bahwa bus ini diatur dalam perangkat keras di pengontrol AVR.

Selain itu, suka atau tidak suka, kami telah lama berkomunikasi dengan antarmuka SPI, segera setelah kami mulai mem-flash pengontrol kami untuk pertama kalinya, sejak di-flash melalui antarmuka ini.

Oleh karena itu, saya ingin mengenal ban ini lebih jauh.

Mari kita buka dokumentasi teknis pengontrol Atmega8, buka halaman yang menampilkan pinout pengontrol ini dan lihat dari pin 16 hingga 19 terdapat pin bus SPI

Sekarang sedikit lebih banyak tentang temuan ini

SS (pilihan chip)— ini adalah bagian pemilihan perangkat. Jika perangkat budak pada pin ini menjadi rendah, maka alat ini akan merespon dan bertukar informasi melalui bus SPI, jika tinggi maka tidak.

MOSI (input budak keluaran utama)- Ini adalah pin keluaran perangkat master dan masukan perangkat budak.

MISO (input master, output budak)- sebaliknya, keluaran dari budak, masukan dari master.

SCK— kaki sinkronisasi. Semua perangkat yang berpartisipasi dalam pertukaran informasi di bus ini disuplai dengan pulsa clock pada frekuensi tertentu.

Berikut diagram implementasi bus SPI pada pengontrol Atmega8

Seperti bus lainnya, ada sejumlah register yang menyimpan informasi tertentu.

Kami tertarik dengan SHIFT REGISTER, informasi dipertukarkan melaluinya. Segera setelah ada tepi tertentu pada pin sinkronisasi, baik turun atau naik, tergantung pada pengaturannya, register perangkat budak dan master ini akan bertukar informasi, dan tidak semua informasi, tetapi hanya satu bit. Register-register ini akan bergeser ke kiri dan bit paling signifikan dari setiap register akan menuju ke bit paling tidak signifikan dari register yang sama pada perangkat terkait. Artinya, budak akan mengirimkan bit paling signifikan melalui pin MOSI ke pemimpin, yang akan menulisnya ke bit tingkat rendah yang dikosongkan karena pergeseran ke kiri, dan budak akan mentransfer bit tingkat tinggi yang dipindahkan melalui MISO sematkan ke bit pemimpin tingkat rendah. Beginilah pertukarannya, yaitu, dalam 8 siklus clock penuh mereka akan bertukar byte sepenuhnya

Segera setelah semua 8 bit dari satu byte informasi dikirimkan, register tertentu akan memberi sinyal kepada kita hal itu proses ini selesai. Atau lebih tepatnya, bagian tertentu dari register tertentu.

Juga dalam diagram blok kita melihat pembagi, yang masukannya menerima pulsa clock dan kemudian, dibagi dengan nilai tertentu, dikirim melalui rantai ke pin SCK dan dari sana diumpankan ke perangkat budak di pin SCK. nama yang sama. Ini memastikan pengoperasian perangkat yang tersinkronisasi. Frekuensi jam dipilih dari yang terendah yang didukung oleh semua perangkat yang berpartisipasi dalam pertukaran.

Saya mengatakan jamak karena bisa ada lebih dari dua perangkat dalam satu rangkaian. Bagaimana hal ini dipastikan, asalkan perangkat tidak memiliki alamat apa pun, sekarang saya akan memberi tahu Anda.

Ada beberapa cara untuk bertukar informasi antara beberapa perangkat, yaitu ketika terdapat beberapa budak per perangkat master. Kami akan melihat dua yang paling umum.

Cara pertama adalah radial (klik gambar untuk memperbesar gambar)

Di sini master mengarahkan data ke perangkat tertentu, menyalakan logika 0 pada pin SS. Dengan metode ini, dimungkinkan untuk memilih hanya satu perangkat; Anda juga memerlukan beberapa pin bebas dari port pengontrol.

Ada metode lain yang menarik - cincin atau kaskade (klik pada gambar untuk memperbesar gambar)

Di sini kita melihat bahwa semua bagian seleksi sejajar dan pertukaran berlangsung dalam lingkaran. Dengan demikian, kecepatan berkurang karena lingkaran transmisi bertambah, tetapi kaki port tetap dipertahankan.

Kami akan mempelajari semua ini secara lebih rinci dalam pelajaran berikutnya, ketika kami menggunakan perangkat tertentu dalam proyek kami.

Nah, sepertinya dengan sirkuit transmisi data melalui bus SPI kami menemukan jawabannya.

Sekarang mari kita cari tahu cara mengontrol proses ini di tingkat register perangkat keras pengontrol AVR.

Kita melihat register ini pada diagram blok di atas pada halaman.

Atmega8 memiliki register berikut untuk melayani bus SPI.

SPDR (Daftar Data SPI)- register data, pada diagram bloknya adalah DATA BUFFER. Kami akan memasukkan satu byte ke dalam register ini untuk transmisi selanjutnya ke perangkat budak, dan dari situ kami akan membaca byte informasi yang berasal dari perangkat budak. Pengontrol kita juga tidak perlu menjadi perangkat utama. Selanjutnya, kita akan merakit rangkaian dua pengontrol, salah satunya akan menjadi budak. Jadi di register inilah byte untuk pengiriman dan penerimaan akan ditempatkan.

SPCR (Daftar Kontrol SPI)- daftar kontrol

Register ini mencakup bit-bit berikut:

SPIE (Aktifkan Interupsi SPI)- sedikit yang memungkinkan interupsi.

SPE (SPI Aktif)— sedikit yang mengaktifkan bus SPI.

DORD (Pesanan Data)— bit yang mengatur urutan pengiriman bit. Jika disetel ke 1, maka bit paling signifikan dikirim terlebih dahulu, jika disetel ke 0, bit paling signifikan dikirim.

MSTR (Pilihan Master/Budak)— bit yang menunjuk perangkat sebagai master atau slave. Ketika bit ini disetel ke 1, perangkat akan menjadi master.

CPOL (Polaritas Jam)— polaritas sinkronisasi, menentukan pada tepi pulsa sinkronisasi mana mode siaga akan dimulai

Jika bit ini 1, maka kita akan memiliki mode siaga dengan tepi menaik, dan jika 0, maka dengan tepi menurun.

CPHA (Fase Jam)— sedikit bertanggung jawab atas fase jam, yaitu ke tepi mana bit akan ditransmisikan.

Mari kita lihat diagram transfer data tergantung pada instalasi CPOL dan CPHA

Ini adalah ketergantungan yang menarik. Kadang-kadang kita kadang-kadang melihat ke dalam spesifikasi teknis dari perangkat apa pun yang, misalnya, dapat beroperasi dalam mode SPI 0:0 dan SPI 1:1, inilah tepatnya yang menyangkut pengaturan bit-bit ini.

SPR1, SPR0 (Pilihan Kecepatan Jam SPI)- ini adalah bit yang bertanggung jawab atas nilai pembagi frekuensi sinkronisasi; mereka bekerja sama dengan bit SPI2X terletak di daftar status. Ini juga merupakan kontrol, karena delapan bit dalam register kontrol tidak cukup untuk semua pengaturan, dan ada banyak bit gratis di register status.

SPSR (Daftar Status SPI)- daftar status

SPI2X (Bit Kecepatan SPI Ganda)- bit yang menggandakan kecepatan, bekerja bersama dengan bit SPR1 dan SPR0 dari register kontrol.

Mari kita lihat ketergantungan frekuensi pada ketiga bit ini

SPIF (Bendera Interupsi SPI)— Bendera interupsi. Kami menunggu bit ini disetel menjadi satu. ketika kita menerima satu byte. Segera setelah byte dari perangkat lain muncul sepenuhnya di buffer kami, tanda ini akan disetel. Bendera ini hanya berfungsi jika bit yang mengaktifkan interupsi disetel, serta interupsi global diaktifkan.

WCOL (Tulis Bendera Tabrakan)— bendera konflik atau tabrakan akan disetel jika ada konflik bit selama transfer data, jika selama transfer data dilakukan upaya untuk menulis ke register data.

Nah, sekarang kita bisa mengatakan bahwa kita sudah sedikit familiar dengan antarmuka SPI.

Tonton VIDEO TUTORIALnya(klik pada gambar)

Tampilan Postingan: 6.294

SPI(Bus Periferal Serial) - protokol pertukaran periferal serial. Tindik ini dikembangkan oleh Motorola, tetapi saat ini digunakan oleh banyak produsen. Ini dirancang untuk menghubungkan mikrokontroler satu sama lain, serta dengan semua jenis periferal: sensor, ADC, chip memori, jam. Namun masih yang paling umum digunakan SPI- Ini menulis program ke dalam memori mikrokontroler. Dalam mikrokontroler AVR dengan bantuan SPI Anda dapat mem-flash mikrokontroler tanpa melepasnya dari papan, metode flashing ini disebut ISP (Dalam Pemrograman Sistem). Meski namanya SPI Dan ISP sangat konsonan, keduanya bukan hal yang sama, in AVR SPI digunakan sebagai lapisan fisik ISP, yaitu garis yang digunakan SPI untuk transfer data, tetapi protokolnya sendiri (tingkat perangkat lunak) berbeda.

Tiga jalur digunakan untuk mengirimkan data ke SPI:

MISO (Output Budak Masukan Utama)– melalui jalur ini Master (master) menerima data dari Slave (budak).

MOSI (Input Budak Keluaran Utama)– Master mengirimkan data ke Slave melalui jalur ini.

SCK (Jam Serial)– berfungsi untuk mengirimkan sinyal jam ke perangkat budak.

Garis juga digunakan SS (Pilihan Budak), yang mendefinisikan perangkat yang digunakan Menguasai akan bertukar data.

Karena banyak produsen menggunakan SPI di perangkat mereka, nama pin mungkin sedikit berbeda. Di bawah ini adalah tabel dengan nama alternatif.


Ada dua jenis SPI: perangkat keras dan perangkat lunak. Saat mengimplementasikan perangkat lunak SPI, kita harus mengatur sinyal secara manual pada kaki yang sesuai MISO, MOSI, SS sambil menarik SCK. Dengan implementasi perangkat keras SPI kami mentransfer data ke register khusus, dan mikrokontroler itu sendiri melakukan manipulasi yang dijelaskan di atas, sesuai dengan pengaturan awal.

Implementasi fisik SPI, mewakili dua register geser yang dihubungkan bersama.


Tergantung pada level sinyal logisnya SCK, sinkronisasi terjadi Menguasai Dan Budak dan di depan mana data diambil dan digeser, 4 mode dimungkinkan SPI.

  • CPOL = 0 - sinyal sinkronisasi dimulai pada level rendah;
  • CPOL = 1 - sinyal sinkronisasi dimulai pada level tinggi;
  • CPHA = 0 - data diambil sampelnya pada tepi naik sinyal sinkronisasi;
  • CPHA = 1 - data diambil sampelnya pada tepi jatuh sinyal sinkronisasi.
Osilogram di bawah menunjukkan tampilan parsel 0x17 dalam mode yang berbeda.
CPOL = 0 CPHA = 0


CPOL = 1 CPHA = 0


CPOL = 0 CPHA = 1


CPOL = 1 CPHA = 1

SPI- antarmuka sinkron, yaitu untuk menerima beberapa data dari Budak, Menguasai harus mengirimkan sesuatu. Semuanya tampak jelas, tapi bagaimana jika Menguasai mengirimkan satu byte, dan Budak haruskah aku mengembalikannya dua? Dalam hal ini, Master harus mengiriminya sesuatu sebanyak 2 kali, misalnya 0x00.
//kirim perintah, responnya harus dua byte Spi_Master_Transmit(chx); //kirim sesuatu untuk menerima byte pertama Spi_Master_Transmit(0X00); sentuh_x = SPDR; sentuh_x<<= 8; //отправляем что-нибудь для того чтобы принять второй байт Spi_Master_Transmit(0X00); touch_x |= SPDR; touch_x >>= 3;
Itu saja, contoh kode di atas diambil dari proyek yang sedang berjalan.

Antarmuka Periferal Serial atau SPI- antarmuka periferal serial, digunakan untuk komunikasi antara periferal dan mikrokontroler. Misalnya, periferal dapat berupa: layar, berbagai sensor, memori FLASH, kartu SD (ya, ya, kartu SD atau “flash drive” yang Anda gunakan di ponsel dan kamera untuk berkomunikasi dunia luar menggunakan antarmuka SPI), dll.

Sayangnya, tidak ada dokumentasi resmi untuk antarmuka SPI, jadi postingan ini didasarkan pada berbagai artikel di Internet, pengalaman saya sendiri, dan dokumentasi untuk mikrokontroler.

Baca tentang apa itu SPI di artikel Wikipedia

DI DALAM SPI Selalu ada satu tuan dan satu/beberapa budak.

Transfer data selalu dimulai oleh master.

SPI menggunakan empat jalur komunikasi:

  • MOSI atau S.I.- keluaran master, masukan budak (Bahasa Inggris) MenguasaiKeluarBudakDi dalam). Berfungsi untuk mentransfer data dari perangkat master ke perangkat slave.
  • SUP KEDELAI JEPANG atau JADI- masukan master, keluaran budak (Bahasa Inggris) MenguasaiDi dalamBudakKeluar). Berfungsi untuk mentransfer data dari perangkat slave ke perangkat master.
  • SCLK atau SCK- sinyal jam serial SerialJam). Berfungsi untuk mengirimkan sinyal jam untuk perangkat slave.
  • C.S. atau SS- pilihan sirkuit mikro, pilihan budak (eng. Pilih Chip, Pilih Budak).

P.S. Untuk memastikan komunikasi satu arah dengan satu perangkat, cukup menggunakan SCLK, MOSI(jika perangkat budak hanya menerima) atau SCLK, SUP KEDELAI JEPANG(jika perangkat budak tidak menerima apa pun, tetapi hanya mengirimkan informasi). Di pintu masuk C.S. perangkat budak harus diatur ke logis nol, jika tidak, budak tidak akan bekerja.

P.S. Jika perangkat budak mengirim dan menerima, maka Anda dapat membatasi diri pada tiga kabel - SUP KEDELAI JEPANG, MOSI, SCLK, di pintu masuk C.S. perangkat budak juga perlu mengatur logikanya nol.

SPI dapat diimplementasikan pada mikrokontroler perangkat keras, maka tugas pengelolaan antarmuka diselesaikan untuk setiap mikrokontroler secara terpisah, karena implementasinya mungkin berbeda-beda. Misalnya untuk ATmega328Р(mikrokontroler dari Atmel) saat bekerja dengan SPI kita perlu menginstalnya secara terprogram SS logis nol pada permulaan penerimaan/transmisi dan mengatur logis satuan kembali pada akhir transmisi.

Untuk mentransfer data ke perangkat budak, Anda perlu melakukannya daftar geser MASTER (pada gambar, register geser master adalah “ DAFTAR PERGESERAN 8 BIT") tulis byte informasi yang dikirimkan. Pada saat yang sama, secara otomatis SCK akan mulai menghasilkan sinyal jam. Ini adalah implementasi perangkat keras.

Jika tidak ada dukungan perangkat keras untuk SPI di mikrokontroler, maka antarmuka SPI selalu dapat diimplementasikan dalam perangkat lunak, yaitu membuat sebuah program yang mengontrol kaki pengontrol sesuai dengan protokol pertukaran SP.

Perbedaan Implementasi Antarmuka SPI

Sirkuit mikro budak dapat "menafsirkan" sinyal yang diterima melalui SPI secara berbeda, perbedaannya mungkin terletak pada poin-poin berikut:

  • dalam jumlah transmisi data atau Ukuran paket, biasanya ini 8 sedikit, tapi masih ada lagi
  • dalam urutan bit, pertama bagian yang paling signifikan atau pertama sedikit paling tidak signifikan
  • Oleh pada tingkat sinyal jam berapa data dikirimkan?(menurut satuan logika (TINGGI) atau logika nol (RENDAH))
  • Oleh ke tepi pulsa manakah sinkronisasi terjadi?(pendakian atau penurunan), secara singkat disebut “fase sinkronisasi”

Kombinasi " tingkat sinyal jam" Dan " fase sinkronisasi» didefinisikan dalam spesifikasi sebagai Mode operasi SPI. Hanya ada ke-4:

Mode Kekuatan sinyal (CPOL) Fase (CPHA)
0 0 0
1 0 1
2 1 0
3 1 1

Di kolom " Tingkat sinyal» 1, maksudnya sedikit data, diterima budak kapan nol ditransmisikan sepanjang jalur sinkronisasi, dengan kata lain - perangkat budak menunggu dan tidak menerima data saat aktif SCK diatur ke logis 1.

Di kolom " Fase» 1, berarti sinyal sinkronisasi ditentukan oleh tepi jatuh pulsa jam, dan logis 0-l Oleh tepi naik pulsa jam.

P.S. Apalagi jika pada kolom “ Tingkat sinyal» terpasang 1, maka muka turun dan naik jika digambarkan pada diagram adalah “ terbalik».

Pada grafik, data 4 mode dapat digambarkan sebagai berikut:

Anda dapat membaca lebih lanjut tentang prinsip pengoperasian SPI di artikel

http://www.kit-e.ru/articles/interface/2009_03_53.php

Implementasi SPI pada mikrokontroler ATmega seri AVR (ATmega328P) dan mikrokontroler Motorola “awal”

Dalam mikrokontroler ATmega328P(mikrokontroler dari seri Atmel AVR) Anda dapat mengontrol yang berikut ini parameter SPI:

Tiga register digunakan untuk mengkonfigurasi dan mengontrol antarmuka SPI:

  • Daftar kontrol - SPCR
  • Daftar status - SPSR
  • Daftar data - SPDR

Baca lebih lanjut tentang masing-masingnya...

Daftar kontrol – « SPCR» 0x2C, alamat untuk merekam 0x4C

— Unit logika dalam bit ke-7(nama sedikit SPIE) – aktifkan interupsi SPI(interupsi akan terjadi jika bit pengaktifan interupsi register global disetel SREG(bit ke-7)). Setelah transfer byte selesai, interupsi akan dihasilkan.

— Unit logika dalam bit ke-6(nama sedikit - SPE) - untuk menyambungkan SS, MOSI, MISO Dan SCK ke port mikrokontroler ATmega328P - PB2,PB3,PB4,PB5.

— Unit logika dalam bit ke-5(nama sedikit DORD) – akan menentukannya menurut SPI ditransmisikan terlebih dahulu peringkat junior, A lalu yang tertua– Modus “LSB”. Logikanya nol, sebaliknya, berarti bahwa bit paling signifikan ditransmisikan terlebih dahulu, dan kemudian bit paling tidak signifikan - mode "MSB".

— Unit logika dalam bit ke-4(nama sedikit - MSTR) — mengaktifkan mode tuan rumah, nol – mengaktifkan mode budak

— Unit logika dalam bit ke-3(nama sedikit CPOL) (sinkronisasi polaritas sinyal atau tingkat sinkronisasi) – sinkronisasi dilakukan sesuai dengan kurangnya impuls(logis nol) atau sinyal jam dalam keadaan siaga sama dengan 1. Logis nol - sinkronisasi dilakukan dengan adanya pulsa (dengan pulsa logis) atau sinyal jam dalam keadaan siaga sama dengan 0. Di bagian depan mana (turun atau naik) sinkronisasi dilakukan ditentukan dalam ke-2 sedikit ( CPHA).

— Unit logika dalam bit ke-2(nama sedikit CPHA) (fase sinkronisasi) – menentukan sinyal sinkronisasi ditentukan oleh tepi jatuh SCK, dan logika nol di tepi naik SCK. Selain itu, jika CPOL disetel ke 1, maka bagian depan yang turun dan naik dapat digambarkan “terbalik” pada diagram.

1 Dan tanggal 0 sedikit demi sedikit SPI2x di daftar SPSR menentukan Kecepatan data SPI(atau kecepatan jam melalui SCK). Bagian-bagian ini hanya mempunyai arti bagi sang majikan; bagi sang budak, bagian-bagian ini tidak ada artinya, karena Kecepatan penerimaan tergantung pada frekuensi SCK master.

Di mana fokus frekuensi jam osilator master SPI (biasanya sama dengan frekuensi jam prosesor).

Daftar Status - "SPSR"(alamat di ATmega328P untuk membaca 0x2D, alamat untuk merekam 0x4D, jika Anda memiliki MK yang berbeda, Anda dapat menemukan alamatnya di dokumentasi)

tanggal 7 daftar sedikit " SPIF": Bendera Interupsi SPI

Bitnya sudah diatur satuan, Kapan perpindahan byte data aktif MOSI selesai. Jika bit pengaktifan interupsi SPI (bit SPIE) dalam register SPCR diatur, pengaturan flag SPIF menyebabkan permintaan interupsi dihasilkan.

tanggal 6 daftar sedikit " WCOL": Tulis Bendera Tabrakan

Sedikit menulis konflik ke daftar SPDR. Bitnya sudah diatur satuan, jika di waktu transmisi data sedang berjalan upaya menulis V daftar data SPDR.

- Dengan tanggal 5 Oleh 1 bit – bit yang dicadangkan, nilainya selalu sama 0

tanggal 0 sedikit " SPI2X": Bit Kecepatan SPI Ganda

Sedikit " kecepatan ganda transmisi data" Jika bitnya tertulis satuan, Itu kecepatan transfer datanya berlipat ganda. Menggunakan kombinasi bit ini dan 1 Dan tanggal 0 sedikit ( SPR1, SPR0) mendaftar SPCR, menentukan kecepatan transmisi data SPI. .

Daftar Data - "SPDR"(alamat di ATmega328P untuk membaca 0x2E, alamat untuk merekam 0x4E, jika Anda memiliki MK yang berbeda, Anda dapat menemukan alamatnya di dokumentasi)

Ukuran register sama seperti di atas - 8 sedikit. Register ini digunakan untuk mengirimkan dan membaca data melalui SPI. Dengan menempatkan data ke dalamnya, Anda memulai proses transfer.

Mari kita lihat 3 contoh bekerja dengan antarmuka SPI pada ATmega328P di lingkungan:

- Arduino

#termasuk byte x=B11000000; //bit byte yang ditransmisikan y= B00000000; //bit penerima akan ditulis ke variabel y void setup() ( SPI.begin(); /* Inisialisasi SPI */ /* inisialisasi di Arduino artinya - setel satu di SS - setel ke output SS (Slave Select atau pemilihan budak) - 10 pin - atur 1 di bit berikut dari register kontrol SPCR: di bit ke-4 (nama bit - MSTR) - aktifkan mode master di bit ke-6 (nama bit - SPE) - sambungkan SS, MOSI, MISO dan SCK ke port PB4,PB5,PB6,PB7 (10,11,12,13 pin di Arduino) - konfigurasikan pin output berikut: SCK (Serial Clock atau sinyal clock) - 13 pin MOSI (Master Out Slave In atau data dari master) - 11 pin Sebagai hasil inisialisasi melalui SPI.begin(), konfigurasi antarmuka SPI adalah sebagai berikut: - urutan bit “MSB”, yaitu bit paling signifikan ditransmisikan terlebih dahulu, dan kemudian bit yang paling signifikan ditransmisikan terlebih dahulu, dan kemudian yang paling tidak signifikan - sinkronisasi dilakukan dengan adanya pulsa atau sinyal clock dalam keadaan menunggu adalah 0 - sinyal sinkronisasi ditentukan oleh tepi naik SCK (dua titik di atas menunjukkan bahwa mode SPI dalam hal ini adalah 0 ) - baud rate fosc/4 */ // KITA DAPAT MENGINISIalisasi ULANG BEBERAPA PARAMETER KOMUNIKASI SPI sendiri // mengurutkan urutan bit //SPI.setBitOrder(MSBFIRST); /* LSBFIRST - junior dulu, lalu senior MSBFIRST - senior dulu, lalu junior (nilai default dari SPI.begin) */ // frekuensi pertukaran data //SPI.setClockDivider(SPI_CLOCK_DIV4); /* didefinisikan sebagai rasio fosc terhadap koefisien, nilai yang mungkin adalah: SPI_CLOCK_DIV2 SPI_CLOCK_DIV4 SPI_CLOCK_DIV8 SPI_CLOCK_DIV16 SPI_CLOCK_DIV32 SPI_CLOCK_DIV64 SPI_CLOCK_DIV128 */ //Mode operasi SPI //SPI.setDataMode(SPI_MODE0); /* SPI_MODE0 - mode nol SPI_MODE1 - mode pertama SPI_MODE2 - mode kedua SPI_MODE3 - mode ketiga */ ) void loop() ( /* IMPLEMENTASI TRANSFER DATA MELALUI SPI */ digitalWrite(10, HIGH); /* kita wajib setting itu sendiri di SS 1-tsu */ y=SPI.transfer(x); /* mentransmisikan argumen bit demi bit (byte) dan menerima respons dari perangkat budak, transfer dilakukan dengan menetapkan nilai byte ke register SPDR dan saat ini secara otomatis ke SCK (13 pin ) sinyal clock dihasilkan */ digitalWrite(10, LOW); /* kita diharuskan menyetel SS ke 0 */ SPI.end(); bus SPI dari pin 10,11,12,13 */ /* Artinya, menyetel 0 ke bit ke-6 (SPE) dari register SPCR */ )

#termasuk

byte x = B11000000; //bit yang ditransmisikan

byte y = B00000000; //bit penerima akan ditulis ke variabel y

batalkan pengaturan() (

SPI. mulai(); /* Inisialisasi SPI */

/* inisialisasi di Arduino artinya

Setel satuan ke SS

Diatur ke keluaran SS (Pilihan Budak atau pemilihan budak) - 10 pin

Atur bit register kontrol SPCR berikut ke 1:

Di bit ke-4 (nama bit - MSTR) - aktifkan mode master

B bit ke-6 (nama bit - SPE) - sambungkan

SS, MOSI, MISO dan SCK

Ke port PB4,PB5,PB6,PB7

(10,11,12,13 pin di Arduino)

Konfigurasikan pin keluaran berikut:

SCK (Jam Serial atau sinyal jam) - 13 pin

MOSI (Master Out Slave In atau data dari master) - 11 pin

Sebagai hasil inisialisasi melalui SPI.begin()

Konfigurasi antarmuka SPI kami adalah sebagai berikut:

Urutan bitnya adalah "MSB", yaitu. Bit yang paling signifikan ditransmisikan terlebih dahulu, lalu bit yang paling tidak signifikan

Sinkronisasi didasarkan pada keberadaan pulsa

Atau sinyal jam dalam keadaan idle adalah 0

Sinyal sinkronisasi ditentukan oleh naiknya tepi SCK

(dua poin di atas menunjukkan bahwa mode SPI dalam hal ini adalah 0)

Tingkat baud fosc/4

// KITA DAPAT MENGINISIALISASI BEBERAPA PARAMETER KOMUNIKASI SPI sendiri

// urutan bit

//SPI.setBitOrder(MSBPERTAMA);

// frekuensi pertukaran data

//SPI.setClockDivider(SPI_CLOCK_DIV4);

/* didefinisikan sebagai relasi

Fosc ke koefisien yang nilai kemungkinannya adalah:

SPI_CLOCK_DIV2

SPI_CLOCK_DIV4

SPI_CLOCK_DIV8

SPI_CLOCK_DIV16

SPI_CLOCK_DIV32

SPI_CLOCK_DIV64

SPI_CLOCK_DIV128

//Mode operasi SPI

//SPI.setDataMode(SPI_MODE0);

SPI_MODE0 - mode nol

SPI_MODE1 - mode pertama

SPI_MODE2 - mode kedua

SPI_MODE3 - mode ketiga

lingkaran kosong()

/* PELAKSANAAN TRANSFER DATA MELALUI SPI */

digitalWrite(10, TINGGI); /* kita diharuskan menginstal sendiri 1-tsu di SS */

kamu = SPI. transfer(x); /* mentransmisikan argumen bitwise (byte) dan menerima respons dari perangkat budak

Transfer dilakukan dengan menugaskan register SPDR nilai byte

Dan saat ini otomatis pada SCK (13 pin)

Sinyal jam dihasilkan */

digitalWrite(10, RENDAH); /* kita diharuskan untuk mengatur SS ke 0 sendiri */

SPI. akhir(); /* menonaktifkan bus SPI dari pin 10,11,12,13 */

/* Itu adalah menyetel 0 hingga bit 6 (SPE) dari register SPCR */

- Atmel Studio (AVR GCC)

#termasuk #termasuk batal init_spi() ( DDRB=(1<

#termasuk

#termasuk

batal init_spi() (

DDRB = (1<< PB0 ) | (1 << PB1 ) | (1 << PB2 ) | (0 << PB3 ) ;

//konfigurasi pin untuk SPI (SS, SCK, MOSI - output, input MOSI)

// inisialisasi SPI

// Tipe SPI: Master

// Kecepatan Jam SPI: 2000.000 kHz

// Fase Jam SPI: Siklus Mulai

// Polaritas Jam SPI: Rendah

// Urutan Data SPI: MSB Pertama

SPCR = (0<< SPIE ) | (1 << SPE ) | (0 << DORD ) | (1 << MSTR ) | (0 << CPOL ) | (0 << CPHA ) | (1 << SPR1 ) | (1 << SPR0 ) ;

Antarmuka transfer.

Banyak antarmuka transfer data telah dikembangkan untuk mentransfer data dari satu perangkat ke perangkat lainnya atau dari satu chip ke chip lainnya. Setiap antarmuka memiliki sisi positif dan negatif, jadi Anda perlu mengetahui antarmuka apa saja, kelebihan dan kekurangannya, dan menggunakan antarmuka yang tepat untuk mentransfer data dalam situasi tertentu.

Antarmuka hadir dengan transfer data asinkron dan sinkron. Dengan transmisi data sinkron, sinyal jam ditransmisikan secara bersamaan dengan data, memungkinkan penerima dan pemancar untuk melakukan sinkronisasi. Contoh dari protokol tersebut adalah antarmuka SPI.

Dalam transmisi data asinkron tidak ada sinyal clock. Pada saluran seperti itu terdapat bahaya ketidaksesuaian antara penerima dan pemancar, akibatnya data selanjutnya tidak akan diterima dengan benar. Untuk mencegah hal ini, antarmuka asinkron melakukan sinkronisasi berkala sepanjang jalur data. Keuntungan dari antarmuka tersebut adalah jumlah konduktor yang diperlukan untuk transmisi lebih sedikit.

Mari kita lihat lebih dekat beberapa antarmuka paling populer.

Antarmuka USART.

Antarmuka USART adalah transceiver sinkron-asinkron universal serial. Data ditransfer ke USART secara berkala. Jangka waktu ini ditentukan oleh kecepatan USART yang ditentukan dan ditentukan dalam baud (Untuk karakter yang hanya dapat mengambil nilai sama dengan nol atau satu, baud setara dengan bit per detik). Ada kisaran kecepatan standar yang diterima secara umum: 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600 baud.

Selain bit data, USART secara otomatis memasukkan tanda sinkronisasi ke dalam aliran, yang disebut bit awal dan akhir. Setelah diterima, bit tambahan ini dihapus. Biasanya, bit awal dan akhir memisahkan satu byte informasi (8 bit), tetapi ada implementasi USART yang memungkinkan transmisi 5, 6, 7, 8, atau 9 bit. Bit-bit yang dipisahkan oleh sinyal start dan stop adalah pengiriman minimum. USART memungkinkan Anda memasukkan dua bit stop selama transmisi untuk mengurangi kemungkinan desinkronisasi penerima dan pemancar dalam lalu lintas padat. Penerima mengabaikan bit stop kedua, menganggapnya sebagai jeda singkat pada saluran.

Konvensinya adalah bahwa keadaan pasif (jika tidak ada data) dari input dan output USART adalah logika “1”. Bit awal selalu logis "0", sehingga penerima USART menunggu transisi dari "1" ke "0" dan menghitung interval waktu setengah durasi bit (pertengahan transmisi bit awal) . Jika saat ini inputnya masih “0”, maka proses penerimaan minimal parsel dimulai. Untuk melakukan hal ini, penerima menghitung durasi 9 bit berturut-turut (untuk data 8-bit) dan mencatat status input setiap saat. 8 nilai pertama adalah data yang diterima, nilai terakhir adalah nilai uji (stop bit). Nilai bit stop selalu “1”; jika nilai aktual yang diterima berbeda, USART mencatat kesalahan.

Untuk membentuk interval waktu, USART pengirim dan penerima mempunyai sumber waktu yang tepat (clocking). Keakuratan sumber ini harus sedemikian rupa sehingga jumlah kesalahan (penerima dan pemancar) dalam pengaturan interval waktu dari awal pulsa mulai hingga pertengahan pulsa berhenti tidak melebihi setengah (atau lebih baik lagi, setidaknya a seperempat) dari interval bit. Untuk pesan 8-bit 0,5/9,5 = 5% (pada kenyataannya tidak lebih dari 3%). Karena ini adalah jumlah kesalahan penerima dan pemancar ditambah kemungkinan distorsi sinyal pada saluran, toleransi yang disarankan untuk keakuratan pencatatan jam kerja USART tidak lebih dari 1,5%.

Karena bit clock menempati bagian dari bitstream, throughput UART yang dihasilkan tidak sama dengan kecepatan koneksi. Misalnya, untuk transmisi format 8-bit 8-N-1, bit clock menempati 20% aliran, yang mana untuk kecepatan fisik 115.200 baud memberikan kecepatan bit data 92.160 bps atau 11.520 byte/s.

Keseimbangan

Protokol USART memiliki kemampuan untuk memantau integritas data secara otomatis menggunakan metode paritas bit. Bila fitur ini diaktifkan, bit data terakhir ("bit paritas") selalu 1 atau 0, sehingga jumlah satuan dalam satu byte selalu genap.

Alur kontrol

Di masa lalu, perangkat USART bisa sangat lambat sehingga tidak dapat mengikuti aliran data yang masuk. Untuk mengatasi masalah ini, modul USART dilengkapi dengan output dan input kontrol aliran terpisah. Ketika buffer input penuh, logika USART penerima mengatur tingkat penghambatan pada output yang sesuai, dan USART pengirim menangguhkan transmisi. Kemudian, kendali aliran ditugaskan ke protokol komunikasi, dan kebutuhan akan jalur kendali aliran terpisah secara bertahap menghilang.

Implementasi fisik.

USART adalah protokol pertukaran, mis. itu menentukan metode pembentukan bit, parameter transmisi byte, kecepatan transmisi, dll.

Namun implementasi fisik USART mungkin berbeda. Misalnya, untuk mengirimkan data dalam satu papan, sinyal ditransmisikan pada level +5V dan 0V. Untuk mentransfer data jarak jauh dan antar perangkat, level dan standar tegangan fisik lainnya digunakan, seperti: loop arus (4-20 mA), RS-232 (port COM), RS-485 dan sejenisnya.

Untuk mengubah level "pengontrol" 0-5V menjadi level "standar", ada sejumlah besar sirkuit mikro khusus, misalnya ADM202 untuk RS-232.

SPI antarmuka serial

Nama SPI adalah singkatan dari "Serial Peripheral Bus", yang mencerminkan tujuannya - bus untuk menghubungkan perangkat eksternal. Bus SPI diatur berdasarkan prinsip master-slave. Master bus biasanya berupa mikrokontroler, tetapi bisa juga berupa logika yang dapat diprogram, pengontrol DSP, atau ASIC. Perangkat yang terhubung ke master adalah budak. Peran mereka dimainkan oleh berbagai jenis sirkuit mikro, termasuk. perangkat penyimpanan (EEPROM, memori Flash, SRAM), jam waktu nyata (RTC), ADC/DAC, potensiometer digital, pengontrol khusus, dll.

Blok bangunan utama dari antarmuka SPI adalah register geser konvensional, yang sinkronisasi dan sinyal input/output bitstreamnya membentuk sinyal antarmuka. Oleh karena itu, lebih tepat menyebut protokol SPI bukan sebagai protokol transfer data, melainkan sebagai protokol pertukaran data antara dua shift register, yang masing-masing secara bersamaan menjalankan fungsi penerima dan pemancar. Prasyarat untuk transmisi data pada bus SPI adalah pembangkitan sinyal sinkronisasi bus. Hanya pemimpin yang berhak menghasilkan sinyal ini dan pekerjaan budak sepenuhnya bergantung padanya.

Koneksi.

Ada tiga jenis koneksi ke bus SPI, yang masing-masing melibatkan empat sinyal. Tujuan dari sinyal SPI dijelaskan pada Tabel 7.1.

Koneksi paling sederhana, yang hanya melibatkan dua sirkuit mikro, ditunjukkan pada Gambar 7.2. Di sini, master bus mentransmisikan data sepanjang jalur MOSI secara sinkron dengan sinyal SCLK yang dihasilkannya, dan budak menangkap bit data yang dikirimkan pada tepi tertentu dari sinyal sinkronisasi yang diterima. Pada saat yang sama, budak mengirimkan paket datanya. Rangkaian yang disajikan dapat disederhanakan dengan menghilangkan jalur MISO jika IC slave yang digunakan tidak menyediakan transmisi data respon atau tidak diperlukan. Transfer data satu arah dapat ditemukan di chip seperti DAC, potensiometer digital, amplifier dan driver yang dapat diprogram. Jadi, opsi yang dipertimbangkan untuk menghubungkan IC budak memerlukan 3 atau 4 jalur komunikasi.

Agar IC slave dapat menerima dan mengirimkan data, selain memiliki sinyal clock, jalur SS juga harus digerakkan rendah. Jika tidak, IC budak akan tidak aktif. Ketika hanya satu IC eksternal yang digunakan, mungkin tergoda untuk menghilangkan jalur SS dengan membuat input pilihan IC slave menjadi sangat rendah. Solusi ini sangat tidak diinginkan dan dapat menyebabkan kegagalan atau bahkan ketidakmungkinan transfer data, karena Input pemilihan chip berfungsi untuk mengatur ulang IC ke keadaan awalnya dan terkadang memulai output dari bit data pertama.

Jika perlu untuk menghubungkan beberapa sirkuit mikro ke bus SPI, digunakan koneksi independen (paralel) (Gbr. 7.3) atau koneksi kaskade (serial) (Gbr. 7.4). Koneksi independen lebih umum karena dicapai saat menggunakan chip yang kompatibel dengan SPI. Di sini, semua sinyal, kecuali untuk pemilihan sirkuit mikro, dihubungkan secara paralel, dan master bus, dengan memindahkan satu atau beberapa sinyal SS ke keadaan rendah, menentukan dengan IC budak mana ia akan bertukar data. Kerugian utama dari koneksi semacam itu adalah perlunya jalur tambahan untuk menangani chip budak (jumlah total jalur komunikasi adalah 3+n, di mana n adalah jumlah chip budak).

Jika kaki mikrokontroler tidak mencukupi, Anda dapat menggunakan chip demultiplexer. Demultiplexer menghubungkan satu sinyal masukan ke salah satu sinyal keluaran, bergantung pada kode pada pin kontrol. Gambar 7.4 menunjukkan diagram koneksi untuk demultiplexer. Sinyal SS disuplai ke inputnya, yang mengambil nilai sama dengan 0 jika perlu untuk memilih salah satu sirkuit mikro. Jumlah sirkuit mikro yang diperlukan dalam kode biner disuplai ke kaki Am-A0. Hal ini memungkinkan Anda untuk mengurangi jumlah kaki yang digunakan dalam mikrokontroler menjadi m=log 2 n. Dimana n adalah jumlah chip budak. Itu. untuk menghubungkan 128 perangkat diperlukan 8 pin mikrokontroler. Satu untuk mengatur sinyal pengaktifan dan 7 untuk mengatur jumlah chip yang akan dihidupkan. Perlu dicatat bahwa harus ada yang logis pada kaki demultiplexer yang tidak terhubung. Jika tidak, inverter sinyal digunakan, yang mengubah nol logis menjadi nol logis.

Peralihan kaskade bebas dari kelemahan ini, karena di sini, beberapa chip membentuk satu register geser besar. Untuk melakukan hal ini, output data transmisi dari satu IC dihubungkan ke input penerimaan data dari IC lainnya, seperti yang ditunjukkan pada Gambar 3. Input pemilihan chip di sini dihubungkan secara paralel dan, dengan demikian, jumlah jalur komunikasi tetap sama. ke 4. Namun, penggunaan koneksi kaskade hanya dimungkinkan jika dukungannya ditunjukkan dalam dokumentasi untuk chip yang digunakan. Untuk mengetahuinya, penting untuk mengetahui bahwa hubungan seperti itu disebut "daisy-chaining" dalam bahasa Inggris.

Protokol transfer

Protokol transmisi melalui antarmuka SPI pada dasarnya identik dengan logika register geser (Gambar 7.6), yang terdiri dari melakukan operasi shift dan, karenanya, input bit dan output data pada tepi tertentu dari sinyal sinkronisasi. Pengaturan data selama transmisi dan pengambilan sampel selama penerimaan selalu dilakukan pada tepi jam yang berlawanan. Hal ini diperlukan untuk memastikan bahwa data diambil sampelnya setelah data tersebut dapat diandalkan. Jika kita memperhitungkan bahwa tepi pertama dalam siklus transmisi dapat berupa tepi naik atau turun, maka ada empat kemungkinan opsi logika untuk pengoperasian antarmuka SPI. Opsi ini disebut mode SPI dan dijelaskan oleh dua parameter:

· CPOL - level awal sinyal sinkronisasi (jika CPOL=0, maka jalur sinkronisasi sebelum dimulainya siklus transmisi dan setelah siklus transmisi berakhir memiliki level rendah (yaitu tepi pertama naik, dan tepi terakhir turun), sebaliknya, jika CPOL=1, - tinggi (yaitu bagian depan pertama turun, dan bagian depan terakhir naik));

· CPHA - fase sinkronisasi; Parameter ini menentukan urutan pemasangan dan pengambilan data. Jika CPHA = 0, maka pada tepi naik dari siklus jam, data akan diambil sampelnya, dan kemudian pada tepi turun, data akan ditetapkan. Jika CPHA=1, maka instalasi data akan dilakukan pada tepi naik pada siklus sinkronisasi, dan pengambilan sampel akan dilakukan pada tepi turun.

Informasi mode SPI disajikan pada Gambar 7.7 dan 7.8.

Chip master dan slave yang beroperasi dalam mode SPI berbeda tidak kompatibel, oleh karena itu, sebelum memilih chip slave, penting untuk memperjelas mode mana yang didukung oleh bus master. Modul SPI perangkat keras yang terintegrasi ke dalam mikrokontroler, dalam banyak kasus, mendukung kemampuan untuk memilih mode apa pun dan, oleh karena itu, chip SPI budak apa pun dapat dihubungkan ke modul tersebut (hanya berlaku untuk opsi koneksi independen). Selain itu, protokol SPI dalam mode apa pun mudah diimplementasikan dalam perangkat lunak.

Antarmuka RS-485

Antarmuka RS-485 (nama lain adalah EIA/TIA-485) adalah salah satu standar lapisan komunikasi fisik yang paling umum. Lapisan fisik adalah saluran komunikasi dan metode transmisi sinyal (lapisan 1 model interkoneksi sistem terbuka OSI).

Jaringan yang dibangun pada antarmuka RS-485 terdiri dari transceiver yang dihubungkan menggunakan pasangan terpilin - dua kabel terpilin. Antarmuka RS-485 didasarkan pada prinsip transmisi data diferensial (seimbang). Esensinya adalah mengirimkan satu sinyal melalui dua kabel. Selain itu, satu kabel (dengan syarat A) membawa sinyal asli, dan kabel lainnya (dengan syarat B) membawa salinan kebalikannya. Dengan kata lain, jika ada angka “1” di satu kabel, maka ada angka “0” di kabel lainnya, dan sebaliknya. Jadi, selalu ada beda potensial antara dua kabel dari pasangan terpilin: pada “1” bernilai positif, pada “0” bernilai negatif (Gambar 7.9).

Perbedaan potensial inilah yang mentransmisikan sinyal. Metode transmisi ini memberikan kekebalan tinggi terhadap interferensi mode umum. Interferensi mode umum adalah interferensi yang mempengaruhi kedua kabel saluran secara merata. Misalnya, gelombang elektromagnetik yang melewati suatu bagian jalur komunikasi menginduksi potensial pada kedua kabel. Jika sinyal ditransmisikan secara potensial dalam satu kabel relatif terhadap kabel common, seperti pada RS-232, maka interferensi pada kabel ini dapat mendistorsi sinyal relatif terhadap kabel common (ground), yang menyerap interferensi dengan baik. Selain itu, perbedaan potensial ground akan turun pada resistansi kabel biasa yang panjang - sumber distorsi tambahan. Dan dengan transmisi diferensial, distorsi tidak terjadi. Faktanya, jika dua kabel terletak berdekatan satu sama lain, dan bahkan terjalin, maka pickup pada kedua kabel adalah sama. Potensial pada kedua kabel yang dibebani sama berubah secara merata, sedangkan perbedaan potensial informatif tetap tidak berubah.

Implementasi perangkat keras dari antarmuka RS485.

Implementasi perangkat keras dari antarmuka - chip transceiver dengan input/output diferensial (ke saluran) dan port digital (ke port UART pengontrol). Ada dua opsi untuk antarmuka ini: RS-422 dan RS-485.

RS-422 adalah antarmuka dupleks penuh. Penerimaan dan transmisi terjadi melalui dua pasang kabel terpisah. Hanya boleh ada satu pemancar pada setiap pasang kabel.

RS-485 adalah antarmuka setengah dupleks. Penerimaan dan transmisi terjadi melalui sepasang kabel dengan pemisahan waktu. Terdapat banyak pemancar dalam suatu jaringan, karena pemancar tersebut dapat dimatikan dalam mode penerimaan (Gambar 7.10).

Penjelasan simbol pada Gambar 7.10

D (pengemudi) - pemancar;
R (penerima) - penerima;
DI (input driver) - input digital pemancar;
RO (output penerima) - output digital penerima;
DE (pengaktifan driver) - izin untuk mengoperasikan pemancar;
RE (pengaktifan penerima) - izin untuk mengoperasikan penerima;
A - input/output diferensial langsung;
B - masukan/keluaran diferensial terbalik;
Y - keluaran diferensial langsung (RS-422);
Z - keluaran diferensial terbalik (RS-422).

Mari kita lihat lebih dekat transceiver RS-485. Output digital penerima (RO) terhubung ke port UART penerima (RX). Input digital pemancar (DI) ke port pemancar UART (TX). Karena penerima dan pemancar dihubungkan pada sisi diferensial, pemancar harus dimatikan selama penerimaan, dan penerima harus dimatikan selama transmisi. Untuk tujuan ini, input kontrol digunakan - izin penerima (RE) dan izin pemancar (DE). Karena input RE terbalik, maka dapat dihubungkan ke DE dan mengganti penerima dan pemancar dengan satu sinyal dari port mana pun di pengontrol. Pada level "0" - berfungsi untuk penerimaan, pada "1" - untuk transmisi (Gbr. 7.11).

Penerima, menerima beda potensial (UAB) pada input diferensial (AB), mengubahnya menjadi sinyal digital pada output RO. Sensitivitas penerima mungkin berbeda, tetapi produsen chip transceiver menulis dalam dokumentasi rentang ambang batas yang dijamin untuk pengenalan sinyal. Biasanya ambang batas ini adalah ±200 mV. Artinya, ketika UAB > +200 mV - penerima mendeteksi "1" ketika UAB< -200 мВ - приемник определяет "0". Если разность потенциалов в линии настолько мала, что не выходит за пороговые значения - правильное распознавание сигнала не гарантируется. Кроме того, в линии могут быть и не синфазные помехи, которые исказят столь слабый сигнал.

Semua perangkat dihubungkan ke satu kabel twisted pair dengan cara yang sama: output langsung (A) ke satu kabel, output terbalik (B) ke kabel lainnya.

Impedansi masukan penerima sisi saluran (RAB) biasanya 12KΩ. Karena daya pemancar tidak terbatas, hal ini menciptakan batasan jumlah penerima yang terhubung ke saluran. Menurut spesifikasi RS-485, dengan mempertimbangkan resistor pengakhiran, pemancar dapat menggerakkan hingga 32 penerima. Namun, ada sejumlah sirkuit mikro dengan impedansi masukan yang meningkat, yang memungkinkan Anda menghubungkan lebih dari 32 perangkat ke saluran secara signifikan.

Kecepatan komunikasi maksimal sesuai spesifikasi RS-485 bisa mencapai 10 Mbaud/detik. Jarak maksimumnya adalah 1200 meter. Jika perlu untuk mengatur komunikasi pada jarak lebih dari 1200 meter atau menghubungkan lebih banyak perangkat daripada yang dimungkinkan oleh kapasitas beban pemancar, repeater khusus digunakan.

Antarmuka I2C.

Antarmuka ini diusulkan oleh Philips, yang menggunakannya untuk mengatur komunikasi antar chip di televisinya. I 2 C (singkatan dari Inter-Integrated Circuit) adalah bus serial asinkron dua arah. Secara fisik bus I 2 C terdiri dari dua jalur sinyal, salah satunya (SCL) untuk transmisi sinyal clock, dan yang kedua (SDA) untuk pertukaran data. Untuk mengontrol saluran, digunakan tahap keluaran dengan kolektor terbuka, sehingga saluran bus harus dihubungkan ke sumber daya +5 V melalui resistor dengan resistansi 1...10 kOhm, tergantung pada panjang fisik saluran dan kecepatan transfer data. Panjang jalur penghubung dalam mode standar bisa mencapai 2 meter, kecepatan transfer data 100 kbit/s.

Semua pelanggan bus dibagi menjadi dua kelas - "Pemimpin" dan "Budak". Perangkat master menghasilkan sinyal jam (SCL). Ia dapat secara mandiri mengakses bus dan mengalamatkan perangkat budak mana pun untuk tujuan mengirim atau menerima informasi. Semua perangkat budak “mendengarkan” bus untuk mendeteksi alamatnya sendiri dan, setelah mengenalinya, melakukan operasi yang ditentukan. Selain itu, apa yang disebut mode "MultiMaster" dimungkinkan, ketika beberapa perangkat master dipasang di bus, yang secara bersama-sama berbagi perangkat budak yang sama, atau secara bergantian bertindak sebagai master ketika mereka sendiri yang memulai pertukaran informasi, atau sebagai budak ketika mereka menunggu akses dari perangkat master lain. Mode "MultiMaster" memerlukan pemantauan terus-menerus dan pengenalan konflik. Dalam hal ini, mode ini lebih sulit untuk diterapkan (artinya implementasi perangkat lunak) dan, akibatnya, lebih jarang digunakan dalam produk nyata.

Pada saat awal - dalam mode siaga - kedua jalur SCL dan SDA berada dalam keadaan logis (transistor tahap keluaran kolektor terbuka ditutup). Dalam mode transmisi (Gambar 7.12), bit data SDA di-clock oleh tepi naik SCL. Informasi pada jalur SDA berubah ketika jalur SCL berada dalam keadaan nol. Perangkat budak dapat "menahan" saluran SCL dalam keadaan nol, misalnya, saat memproses byte yang diterima berikutnya, sedangkan perangkat master harus menunggu hingga saluran SCL dibebaskan sebelum melanjutkan mengirimkan informasi.

Untuk menyinkronkan paket bus I 2 C, dua kondisi dibedakan - "START" dan "STOP", yang membatasi awal dan akhir paket informasi (Gambar 7.13). Untuk mengkodekan kondisi ini, perubahan status jalur SDA dengan status jalur SCL tunggal digunakan, yang tidak dapat diterima saat mentransmisikan data. Kondisi “START” terbentuk ketika muncul descending edge pada garis SDA, saat garis SCL dalam keadaan tunggal, dan sebaliknya, kondisi “STOP” terbentuk ketika muncul descending edge pada garis SDA saat SCL garis berada dalam satu keadaan.

Transmisi data dimulai pada tepi naik pertama pada jalur SCL, yang mencatat bit paling signifikan dari byte informasi pertama. Setiap byte informasi (8 bit) berisi 9 periode jam dari garis SCL. Pada siklus kesembilan, perangkat penerima mengeluarkan pengakuan (ACK) - tepi menurun yang menunjukkan penerimaan data. Perlu dicatat bahwa setiap pelanggan bus, baik master maupun slave, pada waktu yang berbeda dapat menjadi pemancar dan penerima dan, sesuai dengan modenya, diharuskan menerima atau mengeluarkan sinyal ACK, yang ketiadaannya ditafsirkan sebagai sebuah kesalahan.

Untuk memulai operasi pertukaran data, perangkat master mengeluarkan kondisi "START" pada bus. Kondisi “START” diikuti oleh satu byte dengan alamat perangkat slave (Gambar 7.14), terdiri dari alamat perangkat tujuh-bit (bit 1...7) dan flag operasi baca-tulis satu-bit - “ R/W” (bit 0). Bit R/W menentukan arah pertukaran, dengan 0 berarti transfer data dari master ke slave (Gambar 7.14a), dan 1 berarti pembacaan dari slave (Gambar 7.14b). Semua bit pada bus I 2 C ditransmisikan secara berurutan dari tinggi ke rendah, yaitu bit ke-7 ditransmisikan terlebih dahulu, bit ke-0 terakhir. Alamat tersebut dapat diikuti oleh satu atau lebih byte informasi (dalam arah yang ditentukan oleh flag R/W), yang bit-bitnya di-clock oleh master pada bus SCL.

Saat melakukan operasi baca, host harus ACK byte yang dibaca jika ingin membaca byte berikutnya, dan tidak mengeluarkan ACK jika akan selesai membaca paket (lihat Gambar 7.14b).

Diperbolehkan untuk melanjutkan alamat perangkat budak beberapa kali dalam satu siklus transmisi, yaitu mentransmisikan kondisi “START” berulang tanpa kondisi “STOP” sebelumnya (Gambar 7.14c).

Perlu diperhatikan beberapa fitur chip memori yang beroperasi melalui antarmuka I 2 C dan prosedur pertukaran data dengannya. Pertama, memori data non-volatil dari sirkuit mikro ini dibagi menjadi beberapa halaman memori, jadi ketika satu byte ditulis, seluruh halaman pertama-tama disalin ke dalam RAM internal sirkuit mikro, di mana sel yang diinginkan diubah. Setelah itu, halaman lama dihapus dan halaman baru ditulis sebagai gantinya. Fitur lainnya adalah empat bit paling signifikan dari alamat slave harus selalu sama dengan 1010. Persyaratan ini diatur oleh Philips sendiri.

Bus 1-Wire hanya menggunakan satu konduktor untuk komunikasi dan daya. Mode komunikasinya asynchronous dan half-duplex, yang secara ketat mengikuti pola master-slave. Satu atau lebih perangkat budak dapat dihubungkan ke bus yang sama pada waktu yang sama. Hanya satu perangkat master yang dapat dihubungkan ke satu bus.

Keadaan idle bus berhubungan dengan level tinggi, yang dihasilkan oleh resistor pull-up. Nilai resistor pull-up diberikan dalam dokumentasi untuk IC budak. Semua chip yang terhubung ke bus harus mampu menghasilkan level rendah. Apabila keluaran mikrokontroler tidak mendukung tiga keadaan, maka perlu disediakan driver yang mempunyai keluaran open collector atau open drain.

Transmisi sinyal melalui bus 1-Wire dibagi menjadi slot waktu berdurasi 60 µs. Hanya satu bit data yang dikirimkan per slot waktu. Perangkat budak diperbolehkan memiliki perbedaan yang signifikan dari waktu tunda yang dinilai. Namun hal ini memerlukan pengaturan waktu yang lebih akurat oleh pemimpin untuk memastikan komunikasi yang benar dengan bawahan yang memiliki basis waktu berbeda.

Sinyal bus dasar.

Master memulai setiap komunikasi pada tingkat bit. Artinya transmisi setiap bit, apapun arahnya, harus dimulai oleh master. Hal ini dicapai dengan menyetel bus rendah, yang menyinkronkan logika semua perangkat lainnya. Ada 5 perintah utama untuk komunikasi melalui bus 1-Wire: “Tulis log. 1”, “Tulis catatan. 0”, “Baca”, “Reset” dan “Kehadiran”.

Sinyal “Tulis log. 1"

Sinyal “Tulis log. 1” ditunjukkan pada Gambar. 7.15. Master menyetel level rendah selama 1...15 µs. Kemudian melepaskan bus untuk sisa slot waktu.

Beras. 7.15 – Sinyal “Tulis log. 1"

Sinyal “Tulis log. 0"

Sinyal “Tulis log. 0” ditunjukkan pada Gambar 7.16. Master menghasilkan level rendah setidaknya selama 60 µs, tetapi tidak lebih dari 120 µs.

Gambar 7.16 – Sinyal “Tulis log. 0"

Sinyal baca

Sinyal “Baca” ditunjukkan pada Gambar. 7.17. Master menyetel level rendah selama 1...15 µs. Budak kemudian menahan bus agar tetap rendah jika ingin mengirimkan log. 0. Jika perlu untuk mentransfer log. 1, maka ia hanya melepaskan garisnya. Pemindaian bus harus dilakukan dalam waktu 15 µs setelah bus menjadi rendah. Jika dilihat dari sisi master, sinyal “Baca” pada dasarnya adalah sinyal “Tulis log”. 1". Keadaan internal sebenarnya dari budak akan ditentukan oleh sinyal “Rekam log”. 1" atau "Membaca".

Gambar 7.17 – Sinyal “Baca”.

Reset/Sinyal Kehadiran

Sinyal “Reset” dan “Presence” ditunjukkan pada Gambar 7.18. Harap dicatat bahwa interval waktu pulsa berbeda. Master menarik rendah selama 8 slot waktu (480 µs) dan kemudian melepaskan bus. Kondisi rendah dalam jangka waktu lama ini disebut sinyal "Reset".

Jika ada budak di bus, dalam waktu 60 µs setelah master melepaskan bus, ia harus menyetel level rendah setidaknya selama 60 µs. Respons ini disebut “Kehadiran”. Jika sinyal tersebut tidak terdeteksi, master harus berasumsi bahwa tidak ada perangkat yang terhubung ke bus dan tidak ada komunikasi lebih lanjut yang dapat dilakukan.

USB (Universal serial bus) dikembangkan untuk menghubungkan perangkat eksternal dengan cepat ke komputer pribadi dan kemudian mencari dan menginstal perangkat lunak yang diperlukan. Perangkat berdaya rendah diberi daya langsung melalui antarmuka.

Standar USB menyiratkan adanya hanya satu perangkat Master (Host) di jaringan. Selain itu, standar ini mendukung hingga 127 perangkat budak di jaringan. Untuk membedakan antara perangkat master dan slave, berbagai jenis konektor telah dikembangkan (Gambar 7.19): Tipe A untuk master dan Tipe B untuk slave. Dapat diterima bahwa tegangan 5V hanya ada pada konektor tipe A, yang merupakan konektor master. Perangkat lainnya diberi daya langsung darinya.

Standar USB menggunakan 4 kabel berpelindung, dua di antaranya mengirimkan daya (+5v & GND) (Gambar 7.19 dan Tabel 7.2). Dua lainnya mewakili sinyal data diferensial pasangan terpelintir. Skema pengkodean yang digunakan NRZI(Non Return to Zero Invert) untuk transmisi data dengan field sinkronisasi untuk menyinkronkan jam master dan slave.

Standar USB 2.0 memperkenalkan standar On-The-Go (OTG), yang memperkenalkan Host Negotiation Protocol, yang memungkinkan dua perangkat USB menyepakati siapa yang akan bertindak sebagai master. Hal ini dimaksudkan dan terbatas pada koneksi point-to-point tunggal, seperti telepon seluler ke komputer pribadi.

USB mendukung koneksi “hot” (plug’n’play) dengan driver yang dimuat dan dibongkar secara dinamis. Pengguna cukup menyambungkan perangkat, kemudian menghubungkannya ke bus. Tuan rumah mendeteksi koneksi, melakukan polling pada perangkat yang baru dimasukkan dan memuat driver yang sesuai, menunjukkan momen pemuatan dengan jam pasir di layar (jika driver untuk perangkat USB sudah diinstal pada sistem). Pengguna akhir tidak peduli dengan penghentian atau IRQ(interupsi) dan alamat port, atau tentang me-reboot komputer (tidak perlu reboot). Ketika pengguna selesai dengan perangkat USB, mereka cukup melepasnya (atau mencabut kabelnya), host akan mendeteksi ketidakhadiran perangkat tersebut dan secara otomatis membongkar driver.

SB versi 1.1 mendukung dua kecepatan - mode kecepatan penuh dengan kecepatan 12 Mbits/s dan mode kecepatan rendah dengan kecepatan 1,5 Mbits/s. Mode 1,5 Mbits/s lebih lambat dan kurang sensitif terhadap EMI (interferensi), sehingga mengurangi biaya manik ferit dan mengurangi persyaratan kualitas komponen.

Kabel bus kecepatan penuh merupakan kabel twisted-pair, dilindungi oleh pelindung, dan juga dapat digunakan untuk pengoperasian kecepatan rendah. Kabel untuk pengoperasian hanya pada kecepatan minimum (misalnya, untuk menghubungkan mouse) dapat berupa apa saja dan tanpa pelindung.

Standar USB 2.0 memperkenalkan mode Kecepatan Tinggi dengan kecepatan transfer data 480Mbits/s.

Transfer data.

Semua transfer data melalui antarmuka diprakarsai oleh host. Data ditransmisikan dalam bentuk paket. Antarmuka USB menggunakan beberapa jenis paket:

A) menandatangani paket (paket token) menjelaskan jenis dan arah transfer data, alamat perangkat dan nomor seri titik akhir (CT adalah bagian perangkat USB yang dapat dialamatkan); Ada beberapa jenis paket fitur: DI DALAM, KELUAR, LEMBUT, MEMPERSIAPKAN;

B) paket data (paket data) berisi data yang dikirimkan;

B) paket persetujuan (paket jabat tangan) dimaksudkan untuk melaporkan hasil transfer data; Ada beberapa jenis paket koordinasi: ACK, N.A.K., MACET.

Transfer data melalui USB dilakukan sebagai berikut:

Paket pertama, yang disebut token, dihasilkan oleh perangkat master untuk menjelaskan jenis data yang ditransfer, operasi transfer (baca atau tulis), alamat perangkat, dan titik akhir. Yang berikutnya biasanya dikirimkan adalah paket data yang membawa informasi berguna, diikuti dengan paket jabat tangan yang menunjukkan bahwa data atau token berhasil diterima, atau titik akhir terhenti atau tidak tersedia untuk menerima data.

Titik akhir dalam standar USB adalah sumber dan penyerap data. Semua perangkat harus mendukung titik akhir 0. Ini adalah titik akhir yang menerima semua permintaan kontrol dan status selama enumerasi (permintaan pegangan untuk menentukan jenis perangkat yang terpasang) dan selama perangkat tetap beroperasi di bus.

Titik akhir bernomor 1 digunakan untuk mengirimkan informasi pengguna. Mari kita lihat beberapa contoh.

Driver perangkat mengirimkan ke titik akhir perangkat master EP1. Karena Perangkat ini adalah masternya, kemudian datanya masuk ke OUT buffer EP1. Dalam hal ini, token OUT dikirim, menunjukkan bahwa data siap dikirim. Setelah menerima token ini, perangkat budak dapat membaca data dari buffer OUT.

Jika perangkat slave perlu mentransfer data ke master, perangkat tersebut akan menempatkannya di buffer IN. Buffer ini akan menyimpan data hingga master mengirimkan token IN yang meminta data dari titik akhir. Semua buffer titik akhir diberi nama relatif terhadap master, mis. Buffer keluaran perangkat budak disebut IN karena itu adalah buffer input untuk perangkat master.

Transfer data dari satu titik akhir ke titik akhir lainnya dilakukan melalui aliran. Aliran – Koneksi logis antara host dan titik akhir.

Streaming juga memiliki serangkaian parameter seperti tipe transmisi (Kontrol, Massal, Iso atau Interupsi), arah aliran data dan ukuran paket/buffer maksimum.

Misalnya, aliran default adalah aliran dua arah yang terdiri dari titik akhir IN 0 dan titik akhir OUT 0 dengan kontrol tipe transfer.

USB mendefinisikan dua jenis pipa

A) Pipa Aliran tidak memiliki format USB yang telah ditentukan sebelumnya, sehingga Anda dapat mengirim semua jenis data melalui pipa aliran dan memulihkan data di ujung lainnya. Aliran data bersifat berurutan dan memiliki arah yang telah ditentukan - IN atau OUT. Pipa aliran mendukung jenis transfer massal, isokron, dan interupsi. Pipa aliran dapat dikontrol baik dari host atau perangkat.

B) Pipa Pesan memiliki format USB yang telah ditentukan sebelumnya. Mereka dikendalikan oleh host, diprakarsai oleh permintaan yang dikirim dari host. Data dikirim ke arah yang diinginkan yang ditentukan dalam permintaan. Dengan demikian, pipa pesan memungkinkan data ditransfer dua arah, namun hanya mendukung transfer kontrol.

Standar USB menjelaskan empat jenis transfer data:

A) Kontrol penerusan (peralihan kendali) digunakan untuk konfigurasi perangkat serta tujuan khusus perangkat lainnya.

B) Streaming (transfer massal) digunakan untuk mengirimkan informasi dalam jumlah yang relatif besar.

B) Penerusan interupsi (transfer terputus) digunakan untuk mengirimkan informasi dalam jumlah yang relatif kecil, sehingga transmisi tepat waktu sangatlah penting. Ini memiliki durasi terbatas dan prioritas lebih tinggi dibandingkan jenis transfer lainnya.

D) Penerusan isokron (perpindahan isokron) juga disebut streaming waktu nyata. Informasi yang dikirimkan dalam transfer semacam itu memerlukan skala waktu nyata selama pembuatan, transmisi, dan penerimaannya.

Transfer streaming ditandai dengan jaminan transfer data bebas kesalahan antara host dan fungsi dengan mendeteksi kesalahan selama transmisi dan meminta ulang informasi. Ketika host siap menerima data dari suatu fungsi, ia mengirimkan paket flag ke fungsi tersebut DI DALAM-kantong plastik. Menanggapi hal ini, fungsi dalam fase transfer data mengirimkan paket data ke host atau, jika itu

Dengan peringkat dari 10 Ohm hingga 1 MOhm);

  • menghubungkan kabel (misalnya, ini adalah set yang bagus);
  • komputer pribadi dengan lingkungan pengembangan Arduino IDE.
  • 1 Deskripsi serial antarmuka SPI

    SPI - Antarmuka Periferal Serial atau "Antarmuka Periferal Serial" adalah protokol transfer data sinkron untuk berpasangan perangkat utama Dengan perangkat periferal (Budak). Perangkat master seringkali berupa mikrokontroler. Komunikasi antar perangkat terjadi melalui empat kabel, itulah sebabnya SPI terkadang disebut “antarmuka empat kabel”. Ini bannya:

    Ada empat mode transfer data ( SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3), disebabkan oleh kombinasi polaritas pulsa clock (kita bekerja pada level HIGH atau LOW), Polaritas Jam, CPOL, dan fase pulsa jam (sinkronisasi pada naik atau turunnya pulsa jam), Fase Jam, CPHA.

    Gambar tersebut menjelaskan tabel ini.

    Antarmuka SPI menyediakan beberapa opsi untuk menghubungkan perangkat budak: mandiri Dan riam. Ketika terhubung secara independen ke bus SPI, perangkat master mengakses setiap perangkat budak satu per satu. Dengan koneksi kaskade, perangkat budak beroperasi satu per satu, seolah-olah dalam kaskade.


    Jenis koneksi perangkat untuk operasi melalui antarmuka SPI: independen dan kaskade

    2 Implementasi antarmuka SPI di papan keluarga Arduino

    Di Arduino, bus antarmuka SPI terletak di port tertentu. Setiap papan memiliki penetapan pinnya sendiri. Untuk kenyamanan, kesimpulan diduplikasi dan juga ditempatkan secara terpisah konektor ICSP(Dalam Circuit Serial Programming, memprogram perangkat yang termasuk dalam suatu rangkaian menggunakan protokol serial). Harap dicatat bahwa konektor ICSP tidak memiliki pin pilihan budak - SS, karena diasumsikan Arduino akan digunakan sebagai perangkat master dalam jaringan. Tetapi jika perlu, Anda dapat menetapkan pin digital Arduino apa pun sebagai SS.

    Gambar tersebut menunjukkan korespondensi standar pin ke bus SPI untuk Arduino UNO dan Nano.


    3 Perpustakaan untuk bekerja dengan antarmuka SPI

    Perpustakaan khusus telah ditulis untuk Arduino yang mengimplementasikan protokol SPI. Ini terhubung seperti ini: di awal program kami menambahkan #sertakan SPI.h.

    Untuk mulai menggunakan protokol SPI, Anda perlu mengatur pengaturan dan kemudian menginisialisasi protokol menggunakan prosedur SPI.mulaiTransaksi(). Anda dapat melakukan ini dengan satu instruksi: SPI.mulaiTransaksi(Pengaturan SPIS(14000000, MSBFIRST, SPI_MODE0))

    Artinya kita menginisialisasi protokol SPI pada frekuensi 14 MHz, transmisi data terjadi mulai dari MSB (most signifikan bit), dalam mode SPI_MODE0.

    Setelah inisialisasi, pilih perangkat budak dengan memindahkan pin SS yang sesuai ke status RENDAH.

    Kemudian kami mentransfer data ke perangkat budak dengan perintah SPI.transfer().

    Setelah transfer kami mengembalikan SS ke negara TINGGI.


    Bekerja dengan protokol diselesaikan dengan perintah SPI.akhirTransaksi().

    Disarankan untuk meminimalkan waktu transfer antara instruksi SPI.beginTransaction() dan SPI.endTransaction() untuk menghindari masalah jika perangkat lain mencoba memulai transfer data menggunakan pengaturan yang berbeda.

    4 Menghubungkan register geser ke Arduino

    Mari kita pertimbangkan penerapan praktis antarmuka SPI. Kami akan menyalakan LED dengan mengendalikan register geser 8-bit melalui bus SPI. Mari terhubung ke Arduino register geser 74HC595. Kami akan menghubungkan LED dengan nilai nominal 220 Ohm ke masing-masing dari 8 output register melalui resistor pembatas. Diagramnya ditunjukkan pada gambar.


    5 Sketsa untuk mengendalikan register geser melalui antarmuka SPI

    Mari kita menulis sketsa seperti ini.

    #termasuk const int pinPilih = 8; // daftar pilih pin batalkan pengaturan() ( SPI.mulai(); // menginisialisasi antarmuka SPI pinMode(pinSelect, OUTPUT); // digitalWrite(pinSelect, RENDAH); // pilih perangkat budak (daftar) SPI.transfer(0); // menghapus isi register digitalWrite(pinSelect, HIGH); // akhir transmisi Serial.begin(9600); } lingkaran kosong() ( untuk (int saya=0; saya )

    Pertama, mari sambungkan perpustakaan SPI dan inisialisasi antarmuka SPI. Mari kita definisikan pin 8 sebagai pin pemilihan budak SS. Mari kita hapus register geser dengan mengirimkan nilai "0" ke dalamnya. Inisialisasi port serial.

    Untuk menyalakan LED tertentu menggunakan register geser, Anda perlu menerapkan angka 8-bit ke inputnya. Misalnya, agar LED pertama menyala, kami menyediakan angka biner 00000001, untuk yang kedua - 00000010, untuk yang ketiga - 00000100, dll. Bilangan biner ini, jika diubah ke sistem bilangan desimal, membentuk barisan berikut: 1, 2, 4, 8, 16, 32, 64, 128 dan merupakan pangkat dua dari 0 hingga 7.

    Oleh karena itu, dalam siklus lingkaran() Berdasarkan jumlah LED, kami menghitung ulang dari 0 hingga 7. Fungsi kekuatan(dasar, derajat) Menaikkan 2 pangkat penghitung loop. Mikrokontroler tidak bekerja secara akurat dengan angka bertipe "ganda", jadi kami menggunakan fungsi pembulatan untuk mengonversi hasilnya menjadi bilangan bulat bulat(). Dan kami mentransfer nomor yang dihasilkan ke register geser. Untuk kejelasan, monitor port serial menampilkan nilai yang diperoleh selama operasi ini: Unit "berjalan" melalui pelepasan - LED menyala dalam gelombang.

    6 "Gelombang Berlari" dari LED

    LED menyala satu per satu, dan kami mengamati “gelombang” lampu yang berjalan. LED dikontrol menggunakan register geser, yang kami sambungkan melalui antarmuka SPI. Alhasil, hanya 3 pin Arduino yang digunakan untuk mengontrol 8 LED. Jika kita menghubungkan LED langsung ke port digital Arduino, kita perlu menggunakan port terpisah untuk setiap LED.

    Kami mempelajari contoh paling sederhana Arduino yang bekerja dengan bus SPI. Kami akan mempertimbangkan secara lebih rinci pengoperasian beberapa register geser dengan koneksi independen dan bertingkat dalam artikel terpisah.