CẨM NANG STM32 CĂN BẢN CẦN BIẾT – SPI Flash – Giới thiệu

Dù rằng MCU STM32 có tài nguyên khá dồi dào, đôi khi bạn cần thêm không gian để lưu trữ dữ liệu ổn định (không mất dữ liệu khi mất điện). Các ứng dụng nhỏ có thể không sử dụng hết dung lượng lưu trữ khả dụng của bộ nhớ flash, nhưng nếu bạn phải thu thập lượng dữ liệu lớn hơn, có thể bạn sẽ xem xét đến giải pháp flash serial.

Chương này sẽ mô tả giao tiếp với các chip Winbond W25Q32 hoặc W25Q64 sử dụng thiết bị ngoại vi SPI ở chế độ chủ (master). Chip W25Q32 cung cấp 4 MB dung lượng lưu trữ flash có thể xóa được, trong khi W25Q64 cung cấp 8 MB. Những chip này có thể dễ dàng mua được với giá vừa túi tiền, khiến chúng trở nên hấp dẫn đối với nhiều ứng dụng.

Giới thiệu W25QXX

Các chip W25Q32/64 cung cấp dung lượng lưu trữ hợp lý nhưng chỉ cần một vài dây nối để giao tiếp. Chúng hoạt động với điện áp từ 2,7 đến 3,6V, tiêu thụ dòng 50 μA ở chế độ chờ, và sử dụng khoảng 15 mA để đọc dữ liệu. Viết và xóa cần nhiều hơn một chút, ở 25 mA. Hơn nữa, chip W25QXX có thể được giảm nguồn cấp dưới sự điều khiển phần mềm để tiết kiệm năng lượng khi cần.

Vì chip flash này sử dụng bus SPI để giao tiếp, hãy xem xét ngắn gọn cách SPI hoạt động.

=> Bài viết được trích từ sách : Cẩm nang STM32 (tập 1)

Bus giao tiếp ngoại vi serial

Giao diện ngoại vi nối tiếp (serial peripheral interface: SPI) là một giao diện serial (tuần tự) đồng bộ giao tiếp thông qua khoảng cách ngắn bằng ba dây và một tín hiệu chọn chip. Một đầu của bus đóng vai trò Master trong khi các thiết bị còn lại là Slaves. Giao diện SPI được phát triển bởi Motorola vào cuối những năm 1980 và từ đó trở thành một tiêu chuẩn trong thực tế. Hình 8-1 minh họa một thiết bị Master giao tiếp với một thiết bị Slave. Đây là dự án demo của chương này. Các Slave bổ sung có thể được gắn vào bus, nhưng mỗi thiết bị sẽ có tín hiệu chọn chip riêng.

Hình 8-1. Ví dụ SPI Master đơn – Slave đơn

Dòng tín hiệu xung hệ thống (system clock – SCK) cung cấp các xung nhịp định thời cho các bit dữ liệu được truyền và nhận. Tín hiệu MOSI là dữ liệu master out slave in, trong khi MISO là tín hiệu master in slave out. Tín hiệu thứ tư là chip select (), được sử dụng để kích hoạt thiết bị được chọn. Nó được ký hiệu với một thanh trên đầu hoặc dấu gạch chéo trước (/CS) để cho biết rằng nó đang hoạt động ở trạng thái thấp (low). Đôi khi tín hiệu này được gọi là slave selection ( ).

Một trong những khía cạnh độc đáo của bus SPI là phương thức giao tiếp của nó. Khi Master gửi các bit dữ liệu trên dòng MOSI, Slave đồng thời trả về các bit dữ liệu cho Master trên dòng MISO. Hình 8-2 ​​minh họa cách cặp hoạt động như hai bộ thanh ghi dịch.

Hình 8-2. SPI Master – Slave như một bộ thanh ghi dịch

SPI Master luôn tạo xung nhịp (SCK) để định thời cho dữ liệu được lấy mẫu và chuyển vào thanh ghi nhận. Sau khi nhận được toàn bộ chiều dài của word, Master và Slave nhận có thể đồng thời đọc dữ liệu nhận được.

