#3_Chuẩn giao tiếp SPI

Chuẩn giao tiếp SPI

Nắm rõ lý thuyết về chuẩn giao tiếp SPI sẽ giúp chúng ta hiểu rõ bản chất và thuận lợi cho thực hiện các dự án sau này…

Chúng ta sẽ cùng tìm hiểu phần lý thuyết trước khi vào phần thực hành trên vi điều khiển…

Phần cơ bản

Giới thiệu về chuẩn giao tiếp SPI

Khi tìm hiểu về các Module thu phát vô tuyến, dùng trong điều khiển từ xa, ta có thể sẽ gặp phải thuật ngữ “Chuẩn giao tiếp SPI“, “giao tiếp SPI“. Vậy chuẩn giao tiếp SPI là gì, tại sao nó lại được dùng trong các loại module này?

Chuẩn giao tiếp SPI
Module vô tuyến NRF24L01 sử dụng giao tiếp SPI

Giao tiếp SPI là 1 giao tiếp thường được dùng trong vi điều khiển với 4 dây. 2 dây để truyền và nhận dữ liệu là MOSI (Master Out Slave In) và MISO (Master In Slave Out). 1 dây SCK để tạo tín hiệu đồng hồ đồng bộ giữa các thiết bị. Còn dây cuối cùng CS để chọn thiết bị sẽ giao tiếp khi trong mạng có nhiều slave.

Khái quát về truyền dữ liệu 

Đầu tiên, tín hiệu đồng hồ SCK sẽ tạo đồng bộ trong hệ thống theo các xung nhịp của nó. Sau đó, Master chọn Slave sẽ giao tiếp bằng cách cho điện áp chân CS về mức thấp. Rồi việc truyền dữ liệu sẽ diễn ra trên chân MOSI của Master với MISO của Slave.

Việc truyền dữ liệu trong chuẩn giao tiếp SPI có vẻ đơn giản hơn trong giao tiếp I2C và giao tiếp UART đúng không. Sau đây ta sẽ cùng tìm hiểu chi tiết về các thành phần và quá trình truyền dữ liệu trong chuẩn giao tiếp SPI ở phần nâng cao.

Phần nâng cao

Các thành phần trong chuẩn giao tiếp SPI

Chuẩn giao tiếp SPI

SPI (Serial Peripheral Interface) là một chuẩn truyền thông nối tiếp đồng bộ để truyền dữ liệu ở chế độ song công toàn phần (full-duplex) tức là trong cùng một thời điểm có thể xảy ra đồng thời quá trình truyền và nhận, do công ty Motorola thiết kế nhằm đảm bảo sự liên hợp giữa các vi điều khiển và thiết bị ngoại vi một cách đơn giản và giá rẻ.

Chuẩn giao tiếp SPI
Chuẩn giao tiếp SPI

Giao tiếp SPI sử dụng 4 dây để truyền dữ liệu giữa các thiết bị:

  1. MOSI (Master Out / Slave In) – Đường truyền cho master (thiết bị chủ) gửi dữ liệu đến slave (thiết bị tớ).
  2. MISO (Master In / Slave Out) – Đường cho slave (thiết bị tớ) gửi dữ liệu đến master (thiết bị chủ).
  3. SCLK (Serial Clock) hay SCK – Đường truyền của tín hiệu đồng hồ
  4. CS hay SS (Chip Select, Slave Select): Đường truyền để master chọn slave sẽ gửi dữ liệu đến.

Một lợi ích duy nhất của SPI là dữ liệu có thể được truyền mà không bị gián đoạn. Bất kỳ số lượng bit nào cũng có thể được gửi hoặc nhận trong một luồng liên tục.

Với giao tiếp I2Cgiao tiếp UART, dữ liệu được gửi dưới dạng gói, giới hạn ở một số bit cụ thể. Điều kiện bắt đầu và dừng xác định điểm bắt đầu và kết thúc của mỗi gói, do đó dữ liệu bị gián đoạn trong quá trình truyền.
Số dây sử dụng4
Tốc độ truyền dữ liệu tối đa10Mbps
Đồng bộ / Không đồng bộĐồng bộ
Giao tiếp nối tiếp / song songNối tiếp
Masters tối đa1
Slaves tối đaKhông giới hạn (Lý thuyết)
Trong thực tế, số lượng slave bị giới hạn bởi điện dung tải của hệ thống, điều này làm giảm khả năng chuyển đối chính xác giữa các mức điện áp của máy chủ.

