Bisakah budak SPI memulai transmisi dalam mode dupleks penuh?

8

Sejauh yang saya tahu, transmisi SPI untuk budak SPI bekerja seperti di bawah ini:

  1. Master memilih seorang budak menggunakan pin SS
  2. Master dan slave saling mengirim data secara bersamaan
  3. Master memulai transmisi jam dan data pada saat yang sama (tidak ada jam sebelum operasi penulisan)
  4. Master menghentikan transmisi kapan saja diinginkan (dengan menghentikan operasi penulisan dan pembuatan jam), bahkan jika budak memiliki lebih banyak data untuk dikirim.

Apakah ada konfigurasi budak SPI yang memungkinkan budak mengirim data tanpa izin master?

Saya hanya berpikir keras. Asumsikan bahwa hanya ada satu budak dan jam terus menerus disediakan oleh master dll.

Bahkan jika pernyataan yang diasumsikan benar, jangan master dan budak kehilangan sinkronisasi byte (yaitu menerima bit stream) karena tidak ada bit start-stop untuk SPI?

Saya mengajukan pertanyaan seperti itu karena saya telah membaca bagian berikut dari dokumen ini .

2.2 Contoh SPI

Contoh SPI terlampir menggambarkan penggunaan USART dalam mode sinkron. USART1 dikonfigurasi sebagai slave, sedangkan USART2 adalah master. Transaksi berikut terjadi:

  • Transmisi data dari master ke slave.
  • Transmisi data dari slave ke master.
  • Transmisi data dari master ke slave dan dari slave ke master secara bersamaan.

Dokumen memberikan contoh SPI tetapi menyadari contoh menggunakan perangkat USART. Dan saya mendapatkan bahwa budak USART dapat memulai transmisi tanpa izin dari master.

Saya tidak dapat menemukan kode sumber yang dirujuk oleh dokumen.

JeJoRic
sumber
4
Budak, menurut definisi, tidak dapat melakukan transaksi (mungkin dapat mengganggu master untuk memulai transaksi).
Peter Smith
5
Transfer data searah dalam SPI tradisional hanyalah seseorang yang mengabaikan keadaan jalur yang mengarah ke arah lain. Menulis, membaca, dan transfer dua arah tidak terlalu berbeda. Bahkan misalnya banyak periferal SPI akan mengeluarkan kata status selama kata pertama, bahkan sebelum mereka tahu apa yang diminta, karena hampir tidak ada biaya untuk melakukannya dan memungkinkan jajak pendapat status cepat.
Chris Stratton

Jawaban:

17

Tidak, dengan SPI, semua komunikasi dikendalikan oleh perangkat master. Anda benar bahwa master tidak bisa hanya menyediakan jam terus menerus; tidak akan ada cara untuk mendeteksi batas byte.

Perangkat slave akan sering memiliki pin output terpisah untuk memberi sinyal kepada master bahwa ia memiliki data yang tersedia. Pin ini terhubung ke input pada mikrokontroler dan sering digunakan sebagai interupsi.

Kemudian, perangkat dapat menegaskan pin, menyebabkan mikrokontroler untuk memutar bus SPI.


Untuk informasi lebih rinci, silakan baca :) Ini adalah versi penjelasan yang sedikit dimodifikasi yang ditemukan di sini :

Perangkat budak hanya dapat berkomunikasi ketika disediakan jam dari master. Ini menyulitkan membaca dari budak, karena Anda harus membuat master untuk menyediakan siklus jam yang cukup bagi budak untuk merespons.

Ketika Anda mengirim perintah SPI dari master, dua transmisi sebenarnya terjadi selama pulsa delapan clock yang sama. Yang pertama adalah byte Anda sudah keluar dari baris MOSI. Tetapi, pada saat yang sama, data dimasukkan ke mikrokontroler melalui jalur MISO.

Tetapi karena budak tidak mendapatkan perintah penuh sampai akhir transaksi ini, ia tidak menyajikan data apa pun ke bus. Ini menghasilkan nilai yang diterima 0x00 atau 0xFF.

Maka Anda perlu memberikan delapan jam tambahan untuk memungkinkan budak mengembalikan nilai aktual. Dalam banyak implementasi kode, ini dilakukan dengan mengirimkan "byte dummy" ke slave.

Perhatikan bahwa, pada transmisi pertama, master mengabaikan apa pun yang datang dari budak. Dalam transmisi kedua, budak mengabaikan apa pun yang dikirim oleh master.

Itu menggambarkan kasus umum. Mungkin ada kompleksitas tambahan. Sebagai contoh, beberapa IC slave sebenarnya akan mengeluarkan semacam byte status pada saat yang sama mereka menerima perintah dari master. Jadi, dalam hal ini, master tidak boleh membuang byte yang diterima pertama.

bitmack
sumber
2
"master tidak bisa hanya menyediakan jam terus menerus" Sebenarnya saya telah melihat sebuah perangkat belum lama ini yang melakukan hal itu. Itu adalah binatang kecil yang aneh. Sayangnya saya tidak ingat P / N.
Aaron
@ Harun Senang tahu! Orang-orang terus menjadi semakin pintar :-)
bitsmack
7

Tidak, master adalah orang yang melakukan arbitrase pada chipselects dan menggerakkan jam. Seorang budak akan selalu hanya mendengarkan jam dan memilih chip. Transfer data masih bisa menjadi dupleks penuh. Ada beberapa implementasi di mana jam bisa kontinu, tetapi tidak masalah karena chipselect digunakan untuk menyinkronkan batas byte. Tetapi kemudian ada sistem multimaster, jadi pada dasarnya Anda dapat memiliki beberapa mekanisme bagi perangkat untuk memutuskan siapa yang menjadi budak dan master. Atau cukup sertakan kabel "interupsi" yang terpisah untuk slave untuk memberi tahu master bahwa ia memiliki paket data untuk master.

Hanya aku
sumber
Bisakah Anda menambahkan contoh sistem multimaster?
davidcary