Thiết kế SPI bus dẫn đến một số chương trình đặc biệt. Ví dụ, thiết bị Slave có thể không biết dữ liệu nào sẽ gửi cho đến khi nó nhận được một từ lệnh (command word) từ Master. Do đó, khi Master gửi word lệnh tới Slave, word đầu tiên nhận được từ Slave bị loại bỏ bởi vì nó là vô nghĩa. Một khi các thiết bị Slave đã nhận được word lệnh, nó sẽ biết cách để trả lời. Nhưng Slave cần Master để cho phép câu trả lời của nó được chuyển vào phần đăng ký nhận của Master. Do đặc điểm này, lập trình SPI thường yêu cầu loại bỏ một số dữ liệu nhận được và gửi các dữ liệu giả. Kích thước word cho bộ điều khiển SPM STM32 có thể dài 8 hoặc 16 bit.

Chip Select (Chọn Chip)

Bạn có thể hỏi “Tại sao chúng ta cần một dây chọn chip khi chỉ có một Slave tham gia vào bản demo này?” Vấn đề là có thể có nhiễu ở đường bus. Để bảo vệ chống lại điều đó, Slave cần phải biết khi nào việc truyền phát bắt đầu và kết thúc. Nếu nhiễu nhận được trên đường SCK, ví dụ, các Slave bị trễ một bit so với Master. Có lẽ một lệnh linh tinh nào đó có thể được nhận bởi chip flash như là một chức năng “xóa chip”, khi đó sẽ là thảm họa. Vì lý do này, /CS kéo xuống low trước khi bit dữ liệu đầu tiên được gửi bởi Master. Điều này cho thiết bị Slave biết rằng bit đầu tiên đang đến. Khi word cuối cùng của dữ liệu đã được gửi, /CS trả về trạng thái high để báo hiệu kết thúc truyền. Chip flash Winbond sẽ nhấn mạnh điều này trước khi thực hiện thao tác ghi hoặc xóa; nếu không, lệnh sẽ bị bỏ qua.

Nối dây và Điện áp

Khi kết nối UART, thường cần phải kết nối TX với RX và RX với TX, v.v., tùy thuộc vào ý nghĩa của thiết bị và cách nhà sản xuất gắn nhãn các kết nối. Điều này có thể gây nhầm lẫn. Với bus SPI, tình hình rất đơn giản – dây SCK luôn luôn nối với SCK, MOSI luôn luôn đến MOSI, MISO luôn luôn đến MISO và  tới .

Điện áp bus SPI có thể thay đổi, thường là 5V hoặc 3,3V. Các thiết bị Winbond W25QXX có thể hoạt động ở mức 3,3V, làm cho nó đơn giản để giao tiếp với STM32.

Mạch SPI

Hình 8-1 minh họa mạch đầy đủ liên quan đến dự án flash SPI của chúng ta. Chip Winbond bao gồm một số chân khác mà chúng ta chưa bàn đến, như sau:

  • /WP Write Protect (dây tới +3.3 V để cho phép ghi)
  • /HOLD Giữ đầu vào (dây tới +3.3 V khi không sử dụng)

Cả hai tính năng này đều không được sử dụng trong chương này, và phải được kết nối với nguồn +3.3V. Tín hiệu /WP là một tùy chọn an toàn mà bạn có thể thấy hữu ích trong một số ứng dụng. Khi /WP được nối đất, không thể viết hoặc xóa.

=> xem thêm : Lập trình Arm STM32

Điều khiển phần cứng /NSS

Một tính năng của thiết bị ngoại vi STM32 SPI đã làm một số người khó chịu, đánh giá bằng các bài đăng trên diễn đàn, là việc điều khiển phần cứng tùy chọn của chân /CS trong chế độ Master SPI. Nếu bạn bỏ qua điện trở kéo lên R1 trong Hình 8-3, bạn sẽ thấy rằng nó không hoạt động. Nhiều người đã báo cáo rằng “nó dường như không hoạt động” hoặc “nó không làm bất cứ điều gì.” Câu trả lời của diễn đàn cho vấn đề này là khuyên quản lý chân đó bằng phần mềm (hoạt động như một GPIO).

Hình 8-3. STM32 nối dây với W25Q32 hoặc W25Q64.
Nếu bạn có PCB với layout khác, hãy bỏ qua số chân của PCB, mà hãy khớp với nhau theo chức năng (ví dụ CLK, được kết nối với SCK trên MCU).

