Apakah SPI aman untuk diganggu?

17

Saya menulis ke kartu microSD dari dalam firmware saya, tetapi ini adalah tugas dengan prioritas terendah, sehingga dapat terganggu oleh tugas-tugas lain saat sedang membaca / menulis.

Sekarang anggaplah saya berkomunikasi dengan kartu microSD ini menggunakan UART. Masalahnya saat membaca adalah hardware RX FIFO akan meluap, sehingga keterlambatan maksimum yang saya bisa upayakan adalah (ukuran FIFO × byte / detik), dan selama menulis tidak akan ada masalah, karena ujung yang lain hanya akan menunggu sampai saya kirim karakter berikutnya.

Bagaimana cara kerjanya sekarang saya menggunakan SPI? Apakah situasinya sama dengan untuk menulis itu tidak masalah, dan untuk membaca itu tergantung pada ukuran SPI FIFO?

Muis
sumber

Jawaban:

22

Sebagian besar perangkat SPI akan sangat bahagia dengan kecepatan data apa pun di bawah maksimum yang ditentukan. Seseorang dapat melakukan bagian dari suatu transaksi, istirahat kapan saja, kembali beberapa tahun kemudian, dan menyelesaikannya. Asalkan tidak ada gangguan pada jam, pilih, atau saluran listrik, transaksi akan diselesaikan secara normal.

Ada tiga peringatan utama yang harus diperhatikan:

  1. Secara umum, sekali transaksi telah dimulai pada bus SPI, tidak ada kabel di bus yang dapat digunakan untuk tujuan lain sampai transaksi selesai. Secara umum, ini berarti bahwa interupsi mungkin tidak menggunakan bus SPI kecuali ketika itu adalah satu-satunya hal yang akan menggunakan bus (mungkin saja interupsi memiliki penggunaan eksklusif bus pada beberapa waktu, dan untuk utama program untuk penggunaan eksklusif di lain waktu). Beberapa perangkat menyertakan pin khusus untuk membiarkan mereka "mengabaikan" bus di tengah transaksi, tetapi bahkan dengan fitur seperti itu saya tidak akan merekomendasikan mencoba untuk memiliki interupsi menangguhkan transaksi SPI dengan satu perangkat, melakukan transaksi dengan perangkat lain, dan kemudian biarkan kode yang mendasarinya melanjutkan transaksinya dengan yang pertama. Lebih baik interupsi menggunakan bus SPI terpisah.
  2. Beberapa perangkat mungkin berperilaku aneh jika transaksi berlangsung terlalu lama. Beberapa chip jam waktu-nyata, misalnya, tidak menggandakan buffer waktu / tanggal tetapi malah mengaitkan semua peristiwa "waktu-maju" yang akan terjadi selama transaksi dan menerapkannya setelah transaksi selesai. Jika suatu transaksi membutuhkan waktu yang sangat lama sehingga peristiwa pemunculan-waktu kedua tiba, peristiwa yang terakhir akan diabaikan, menyebabkan jam berlalu dengan jumlah waktu tersebut. Saya benar-benar tidak melihat alasan untuk merancang chip dengan cara seperti itu (bahkan jika seseorang tidak ingin biaya buffering ganda data, menetapkan bahwa perangkat lunak bertanggung jawab untuk memastikan koherensinya akan lebih murah daripada menambahkan logika "pembaruan penangguhan", dan akan meminimalkan kemungkinan gangguan clock), tetapi chip tersebut ada.
  3. Ada beberapa perangkat yang menggunakan jam dan sinyal data, tetapi yang menggunakan "jeda" untuk menandakan framing. Contoh terbaru dari ini saya temui adalah string lampu LED controller-per-bulb. Saya tidak terlalu suka desain seperti itu (orang bisa saja menunjukkan framing menggunakan tiga tepi naik berturut-turut pada kabel data tanpa ada jam intervening) tetapi sekali lagi, perangkat seperti itu memang ada.

Sementara jenis komunikasi tertentu membutuhkan penggunaan waktu tertentu, jarang ada alasan bagi perangkat SPI untuk meminta mereka. Meskipun demikian, seseorang harus memperhatikan keberadaan perangkat tersebut.

supercat
sumber
3
+1 Bagus! Sepenuhnya setuju dengan semua pendapat / frustrasi Anda. Terlihat juga berkali-kali.
DrFriedParts
11

Memeriksa salinan spesifikasi (yang saya tidak bisa kutip untuk alasan hak cipta / NDA) tingkat SPI ditentukan mulai dari 0Hz yang menyiratkan operasi statis baik-baik saja. Di bawah SPI Anda hanya mendapatkan data kembali saat perangkat sedang clock, jadi jika menggunakan perangkat keras SPI Anda hanya akan menerima sesuatu setelah data (bahkan jika 0 / tidak peduli) telah dikirim. Jadi dalam hal itu berbeda dengan UART di mana Anda dapat menerima kembali data yang tidak diminta kapan saja.

PeterJ
sumber
Jadi satu-satunya kekhawatiran saya adalah bahwa kartu MicroSD memiliki semacam time-out built-in, tetapi tidak SPI itu sendiri?
Muis
5
Menurut spesifikasi dari semua yang saya bisa lihat seharusnya tidak ada bentuk timeout pada kartu SD baik, jadi jangan benar-benar melihat Anda harus memiliki masalah. Bertahun-tahun yang lalu saya menulis beberapa kode khusus dan sementara debugging adalah satu langkah melalui kode meninggalkan mengatakan 10 detik atau lebih antara operasi SPI dan semuanya baik-baik saja.
PeterJ
1
+1, Mampu menjalankan SPI hingga 0 Hz berguna untuk diketahui untuk debugging. Terima kasih.
Anindo Ghosh
1
Penting untuk dicatat bahwa pada beberapa perangkat SPI, output data hanya dapat berubah pada clock edge tertentu, tetapi pada beberapa yang lain output data kadang-kadang dapat berubah secara tidak sinkron; ini sangat umum dengan bit "sibuk". Pada beberapa chip, jika seseorang telah membatalkan status bit "busy" dan itu masih pada output ketika bagian tersebut menjadi tidak sibuk, output akan berubah secara sinkron. Pada beberapa chip lain, status "sibuk" yang dilaporkan tidak akan berubah sampai waktu kembali. Kedua desain memiliki kelebihan dan kekurangan, jadi perlu diketahui bahwa kedua jenis desain itu ada.
supercat