Đồng hồ (SCLK)

Giao thức truyền thông đồng bộ

Tín hiệu SCK đồng bộ hóa đầu ra của các bit dữ liệu từ master với các slave. Một bit dữ liệu được truyền trong mỗi chu kỳ đồng hồ, do đó tốc độ truyền dữ liệu được xác định bởi tần số của tín hiệu đồng hồ.

Bất kỳ giao thức truyền thông nào mà các thiết bị chia sẻ tín hiệu đồng hồ được gọi là đồng bộ. do vậy chuẩn giao tiếp SPI có giao thức truyền thông đồng bộ.

Ngoài ra còn có các phương thức không đồng bộ không sử dụng tín hiệu đồng hồ. Ví dụ, trong giao tiếp UART, cả hai bên đều được đặt thành tốc độ truyền được cấu hình trước để chỉ ra tốc độ và thời gian truyền dữ liệu.

Các chế độ của giao tiếp SPI

Tín hiệu đồng hồ trong SPI có thể đồng bộ hóa bằng cách sử dụng các thuộc tính của phân cực đồng hồ (Clock Polarity) và pha đồng hồ (Clock Phase).

Clock Polarity có thể được thiết lập bởi tổng thể để cho phép các bit được xuất ra và lấy mẫu trên cạnh lên hoặc xuống của chu kỳ đồng hồ.

Thuộc tính phân cực đồng hồ Clock Polarity

Clock Phase có thể được đặt để đầu ra và lấy mẫu xảy ra trên cạnh đầu tiên hoặc cạnh thứ hai của chu kỳ đồng hồ, bất kể nó đang tăng hay giảm.

Pha đồng hồ Clock Phase

Hai thuộc tính này làm việc cùng nhau để xác định khi nào các bit được xuất ra và khi nào chúng được lấy mẫu. 4 chế độ được xác định bởi trạng thái của 2 thuộc tính Clock Polarity và Clock Phase.

Chuẩn giao tiếp SPI
Các chế độ của chuẩn giao tiếp SPI (Click to zoom)

Chọn Slave (CS/SS)

Master có thể chọn slave mà nó muốn giao tiếp bằng cách đặt đường dây CS / SS của slave ở mức điện áp thấp (mức 0).

Ở trạng thái không giao tiếp, dòng chọn của slave được giữ ở mức điện áp cao (mức 1). Có 2 cách để cấu hình nhiều slave với 1 master tương ứng với số chân CS/SS có sẵn trên master.

  • Nhiều chân CS / SS có thể có sẵn trên master, điều này cho phép đấu dây song song với nhiều slave.
1 Master với nhiều slave trong giao tiếp SPI – Nhiều Chân CS/SS
  • Nếu chỉ có một chân CS / SS, nhiều slave có thể được kết nối với master bằng cách nối chuỗi (cấu hình Daisy Chain).
1 Master với nhiều slave trong giao tiếp SPI – 1 Chân CS/SS

MOSI và MISO

Master gửi dữ liệu đến slave từng bit, nối tiếp qua đường MOSI. Slave nhận dữ liệu được gửi từ master tại chân MOSI. Dữ liệu được gửi từ master đến slave thường được gửi với bit quan trọng nhất trước, có thể từ bit có trọng số lớn nhất (MSB) hoặc bit có trọng số nhỏ nhất (LSB).
Slave cũng có thể gửi dữ liệu trở lại master thông qua đường MISO nối tiếp. Dữ liệu được gửi từ slave trở lại master thường được gửi với bit ít quan trọng nhất trước.

Cách truyền dữ liệu của chuẩn giao tiếp SPI.

  • Đầu ra chính của tín hiệu đồng hồ
Tín hiệu đồng hồ trong chuẩn giao tiếp SPI

Tín hiệu đồng hồ từ master sẽ cấp cho toàn bộ hệ thống, tạo sự đồng bộ về xung nhịp trong cả master và slave.

  • Master chuyển chân SS / CS sang trạng thái điện áp thấp, điều này sẽ kích hoạt chân phụ
Master chọn slave sắp giao tiếp

