Hình 4 trình bày sơ đồ kết nối hai hệ thống với nhau bằng giao tiếp SPI. Một hệ thống được trang bị bộ thu/phát tín hiệu SPI Master còn hệ thống kia được trang bị bộ thu/phát tín hiệu SPI Slave. SPI Master và SPI Slave kết nối với nhau thông qua bốn đường tín hiệu:
- SS (Slave Select): về cơ bản đây là tín hiệu báo sự bắt đầu và kết thúc một lần thu/phát dữ liệu qua SPI. Tín hiệu SS sẽ do bộ SPI Master tạo ra.
- SCLK (Serial Clock): tín hiệu clock được tạo ra bởi SPI Master để định thời cho dữ liệu. Tại mỗi cạnh lên hoặc xuống của mỗi clock, một bit dữ liệu sẽ được truyền đi trên dây MOSI và MISO.
- MOSI (Master Out Slave In): đường truyền dữ liệu từ SPI Master đến SPI Slave. Tín hiệu trên đường dây này do SPI Master tạo ra.
- MISO (Master In Slave Out): đường truyền dữ liệu từ SPI Slave đến SPI Master. Tín hiệu trên đường dây này do SPI Slave tạo ra.

Hình 4: Hai hệ thống kết nối với nhau qua SPI. Một hệ thống được trang bị SPI Master còn hệ thống kia được trang bị SPI Slave. SPI Master và SPI Slave kết nối với nhau qua bốn đường tín hiệu: Slave Select (SS), Serial Clock (SCLK), Master-Out-Slave-In (MOSI), và Master-In-Slave-Out (MISO). Hướng mũi tên trên các đường tín hiệu cho biết nơi tạo ra và nơi nhận tín hiệu.

