Loại muộn để thảo luận, nhưng đối với bất cứ ai đọc nó sau khi tìm kiếm ....
Một điều tôi không thấy được đề cập, điều cực kỳ quan trọng khi lập trình chip SPI Flash là kiểm soát pin Chip Chọn (CS_). Chân chọn Chip được sử dụng để ngắt các lệnh cho SPI Flash. Cụ thể, việc chuyển đổi từ CS_ cao sang CS_ thấp phải ngay lập tức trước khi phát hành bất kỳ mã op hoạt động ghi (WREN, BE, SE, PP). Nếu có hoạt động giữa quá trình chuyển đổi CS_ (tức là sau khi CS_ xuống thấp) và trước khi mã op được truyền, mã op thường sẽ bị bỏ qua.
Ngoài ra, điều không thường được giải thích trong bảng dữ liệu SPI Flash, bởi vì đó là một phần vốn có của giao thức SPI, điều rất quan trọng, là với mỗi byte truyền trên bus SPI, người ta sẽ nhận được một byte. Ngoài ra, người ta không thể nhận bất kỳ byte nào, trừ khi người ta truyền một byte.
Thông thường, SPI Master mà người dùng đang chỉ huy, có Bộ đệm truyền, gửi byte ra trên dòng MOSI của bus SPI và Bộ đệm nhận, nhận byte từ dòng MISO của bus SPI.
Để bất kỳ dữ liệu nào xuất hiện trong bộ đệm Nhận, một số dữ liệu phải được gửi ra Bộ đệm truyền. Tương tự, bất cứ khi nào người ta gửi dữ liệu ra khỏi bộ đệm Truyền, dữ liệu sẽ xuất hiện trong Bộ đệm nhận.
Nếu một người không cẩn thận về việc cân bằng việc ghi và ghi đọc, người ta sẽ không biết những gì mong đợi trong bộ đệm Nhận. Nếu tràn bộ đệm Nhận, dữ liệu thường chỉ bị đổ và mất.
Vì vậy, khi một người gửi lệnh đọc, đó là mã op một byte và ba byte địa chỉ, trước tiên người ta sẽ nhận được bốn byte "rác" trong bộ đệm Nhận SPI Master. Bốn byte rác này tương ứng với mã op và ba byte địa chỉ. Trong khi những thứ đó đang được truyền đi, Flash vẫn chưa biết Đọc gì, vì vậy nó chỉ trả về bốn từ rác.
Sau khi bốn từ rác đó được trả lại, để có được bất cứ thứ gì khác trong Bộ đệm nhận, bạn phải truyền một lượng dữ liệu bằng với số lượng bạn muốn đọc. Sau mã op và địa chỉ, không có vấn đề gì bạn truyền tải, nó chỉ là phụ để đẩy Read DAta từ SPI Flash sang Bộ đệm nhận.
Nếu bạn không theo dõi cẩn thận bốn từ rác được trả lại đầu tiên đó, bạn có thể nghĩ rằng một hoặc nhiều trong số chúng là một phần của Dữ liệu Đọc được trả về của bạn.
Vì vậy, để biết bạn thực sự nhận được gì từ bộ đệm nhận, điều quan trọng là phải biết kích thước bộ đệm của bạn, biết cách để biết nó trống hay đầy (thường đăng ký bit trạng thái để báo cáo điều này) và theo dõi cách nhiều thứ bạn đã truyền đi và bạn đã nhận được bao nhiêu.
Trước khi bắt đầu bất kỳ hoạt động SPI Flash nào, bạn nên "rút cạn" Nhận FIFO. Điều này có nghĩa là kiểm tra trạng thái của bộ đệm nhận và làm trống nó (thường được thực hiện bằng cách thực hiện 'đọc' Bộ đệm nhận) nếu nó chưa trống. Thông thường, làm trống (đọc) một Bộ đệm Nhận đã trống không có hại.
Thông tin sau đây có sẵn từ các sơ đồ thời gian trong bảng dữ liệu của SPI Flashes, nhưng đôi khi mọi người bỏ qua các bit. Tất cả các lệnh và dữ liệu được cấp cho flash SPI bằng bus SPI. Trình tự để đọc SPI Flash là:
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.
Lưu ý rằng các bước 6 và 7 phải được xen kẽ và lặp lại tùy thuộc vào kích thước đọc và kích thước của Bộ đệm Nhận và Truyền của bạn. Nếu bạn truyền một số lượng từ lớn hơn cùng một lúc, hơn Bộ đệm nhận của bạn có thể giữ, bạn sẽ làm đổ một số dữ liệu.
Để tạo trước một Chương trình Trang hoặc lệnh Viết, hãy thực hiện các bước này. Kích thước trang (thường là 256 byte) và Kích thước ngành (thường là 64K) và các ranh giới liên quan là các thuộc tính của SPI Flash bạn đang sử dụng. Thông tin này phải có trong biểu dữ liệu cho Flash. Tôi sẽ bỏ qua các chi tiết về việc cân bằng bộ đệm Truyền và Nhận.
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.
Cuối cùng, nếu địa chỉ ghi của bạn không nằm trên ranh giới trang (thường là bội số 256 byte) và bạn viết đủ dữ liệu để vượt qua ranh giới trang sau, dữ liệu sẽ vượt qua ranh giới sẽ được ghi vào đầu trang trong đó địa chỉ chương trình của bạn rơi. Vì vậy, nếu bạn cố gắng viết ba byte đến địa chỉ 0x0FE. Hai byte đầu tiên sẽ được ghi vào 0x0fe và 0x0ff. Byte thứ ba sẽ được ghi vào địa chỉ 0x000.
Nếu bạn truyền một số byte dữ liệu lớn hơn kích thước trang, các byte Earlies sẽ bị loại bỏ và chỉ các byte 256 (hoặc kích thước trang) cuối cùng sẽ được sử dụng để lập trình trang.
Như mọi khi, không chịu trách nhiệm về hậu quả của bất kỳ lỗi, lỗi chính tả, lỗi quá mức hoặc loạn trí ở trên, cũng như trong cách bạn đưa nó vào sử dụng.