Sự khác nhau giữa 2 giao thức SPI và I2C

 SPI

SPI được phát triển trong thập niên 1980 bởi Motorola như là 1 cách để giao tiếp giữa những vi điều khiển đời đầu của họ với những ngoại vi onboard như là EEPROM. Motorola, cũng như bất kỳ tổ chức nào khác, duy trì bất kỳ hình thức tiêu chuẩn hóa nào của giao thức SPI. Do tiêu chuẩn "de facto" này, việc triển khai có thể khác nhau giữa các nhà sản xuất. Hãy chắc chắn rằng bạn đọc kỹ datasheet cho từng phần liên quan đến SPI! 

SPI dùng 4 đường tín hiệu tích cực (không bao gồm nguồn và đất) để giao tiếp giữa các phần.

- SCLK: Serial Clock (điều khiển bởi master)

- MOSI: Master Out Slave In (điều khiển bởi master)

- MISO : Master In Slave Out (điều khiển bởi thiết bị slave)

- SS: Slave Select (điều khiển bởi master)

Với 4 tín hiệu này, 1 thiết bị điều khiển (master) có thể giao tiếp với những thiết bị ngoại vi khác (slave)

Kết nối SPI kiểu điểm-điểm

Trong khi ta chỉ có 1 master trên SPI bus thì ta có thể thêm số lượng bất kỳ các ngoại vi. Với mỗi ngoại vi thêm vào thì ta phải thêm một đường tín hiệu SS. Trong sơ đồ ví dụ sau thì ta phải thêm 3 đường SS riêng biệt, mỗi đường điều khiển 1 ngoại vi riêng biệt.
Kết nối SPI cho 3 thiết bị Slave

Khi thiết bị master muốn gửi đến hoặc nhận dữ liệu từ 1 ngoại vi thì nó bắt đầu giao tiếp bằng cách kéo (pulling) đường tín hiệu SS tương ứng xuống thấp, cùng lúc đó nó kích hoạt tín hiệu clock (đảo trạng thái SCLK cao và thấp ở một tần số cho trước). Thiết bị master sau đó gửi dữ liệu trên đường MOSI đồng thời lấy mẫu từ đường MISO. Vì thế dữ liệu có thể được gửi giữa 1 master và thiết bị ngoại vi cùng lúc (song công - full-duplex).
Chú ý là trong một thời điểm thì chỉ 1 thiết bị ngoại vi giao tiếp với master.

Ví dụ biểu đồ định thời (timing diagram) của mode 0 SPI: MOSI và MISO được lấy mẫu ở cạnh xung lên SCLK

SPI có 4 chế độ khác nhau quyết định cách thức xung clock hoạt động. Master và slave phải dùng chung 1 chế độ. Chế độ 0 là chế độ phổ biến nhất giữa các thiết bị cho đến nay.

    - Mode 0: dữ liệu được lấy mẫu ở cạnh xung lên, clock idles low
    - Mode 1: data sampled on falling clock edge, clock idles low
    - Mode 2: data sampled on falling clock edge, clock idles high
    - Mode 3: data sampled on rising clock edge, clock idles high

SPI không quy định rõ mức điện áp cụ thể, tốc độ truyền tối đa cũng như hệ thống định địa chỉ (addressing schemes). Vì thế nên những yếu tố này là do ta tự quyết định, tốc độ của SPI có thể dễ dàng vượt qua 10Mbps vì thế ta cần phải đọc datasheet cho tất cả các phần vì chúng sẽ quyết định mức điện áp phù hợp, giới hạn tốc độ và những chế độ hỗ được hỗ trợ.
Vì có tốc độ cao nên SPI được dùng cho ứng dùng cần truyền một lượng lớn dữ liệu. SPI xuất hiện ở những cảm biến yêu cầu tốc độ cập nhật nhanh như là gia tốc kế, thiết bị hiển thị, LCD và các thiết bị bộ nhớ flash.

SPI

Philips Semiconductors (nay được biết đến là NXP Semiconductors) đã tạo ra đặc điểm kỹ thuật của I2C vào năm 1982 để giúp chuẩn hóa giao tiếp giữa các chip trên cùng một bo mạch. NXP không tính phí bất kỳ ai sử dụng hoặc triển khai I2C, nhưng họ tính phí nếu bạn muốn đăng ký địa chỉ thiết bị.

I2C sử dụng 2 đường tín hiệu (không bao gồm nguồn và đất) để giao tiếp:
- SDA: Serial Data
- SCL: Serial Clock