Hình 5: Dạng sóng tiêu biểu của các tín hiệu dùng trong giao tiếp SPI. Các mũi tên trên dạng sóng của SCLK được dùng để minh hoạ thời điểm tín hiệu trên các đường MOSI/MISO được lấy mẫu (sample), trong ví dụ này dữ liệu được sample ở cạnh xuống của SCLK.
Hình 5 trình bày ví dụ về dạng sóng trên các đường tín hiệu của giao tiếp SPI trong một lần gửi dữ liệu. Đầu tiên SPI Master sẽ chuyển trạng thái của tín hiệu Slave Select từ inactive (không hoạt động) sang active (hoạt động). Trong trường hợp này đường tín hiệu SS được ký hiệu là nSS để nhấn mạnh rằng mạch sẽ ở chế độ active khi nSS ở mức thấp. (Việc chọn mức thấp hay mức cao làm mức active là tuỳ ý người thiết kế miễn là SPI Master và SPI Slave dùng chung một quy ước.)
Sau khi tín hiệu Slave Select được chuyển sang active một thời gian, SPI Master bắt đầu tạo tín hiệu clock trên đường dây SCLK để định thời cho SPI Slave (và cho cả bản thân mạch SPI Master). SPI Slave căn cứ vào tín hiệu SCLK để nhận hay/và gửi tín hiệu.
Giao tiếp SPI là một giao tiếp full-duplex nghĩa là dữ liệu có thể đồng thời được gửi trên cả hai chiều: từ SPI Master sang SPI Slave (trên đường MOSI) và từ SPI Slave sang SPI Master (trên đường MISO). Khi truyền dữ liệu từ SPI Master sang SPI Slave:
- Tại một cạnh lên hoặc xuống của tín hiệu SCLK, SPI Master tạo điện áp mức cao hoặc thấp để biểu diễn 1 hoặc 0 trên đường MOSI. SPI Master sẽ duy trì điện áp này trong một chu kỳ của SCLK trước khi chuyển sang một mức điện áp khác để gửi đi bit tiếp theo trong chu kỳ SCLK kế tiếp. Việc tạo điện áp được gọi là setup. Trong Hình 3, các bit được setup bởi SPI Master ở các cạnh lên (rising edge) của SCLK.
- SPI Slave nhận dữ liệu trên đường MOSI bằng cách lấy mẫu (sample) điện áp trên đường dây này. Để thu được dữ liệu chính xác, SPI Slave phải lấy mẫu một bit dữ liệu trong khoảng thời gian từ khi SPI Master setup bit đó đến trước khi SPI Master setup bit kế tiếp. Trong Hình 5, SPI Slave sample các bit dữ liệu ở các cạnh xuống (falling edge) của SCLK.
Tóm lại, trên đường MOSI, SPI Master sẽ setup một bit ở một cạnh của SCLK, SPI Slave sẽ chờ một nửa chu kỳ rồi mới sample bit đó ở cạnh kế tiếp của SCLK. SPI Master sẽ chờ thêm một nửa chu kỳ kể từ khi SPI Slave bắt đầu sample rồi mới setup bit kế tiếp ở cạnh tiếp theo của SCLK. Cứ mỗi chu kỳ của SCLK, một bit sẽ được truyền đi.
Tương tự như vậy, khi truyền dữ liệu từ SPI Slave sang SPI Master trên đường MISO, SPI Slave setup tín hiệu còn SPI Master sample tín hiệu lần lượt ở mỗi cạnh của SCLK. Chú ý rằng mặc dù dữ liệu truyền từ SPI Slave sang SPI Master, tín hiệu SCLK vẫn do SPI Master tạo ra. SPI Master luôn là hệ thống quyết định khi nào bắt đầu/kết thúc chuyển dữ liệu (thông qua tín hiệu Slave Select) và khi nào setup/sample từng bit (thông qua tín hiệu SCLK).
Khi quá trình truyền dữ liệu kết thúc, SPI Master không gửi tín hiệu SCLK nữa và sau đó chuyển tín hiệu Slave Select sang mức inactive để SPI Slave không thể sample/setup dữ liệu trên các đường MOSI/MISO.
Để đảm bảo cho tín hiệu trên SPI được phát và thu đúng, SPI Master và SPI Slave phải được thiết kế phù hợp với nhau. Trong bảng mô tả đặc tính của một giao tiếp SPI, ta thường gặp các thông tin sau:
- SS Active Low/High: thông số này cho biết mạch SPI Slave được chuyển sang trạng thái active khi tín hiệu Slave Select là thấp hay cao. Mạch SPI Master sẽ điều khiển tín hiệu Slave Select tương ứng để kích hoạt hoặc ngừng kích hoạt mạch SPI Slave.
- CPOL (viết tắt của Clock POLarity): thông số này cho biết tín hiệu SCLK có dạng như thế nào.
- CPOL = 0: cạnh đầu tiên của SCLK là cạnh lên (khi không hoạt động thì SCLK ở mức thấp) và mỗi xung clock bao gồm cạnh thứ nhất là cạnh lên và cạnh thứ hai là cạnh xuống.
- CPOL = 1: cạnh đầu tiên của SCLK là cạnh xuống (khi không hoạt động thì SCLK ở mức cao) và mỗi xung clock bao gồm cạnh thứ nhất là cạnh xuống và cạnh thứ hai là cạnh lên.
- CPHA (viết tắt của Clock PHAse): thông số này cho biết tín hiệu MOSI và MISO được setup và sample ở cạnh nào của SCLK.
- CPHA = 0: tín hiệu được sample ở cạnh thứ nhất của xung SCLK và được setup ở cạnh thứ hai của xung SCLK. Chú ý rằng trong trường hợp này bit dữ liệu đầu tiên sẽ được setup trước khi có xung SCLK.
- CPHA = 1: tín hiệu được setup ở cạnh thứ nhất của xung SCLK và được sample ở cạnh thứ hai của xung SCLK.
Tổng hợp hai thông số CPOL và CPHA cho ta bốn kiểu (mode) định dạng dữ liệu trên MISO/MOSI (xem Hình 7):
- Kiểu 0 (Mode 0) (CPOL = 0, CPHA = 0): dữ liệu được bên phát setup ở cạnh xuống của xung clock trước đó và được bên thu sample ở cạnh lên của xung clock hiện tại.
- Kiểu 1 (Mode 1) (CPOL =0, CPHA = 1): dữ liệu được bên phát setup ở cạnh lên của xung clock và được bên thu sample ở cạnh xuống của xung clock.
- Kiểu 2 (Mode 2) (CPOL =1, CPHA = 0): dữ liệu được bên phát setup ở cạnh lên của xung clock trước đó và được bên thu sample ở cạnh xuống của xung clock hiện tại.
- Kiểu 3 (Mode 3) (CPOL =1, CPHA = 1): dữ liệu được bên phát setup ở cạnh xuống của xung clock và được bên thu sample ở cạnh lên của xung clock.
Ngoài ra còn có hai thông số khác:
- Clock-rate: thông số này cho biết tốc độ tối đa của tín hiệu SCLK mà mạch SPI (Master và Salve) hoạt động được một cách đáng tin cậy.
- MSB first hay LSB first: thông số này liên quan đến cách một byte dữ liệu được truyền đi như thế nào-với bit MSB trước hay với bit LSB trước. Mặc dù thông số này không trực tiếp liên quan đến đặc tính điện của tín hiệu trên giao tiếp SPI, nhưng đây cũng là một thông số cần để ý khi phát triển các ứng dụng để xử lý các bit dữ liệu được thu/phát trên giao tiếp SPI.
Hình 8a-e dưới đây trình bày các ví dụ về tín hiệu SPI thực tế trên máy hiện sóng. Các thông số sau được sử dụng chung trong cả 5 ví dụ:
- Slave Select hoạt động ở mức thấp
- Tốc độ: 125 kHz
- Dữ liệu: 8 bit nhị phân có giá trị 0x53 (hex) hay 0b01010011 (nhị phân)
Hình 8a-d là dạng sóng trong các Mode 0-4 với bit MSB được truyền đi trước. Hình 8e là dạng sóng trong Mode 1 với bit LSB được truyền đi trước.

