Masalah komunikasi flash serial Microchip SST26VF064B - JEDEC ID salah
Saya mencoba untuk menguji komunikasi SPI dengan flash serial Microchip SST26VF064B, dan saya mengalami masalah saat membaca ID JEDEC dari chip. Menurut lembar data, tiga byte pertama harus 0xBF, 0x26, 0x41 / 0x42. Saya mendapatkan data yang sama sekali berbeda: 0x7C, 0x20, 0x7F. Chip tampaknya merespons untuk membaca perintah JEDEC ID 0x9F, tetapi selalu mengirimkan data tidak terduga yang sama.

Saya sudah mencoba driver SPI yang dilengkapi dengan SDK untuk SOC yang saya gunakan, dan juga SPI yang sedikit membenturkan - hasilnya sama, jadi saya pikir komunikasi SPI berfungsi dengan baik. Saya kehabisan ide apa yang harus dicoba selanjutnya ... Apakah ada alasan saya bisa mendapatkan data ini alih-alih ID yang diharapkan?

Jawaban
Tampaknya ini adalah masalah kompleks yang sebagian terkait dengan clocking dan juga kurangnya resistor seri pada jalur MISO. Masalah akhirnya hilang setelah menambahkan resistor 100ohm pada MISO dan mengatur baris SCLK SOC nRF52840 ke "drive tinggi", untuk membuat tepi jam jatuh / naik lebih cepat.
Saya menduga bahwa masalah saya terkait dengan fakta bahwa saya saat ini mengerjakan papan tempat memotong roti dengan kabel jumper yang cukup panjang (10-15cm). Seperti setiap proyek, saya mencoba untuk menguji semua komponen yang tidak diketahui sebelum saya akan mengintegrasikannya ke dalam sirkuit / PCB. Tentu saja, papan tempat memotong roti dapat dan akan memperkenalkan masalahnya sendiri, dan ini mungkin terjadi di sini, tetapi tetap saja, saya telah bekerja dengan beberapa chip SPI yang berbeda, dan saya belum pernah mengalami perilaku sinyal yang tidak menentu di bus sebelumnya.
- Masalah pertama: slave mengeluarkan sesuatu di MISO, tetapi data keluaran tidak terduga / salah. Saya telah menyertakan layar osiloskop dalam pertanyaan awal, dan pada pertanyaan kedua, setelah diperluas, orang dapat melihat lonjakan kecil yang terjadi di MISO. Saya telah memeriksa paku-paku ini, dan tampaknya itu selalu terjadi di tepi jam jatuh, ketika budak harus bergeser sedikit berikutnya:
Kuning - CS, Biru - Jam, Ungu - MISO (MOSI ditinggalkan di layar ini)

Di atas layar atas, seseorang dapat melihat bahwa slave mendeteksi clock edge fall dan MISO mulai naik (tampaknya beberapa bit dalam byte terbaca sama dengan 1), tetapi kemudian ketika clock edge turun lebih lambat, budak entah bagaimana menjadi bingung dan menutup MISO bahkan turun sebelum mencapai level logika H yang tepat (setidaknya itulah pemahaman saya tentang apa yang terjadi di sini). Kedua, layar yang lebih rendah adalah untuk perbandingan, ketika fitur "high drive" dari nRF52840 SOC diaktifkan pada SCLK pin - clock edge jatuh lebih cepat, dan MISO bekerja dengan baik dengan pengaturan ini - chip mengeluarkan data yang diharapkan.
- Masalah kedua: Sinyal MISO baik-baik saja saat diperiksa tanpa sambungan. Setelah tersambung ke master, sinyal MISO terdistorsi hingga tidak dapat dibaca oleh master, atau tidak ada sinyal MISO sama sekali.
Di bawah ini adalah perilaku yang tepat (dengan resistor 100ohm pada MISO, drive tinggi diaktifkan pada SCLK) - ini adalah chip flash yang berbeda dari pada pertanyaan awal - saya telah mengubahnya menjadi Micron MT25QL128ABA, tetapi berperilaku persis sama. Diperiksa dengan master yang terhubung ke MISO. Kuning - CS, Biru - Jam, Ungu - MISO. MOSI ditinggalkan di layar ini.

Di bawah ini adalah perilaku tanpa resistor - tidak ada sinyal MISO sama sekali. Diperiksa dengan master yang terhubung ke MISO. Kuning - CS, Biru - Jam, Ungu - MISO. MOSI ditinggalkan di layar ini.

Saya telah menemukan banyak utas di forum Nordik, yang menjelaskan masalah MISO serupa: https://devzone.nordicsemi.com/f/nordic-q-a/47335/problem-using-digital-io-as-miso https://devzone.nordicsemi.com/f/nordic-q-a/47968/spi-doesn-t-work-in-nrf52810-while-emulating-nrf52810-in-nrf52832dk-was-successful/190230#190230
Saya tidak yakin apakah ini beberapa bug atau kesalahan konfigurasi pin SOC yang digunakan untuk MISO, atau apakah itu terkait dengan kabel bus SPI yang panjang di sirkuit pengujian saya. Dari apa yang telah saya baca - resistor dapat digunakan pada bus SPI untuk mencocokkan impedansi penerima dan trasmitter ketika kabel / jejak panjang (tetapi cukup panjang 10cm untuk menyebabkan masalah seperti itu?). Faktanya, resistor nilai yang relatif kecil pada MISO membantu di sini. Saya ingin tahu mengapa hal itu terjadi, tetapi saya kurang memiliki pengetahuan tingkat rendah yang solid untuk memastikannya. Saya akan memasukkan resistor pada MISO pada PCB, tetapi saya akan mengujinya dengan nilai 0R terlebih dahulu, untuk melihat apakah kondisi yang lebih baik pada PCB (jejak yang lebih pendek) akan membuat ini berfungsi tanpa hambatan tambahan.