Về mặt lý thuyết, có thể gắn một số lượng bất kỳ các thiết bị master và thiết bị slave vào cùng một bus. Cả hai đường SDA và SCL đều bắt buộc phải là đường open-drain. Kết quả là, các thiết bị chỉ có thể kéo (pull) từng dòng xuống thấp. Trên mỗi đường dây cần có một điện trở kéo lên để kéo đường dây trở lại mức cao.

Kết nối I2C cho nhiều thiết bị master và slave

Bởi vì thiết kế open-drain nên I2C hỗ trợ nhiều master trên cùng 1 đường bus. Nếu 2 thiết bị bắt đầu truyền phát cùng lúc thì 1 trong 2 sẽ bị giữ lại ở một quá trình gọi là "arbitration". Những thiết bị giám sát đường tín hiệu SDA khi chúng giao tiếp, nếu 1 thiết bị thấy đường SDA thấp khi nó cố gắng truyền 1 tín hiệu logic cao thì nó sẽ biết là đã có 1 thiết bị khác đang giao tiếp, và nó sẽ dừng việc truyền lại.

Để bắt đầu giao tiếp thì 1 thiết bị master phát ra trạng thái START, SDA kéo xuống thấp trong khi SCL vẫn cao, sau đó master gửi 1 địa chỉ 7 bit của thiết bị nhận trên bus, theo sau bởi 1 bit ghi (0) hoặc bit đọc (1). Nếu 1 thiết bị trên đường bus có địa chỉ đó thì nó sẽ phản hồi bằng cách kéo SDA xuống thấp (bit ACK).

Dữ liệu sau đó có thể được gửi bởi master hoặc slave dưới dạng gói 1 byte ở một thời điểm, mỗi byte sẽ được báo nhận bởi thiết bị nhận bằng 1 bit ACK. Khi giao tiếp xong thì master phát trạng thái STOP bằng cách nhả đường SDA (kéo lên cao) trong khi SCL đang cao

Tốc độ truyền ban đầu được giới hạn là 100kbps (chế độ tiêu chuẩn). Năm 1992 thì Philips nâng lên là 400 kbps (chế độ nhanh). Một chế độ đặc biệt 3.4 Mbps (chế độ tốc độ cao) được thêm vào 6 năm sau đó. Một bộ lệnh đặc biệt phải được đưa ra ở tốc độ thấp hơn giữa master và slave để thiết lập kết nối tốc độ cao.

Mặc dù có thể gắn một số lượng bất kỳ thiết bị vào bus I2C thì địa chỉ 7-bit giới hạn số lượng thiết bị thực tế. Một số địa chỉ được để dành dự trữ, và do đó, chỉ có 112 thiết bị khác nhau có thể hiện diện trên cùng một bus. Có thể bật chế độ định địa chỉ 10 bit đặc biệt để cho phép nhiều thiết bị hơn, nếu cần.

I2C có một dạng điều khiển flow được gọi là "clock stretching". Một thiết bị ngoại vi có thể giữ SCL ở mức thấp, báo cho master cần giảm tốc độ truyền. Kỹ thuật này cho phép thiết bị ngoại vi một khoảng thời gian để xử lý dữ liệu trước khi phản hồi.

Do chỉ tốn 2 chân nên nhiều nhà sản xuất cảm biến sử dụng giao thức I2C trong chip của họ. Ví dụ: cảm biến nhiệt độ, gia tốc kế, ADC, v.v.

So sánh



SPI                                           I2C
Pin drive
Push-pull
Open drain
Signal lines
4 (plus 1 for each additional peripheral)
2
Max speed
No limit (10-100 Mbps is common)
400 kbps in fast mode (3.4 Mbps is possible with high-speed mode)
No. of peripherals
Only limited by number of pins available for SS lines on master
112 with 7-bit addressing
Multi-master
No
Yes
Flow control
No
Yes


Kết luận

Cả hai giao thức đều phù hợp với nhiều ứng dụng khác nhau. Thông thường, bạn bị giới hạn ở việc triển khai giao thức bởi nhà sản xuất một linh kiện cụ thể. Một số như cảm biến gia tốc ADXL345 của Analog Devices cung cấp cả giao diện (interface) I2C và SPI trên cùng một chip.
Nếu bạn phải chọn 1 trong 2, SPI nói chung là công cụ tốt hơn nếu bạn cần tốc độ truyền nhanh hơn. Mặt khác, I2C là tốt nhất nếu bạn bị giới hạn chân trên bộ vi điều khiển hoặc bộ vi xử lý của mình.

Nhận xét

Bài đăng phổ biến từ blog này

Một số nguyên tắc khi đặt tên tín hiệu, biến trong VHDL và Verilog

VHDL cơ bản 00: Giới thiệu ngôn ngữ VHDL