Agak terlambat untuk diskusi, tetapi bagi siapa saja yang membacanya setelah pencarian ....
Satu hal yang saya tidak lihat disebutkan, yang benar-benar penting ketika memprogram chip Flash SPI adalah kontrol pin Pilih Chip (CS_). Pin Select Chip digunakan untuk memberi tanda baca perintah ke SPI Flash. Secara khusus, transisi dari CS_ tinggi ke CS_ rendah harus segera mendahului penerbitan kode operasi op Write (WREN, BE, SE, PP). Jika ada aktivitas antara transisi CS_ (yaitu setelah CS_ sudah rendah) dan sebelum kode tulis ditransmisikan, kode tulis itu biasanya akan diabaikan.
Juga, apa yang tidak umum dijelaskan dalam lembar data Flash SPI, karena ini merupakan bagian yang tidak terpisahkan dari protokol SPI, yang juga penting, adalah bahwa untuk setiap byte satu mentransmisikan pada bus SPI, ia menerima byte sebagai balasannya. Juga, seseorang tidak dapat menerima byte, kecuali satu mentransmisikan byte.
Biasanya, Master SPI yang dikomandoi pengguna, memiliki Buffer Pengiriman, yang mengirim byte keluar pada baris MOSI bus SPI dan Buffer Terima, yang menerima byte dari jalur MISO bus SPI.
Agar data apa pun muncul di buffer Terima, beberapa data pasti telah dikirim Buffer Pengiriman. Demikian pula, setiap kali seseorang mengirim data dari buffer Transmit, data akan muncul di Buffer Terima.
Jika seseorang tidak berhati-hati menyeimbangkan penulisan Transmit dan Receive reads, orang tidak akan tahu apa yang diharapkan dalam buffer Terima. Jika Menerima buffer overflow, data biasanya tumpah dan hilang.
Jadi, ketika seseorang mengirim perintah baca, yang merupakan kode op satu byte dan tiga byte alamat, pertama akan menerima empat byte "sampah" di buffer Terima Master SPI. Empat byte sampah ini sesuai dengan kode op dan tiga byte alamat. Ketika sedang dikirim, Flash belum tahu apa yang harus dibaca, jadi itu hanya mengembalikan empat kata sampah.
Setelah empat kata sampah dikembalikan, untuk mendapatkan hal lain dalam Buffer Terima, Anda harus Mengirimkan sejumlah data sama dengan jumlah yang ingin Anda Baca. Setelah kode op dan alamat, tidak masalah apa yang Anda kirim, hanya mengisi untuk mendorong Baca DAta dari SPI Flash ke Buffer Terima.
Jika Anda tidak melacak dengan hati-hati empat kata sampah pertama yang dikembalikan, Anda mungkin berpikir bahwa satu atau lebih kata-kata tersebut adalah bagian dari Data Baca Anda yang dikembalikan.
Jadi, untuk mengetahui apa yang sebenarnya Anda dapatkan dari buffer yang diterima, penting untuk mengetahui ukuran buffer Anda, tahu bagaimana cara mengetahui apakah buffer itu kosong atau penuh (biasanya ada yang mendaftar bit status untuk melaporkan hal ini) dan melacak bagaimana banyak hal yang telah Anda kirim dan berapa banyak yang Anda terima.
Sebelum memulai operasi SPI Flash apa pun, sebaiknya "tiriskan" Receive FIFO. Ini berarti memeriksa status buffer menerima dan mengosongkannya (biasanya dilakukan dengan melakukan 'baca' dari Buffer Terima) jika belum kosong. Biasanya, mengosongkan (membaca) Buffer Terima yang sudah kosong tidak ada salahnya.
Informasi berikut ini tersedia dari diagram waktu di lembar data SPI Flash, tetapi kadang-kadang orang mengabaikan bit. Semua perintah dan data dikeluarkan ke flash SPI menggunakan bus SPI. Urutan untuk membaca SPI Flash adalah:
1) Start with CS_ high.
2) Bring CS_ low.
3) Issue "Read" op code to SPI Flash.
4) Issue three address bytes to SPI Flash.
5) "Receive" four garbage words in Receive Buffer.
6) Transmit as many arbitrary bytes (don't cares) as you wish to receive.
Number of transmitted bytes after address equals size of desired read.
7) Receive read data in the Receive Buffer.
8) When you've read the desired amount of data, set CS_ high to end the Read command.
If you skip this step, any additional transmissions will be interpreted as
request for more data from (a continuation of) this Read.
Perhatikan bahwa langkah 6 dan 7 harus disisipkan dan diulangi tergantung pada ukuran bacaan dan ukuran Bufer Menerima dan Mengirimkan Anda. Jika Anda mengirim sejumlah besar kata sekaligus, daripada yang diterima oleh Buffer Anda, Anda akan menumpahkan beberapa data.
Untuk membentuk Program Halaman atau perintah Tulis lakukan langkah-langkah ini. Ukuran Halaman (biasanya 256 byte) dan Ukuran Sektor (biasanya 64K) dan batas terkait adalah properti dari SPI Flash yang Anda gunakan. Informasi ini harus ada dalam lembar data untuk Flash. Saya akan menghilangkan rincian menyeimbangkan Bufer Kirim dan Terima.
1) Start with CS_ high.
2) Change CS_ to low.
3) Transmit the Write Enable (WREN) op code.
4) Switch CS_ to high for at least one SPI Bus clock cycle. This may be tens or
hundreds of host clock cycles. All write operations do not start until CS_ goes high.
The preceding two notes apply to all the following 'CS_ to high' steps.
5) Switch CS_ to low.
6) Gadfly loop: Transmit the 'Read from Status Register' (RDSR) op code and
one more byte. Receive two bytes. First byte is garbage. Second byte is status.
Check status byte. If 'Write in Progress' (WIP) bit is set, repeat loop.
(NOTE: May also check 'Write Enable Latch' bit is set (WEL) after WIP is clear.)
7) Switch CS_ to high.
8) Switch CS_ to low.
9) Transmit Sector Erase (SE) or Bulk Erase (BE) op code. If sending SE, then follow
it with three byte address.
10) Switch CS_ to high.
11) Switch CS_ to low.
12) Gadfly loop: Spin on WIP in Status Register as above in step 6. WEL will
be unset at end.
13) Switch CS_ to high.
14) Switch CS_ to low.
15) Transmit Write Enable op code (again).
16) Switch CS_ to high.
17) Switch CS_ to low.
18) Gadfly loop: Wait on WIP bit in Status Register to clear. (WEL will be set.)
19) Transmit Page Program (PP = Write) op code followed by three address bytes.
20) Transmit up to Page Size (typically 256 bytes) of data to write. (You may allow
Receive data to simply spill over during this operation, unless your host hardware
has a problem with that.)
21) Switch CS_ to high.
22) SWitch CS_ to low.
23) Gadfly loop: Spin on WIP in the Status Register.
24) Drain Receive FIFO so that it's ready for the next user.
25) Optional: Repeat steps 13 to 24 as needed to write additional pages or
page segments.
Akhirnya, jika alamat tulis Anda tidak pada batas halaman (biasanya kelipatan 256 byte) dan Anda menulis data yang cukup untuk melewati batas halaman berikut, data yang harus melewati batas akan ditulis ke awal halaman di mana alamat program Anda jatuh. Jadi, jika Anda mencoba untuk menulis tiga byte ke alamat 0x0FE. Dua byte pertama akan ditulis ke 0x0fe dan 0x0ff. Byte ketiga akan ditulis ke alamat 0x000.
Jika Anda mengirimkan sejumlah byte data yang lebih besar dari ukuran halaman, byte earlies akan dibuang dan hanya byte 256 (atau ukuran halaman) final yang akan digunakan untuk memprogram halaman.
Seperti biasa, tidak bertanggung jawab atas konsekuensi dari kesalahan, kesalahan pengetikan, kekhilafan, atau kekacauan di atas, atau dalam cara Anda menggunakannya.