Vấn đề này một phần dựa trên giả định rằng chân /NSS (/CS) là một đầu ra (đẩy/kéo). Sau rốt, đó cũng là cách nó thường được cấu hình trong khi thiết lập SPI (xem dòng 652 của Bản kê 8-2). Tài liệu ST cũng không trình bày rõ về điều này. Gợi ý duy nhất ở hành vi này nằm trong Tài liệu RM0008, phần “25.3 Mô tả chức năng SPI” trong “Quản lý lựa chọn Slave (NSS)”:

Tín hiệu NSS được đưa xuống mức low khi Master bắt đầu truyền thông và được giữ ở mức low cho tới khi SPI bị vô hiệu hóa.

Tài liệu không bao giờ đề cập đến tín hiệu /NSS đang được định hướng cao. Sau đó, có Tài liệu AN2576, mô tả “STM32F10xxx SPI và giao tiếp bộ nhớ flash M25P64.” Trình bày trong hình 5 của tài liệu là một điện trở kéo lên 10 kohm không được nhắc đến.

Đặc điểm này của thiết bị ngoại vi SPI không hoàn toàn gây ngạc nhiên khi bạn đọc về các tính năng của thiết bị ngoại vi. Một trong những tính năng được sử dụng là hỗ trợ cho chế độ multi-Master (nhiều thiết bị Master). Trong chế độ hoạt động này, chân /NSS sẽ phải hoạt động như cả đầu vào và đầu ra. Một driver (mạch điều khiển) cực máng hở (open-drain) phù hợp với chế độ hoạt động này. Trong điều kiện hết sức lý tưởng, thiết bị ngoại vi sẽ bật đầu ra push/pull ở chế độ Master đơn (single Master) và sử dụng open-drain cho chế độ multi-Master. Nhưng không phải là trường hợp ở đây. Đọc datasheets và làm việc với phần cứng thường dẫn đến một số câu đố thú vị.

Nếu bạn mới bắt đầu sử dụng thiết bị điện tử digital, thì câu trả lời đơn giản trong mạch này là bạn cần điện trở 10 kohm. Một số độc giả có thể lẩm bẩm, “Tại sao điều khiển phần cứng khó? Tại sao không điều khiển /NSS đơn giản với các lệnh GPIO? Từ “đơn giản” tạo ra rất nhiều rắc rối!

Từ một quan điểm thuần túy logic, và bỏ qua sai số nhỏ, điều khiển GPIO của /NSS là hoàn toàn hợp lệ, tuy vậy phải viết code rất nhiều. Nhưng lý do chính để mong muốn điều khiển phần cứng các chân /NSS là để giảm nguy cơ nhiễu làm hỏng các tin báo SPI. Khoảng thời gian giữa lúc bắt đầu một giao tác (transaction) SPI và kích hoạt đường (truyền) /NSS ngắn hơn khi điều khiển “cứng” so với khi thiết lập GPIO bằng điều khiển “mềm”. Tương tự vậy, phần cứng SPI có thể hủy kích hoạt đường /NSS ở cuối giao tác sớm hơn một thao tác GPIO trên phần mềm. Thời gian không khác biệt nhiều lắm, nhưng nó làm giảm nguy cơ lỗi tin báo.

Một lý do cuối cùng cho việc thực hiện điều khiển “cứng” đường /NSS là nó giúp chúng ta không phải tự mình làm điều đó. Điều đó có nghĩa là chúng ta không thể quên vô hiệu hóa dòng /NSS. Nếu chúng ta quên, thao tác ghi hoặc xóa cuối cùng sẽ bị bỏ qua bởi chip flash.

Lưu ý rằng Vcc ở đây là nguồn cấp +3.3V. Tín hiệu /WP và /HOLD kích hoạt ở mức low và phải được kết nối với Vcc để vô hiệu hóa chúng.

Hình 8-4 minh họa hai kiểu đóng gói chính của W25Q32. Giá cho kiểu DIP (Dual Inline Package) tương đương với kiểu SOIC (Small Outline Integrated Circuit) hàn trên PCB.

Hình 8-4. W25Q32 kiểu DIP (trái) và W25Q32 kiểu SOIC trên PCB (phải)

=> Sách Arduino, ESP8266, STM32 : Sách tự động hóa