Lúc này chỉ slave có chân SS/CS kết nối với chân SS/CS trên nhận dữ liệu truyền đi từ master. Còn lại các slave có SS/CS ở điện áp cao khác sẽ không thực hiện quá trình giao tiếp.

  • Master gửi dữ liệu từng bit một đến slave dọc theo đường MOSI. Slave đọc các bit khi chúng được nhận
Master gửi dữ liệu qua chân MOSI
  • Nếu cần phản hồi, Slave sẽ trả lại dữ liệu từng bit một cho Master dọc theo đường MISO. Master đọc các bit khi chúng được nhận
Slave gửi dữ liệu ngược lại qua chân MISO

Ưu, nhược điểm của chuẩn giao tiếp SPI.

Ưu điểm

  • Không có Start bit và Stop bit như trong giao tiếp I2C và giao tiếp UART. Vì vậy dữ liệu có thể được truyền liên tục mà không bị gián đoạn
  • Không có hệ thống định địa chỉ slave phức tạp như I2C
  • Tốc độ truyền dữ liệu cao hơn I2C (nhanh gần gấp đôi)
  • Các dòng MISO và MOSI riêng biệt, vì vậy dữ liệu có thể được gửi và nhận cùng một lúc

Nhược điểm

  • Sử dụng bốn dây (I2C và UART sử dụng hai dây).
  • Không xác nhận rằng dữ liệu đã được nhận thành công.
  • Không có hình thức kiểm tra lỗi như bit chẵn lẻ (Parity bit) như trong UART.
  • Chỉ cho phép một master duy nhất.

Phần tổng kết

Ta đã cùng nhau tìm hiểu cơ bản về lý thuyết của chuẩn giao tiếp SPI. Đây là 1 khởi đầu tốt đẹp trước khi bắt đầu thực hành. Kiến thức về giao tiếp SPI được tóm tắt lại như sau:

  • Sử dụng 4 dây MOSI, MISO, SCK, CS
  • Việc truyền dữ liệu bắt đầu khi chân CS được cấu hình về mức thấp
  • Có thể truyền và nhận dữ liệu đồng thời ở 2 chân MOSI và MISO
  • Phương thức truyền đồng bộ, truyền nối tiếp
  • Đầu tiên là SCK tạo xung nhịp -> Chân CS chọn slave. Sau đó quá trình truyền dữ liệu sẽ bắt đầu từ MOSI của master đến MISO của slave

Khi đã có kiến thức về chuẩn giao tiếp SPI, việc tìm hiểu các chuẩn giao tiếp thường gặp khác lúc này sẽ trở nên rất dễ dàng. Bạn có thể đọc thêm các chuẩn giao tiếp khác:

Bạn có thắc mắc gì trong bài viết không?

Đánh giá và để lại bình luận bên dưới nhá.

5/5 - (1 bình chọn)

Similar Posts

5 Comments

  1. I’m not that much of a internet reader to be honest but your sites really nice, keep it up!
    I’ll go ahead and bookmark your site to come back in the future.
    Many thanks

    1. Thank you, I want to bring some value in my posts. Your feedback will give me more motivation to develop in the future.

  2. nguyenquocvuong0983 viết:

    Cảm ơn anh, trang web của anh rất hay. Cho em hỏi với cách nối 1 chân CS trên master với nhiều Slave thì làm sao để cấp mức 0 cho từng slave khác nhau anh nhỉ ?

    1. Lúc này DL sẽ được truyền đến hết tất cả Slave, Truyền Từ M sáng S1, rồi S1 nhảy sang S2… rồi quay về Master (nhìn mũi tên xanh lá cây vs xanh da trời). E mã hóa DL để chỉ slave e cần sử dụng được dữ liệu (Kiểu chèn thêm ký tự “S1, S2…” vào đầu chuỗi mã hóa + code thêm hàm If ở slave để nhận lệnh). Cái này xem datasheet trước xem mấy con vđk em dùng có chơi được kiểu này không!

      1. nguyenquocvuong0983 viết:

        Cảm ơn anh trả lời câu hỏi của em! Thì ra là dùng code.
        Em đang học lại điện tử cơ bản, C/C++ rồi mới đến VĐK, sắp tới đến phần đó em sẽ lưu ý.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *