3.21. Kiến thức cơ bản về SPI

SPI (Serial Peripheral Interface -- Giao diện ngoại vi nối tiếp) là một bus nối tiếp đồng bộ được thiết kế cho các kết nối tầm ngắn, tốc độ cao giữa một bộ điều khiển và một hoặc nhiều thiết bị ngoại vi trên cùng một bo mạch. Đây là giao diện chuẩn cho thẻ SD, màn hình hiển thị, bộ nhớ flash, ADC và DAC, cùng nhiều loại cảm biến khác.

Trong khi UART không có đồng hồ dùng chung và phải khôi phục định thời từ chính đường dữ liệu, SPI chạy một dây đồng hồ song song với các dây dữ liệu. Bộ điều khiển điều khiển xung đồng hồ ở bất kỳ tần số nào nó muốn, và mọi thiết bị khác trên bus đều lấy mẫu dữ liệu đồng bộ với đồng hồ đó. Không cần đoán tốc độ baud và không có chi phí đóng khung -- chỉ có các cạnh xung đồng hồ và các bit.

3.21.1. Bốn dây

Một bus SPI song công hoàn toàn có bốn dây:

  • SCK (đồng hồ nối tiếp). Được điều khiển bởi bộ điều khiển. Mỗi bit được đưa vào hoặc đưa ra theo một cạnh của tín hiệu này.

  • MOSI (bộ điều khiển ra, ngoại vi vào). Đường ra của bộ điều khiển; ngoại vi lấy mẫu các bit từ đường này.

  • MISO (bộ điều khiển vào, ngoại vi ra). Đường ra của ngoại vi; bộ điều khiển lấy mẫu các bit từ đường này.

  • CS (chọn chip), đôi khi gọi là SS (chọn ngoại vi). Một đường riêng cho mỗi ngoại vi. Bộ điều khiển kéo CS xuống mức thấp để bắt đầu giao dịch và trở lại mức cao để kết thúc; bất kỳ ngoại vi nào có CS không được kích hoạt đều bỏ qua hoàn toàn bus và ngừng điều khiển đầu ra MISO của mình.

Four signal traces stacked: CS at top, SCK below it, then MOSI and MISO. CS starts high (idle), drops low to begin the transaction, then SCK clocks out eight pulses while MOSI and MISO carry one byte of data each, then CS returns high.

Một byte SPI: CS xuống thấp để chọn ngoại vi, SCK tạo xung tám bit, MOSI và MISO truyền mỗi đường một byte theo hai hướng ngược nhau.

Mỗi cạnh đồng hồ dịch chuyển một bit theo từng hướng cùng một lúc. Một xung SCK đơn đồng thời gửi một bit trên MOSI và nhận một bit trên MISO -- SPI song công hoàn toàn ở cấp độ dây. Phần mềm không bắt buộc phải sử dụng cả hai hướng: các giao dịch chỉ ghi và chỉ đọc rất phổ biến, với đường không sử dụng hoặc được bỏ qua hoặc giữ ở mức cao.

3.21.2. Cực tính và pha đồng hồ

Hai bit cấu hình quyết định chính xác cạnh đồng hồ nào dịch chuyển dữ liệu:

  • Cực tính đồng hồ (polarity, đôi khi là CPOL) -- trạng thái nhàn rỗi của SCK. 0 nghĩa là đồng hồ nhàn rỗi ở mức thấp và xung ở mức cao; 1 nghĩa là đồng hồ nhàn rỗi ở mức cao và xung ở mức thấp.

  • Pha đồng hồ (phase, đôi khi là CPHA) -- cạnh nào lấy mẫu dữ liệu. 0 lấy mẫu tại cạnh đầu tiên của mỗi xung đồng hồ (cạnh dẫn đầu); 1 lấy mẫu tại cạnh thứ hai (cạnh theo sau).

Kết hợp lại, chúng tạo ra bốn chế độ, thường gọi là Chế độ 0 đến Chế độ 3. Chế độ 0 (polarity=0, phase=0) là phổ biến nhất và là giá trị mặc định an toàn cho các thiết bị chưa biết.

Quy tắc quan trọng là cả hai đầu phải đồng thuận về chế độ. Các chế độ không khớp sẽ tạo ra dữ liệu rác ngay cả khi dây đồng hồ và dây dữ liệu được đấu nối đúng; nếu một thiết bị trả về kết quả vô nghĩa trong giao dịch đầu tiên, chế độ là điều đầu tiên cần kiểm tra.

3.21.3. Nhiều ngoại vi

Nhiều ngoại vi có thể chia sẻ cùng các đường SCK, MOSI và MISO miễn là mỗi thiết bị có đường CS riêng được điều khiển bởi bộ điều khiển:

  • Tất cả các ngoại vi đều thấy cùng một đồng hồ và dữ liệu, nhưng mỗi thiết bị theo dõi CS của riêng mình. Khi CS không được kích hoạt (mức cao), một ngoại vi bỏ qua hoàn toàn SCK và MOSI và để MISO ở trạng thái trở kháng cao để không tranh chấp đường với các thiết bị khác.

  • Bộ điều khiển kích hoạt chính xác một CS tại một thời điểm, thực hiện giao dịch, và giải phóng CS để nhả bus.

Một vi điều khiển với một khối SPI phần cứng duy nhất có thể giao tiếp với nhiều ngoại vi bằng số lượng chân GPIO rảnh dùng làm đường CS -- không có địa chỉ trên bus.

3.21.4. Điểm mạnh và điểm yếu

Cả điểm mạnh lẫn điểm yếu của SPI đều xuất phát từ thiết kế của nó:

  • Nhanh. Hàng chục megahertz có thể đạt được trên các đường dẫn ngắn với chuyển đổi mức đơn giản. Đầu đọc thẻ SD và màn hình SPI tận dụng điều này.

  • Đơn giản ở cấp độ dây. Không có địa chỉ, không có xác nhận, không có điều kiện start/stop đặc biệt -- chỉ có các bit trên dây đồng bộ với đồng hồ.

  • Tốn nhiều chân. Ba đường dùng chung cộng với một CS cho mỗi ngoại vi. Một bo mạch có năm thiết bị SPI sử dụng tám chân (ba + năm).

  • Tầm ngắn. SPI giả định các cạnh xung gọn và nhanh, nghĩa là đường dẫn ngắn trên cùng một bo mạch. Đối với các kết nối dài hơn, I2C hoặc một trong các bus có đóng khung là lựa chọn phù hợp hơn.