Hình 8a: Mode 0, MSB First.
CPOL = 0 (Rising/Falling), CPHA=0 (Sample/Setup). Tín hiệu MOSI và MISO được thay đổi (setup) ở cạnh xuống của SCLK. Các bộ đệm (MOSI_Input_Buffer và MISO_Input_Buffer) nhận dữ liệu (sample) ở cạnh lên của SCLK.

Hình 8b: Mode 1, MSB First.
CPOL = 0 (Rising/Falling), CPHA=1 (Setup/Sample). Tín hiệu MOSI và MISO được thay đổi (setup) ở cạnh lên của SCLK. Các bộ đệm (MOSI_Input_Buffer và MISO_Input_Buffer) nhận dữ liệu (sample) ở cạnh xuống của SCLK.

Hình 8c: Mode 2, MSB First.
CPOL = 1 (Falling/Rising), CPHA=0 (Sample/Setup). Tín hiệu MOSI và MISO được thay đổi (setup) ở cạnh lên của SCLK. Các bộ đệm (MOSI_Input_Buffer và MISO_Input_Buffer) nhận dữ liệu (sample) ở cạnh xuống của SCLK.

Hình 8d: Mode 3, MSB First.
CPOL = 1 (Falling/Rising), CPHA=1 (Setup/Sample). Tín hiệu MOSI và MISO được thay đổi (setup) ở cạnh xuống của SCLK. Các bộ đệm (MOSI_Input_Buffer và MISO_Input_Buffer) nhận dữ liệu (sample) ở cạnh lên của SCLK.
…
(xem tiếp Phần 3: Thiết kế mạch SPI Slave)
- Phần 1: Giới thiệu
- Phần 2: Nguyên lý hoạt động
- Phần 3: Thiết kế mạch SPI Slave
- Phần 4: Kết hợp SPI với thanh ghi + Phần cuối: SPI Master
Pingback: SPI cho dân analog – Phần 1/4: Giới thiệu | Chuyên Mục Công Nghệ
Pingback: SPI cho dân analog – Phần 3/4: Thiết kế mạch SPI Slave | Chuyên Mục Công Nghệ
Pingback: SPI cho dân analog – Phần 4/4: Kết hợp SPI với thanh ghi – Phần cuối: SPI Master | Chuyên Mục Công Nghệ