Đánh đổi khi xem xét SPI hay I2C?


117

Tôi nên cân nhắc điều gì khi quyết định sử dụng giao diện SPI hoặc I2C?

Bảng đột phá gia tốc / con quay hồi chuyển này có sẵn trong hai mô hình, một mô hình cho mỗi giao diện. Một trong hai sẽ dễ dàng hơn để tích hợp vào một dự án Arduino?

http://www.sparkfun.com/products/11028

nhập mô tả hình ảnh ở đây


13
I2C và SPI có sức mạnh của họ. I2C phức tạp hơn để thiết lập, một khi ổn định, bạn có thể dễ dàng mở rộng (miễn là dây xe buýt của bạn không quá dài hoặc lớn). SPI rất dễ thiết lập .. bạn có thể bitbang rất dễ dàng nếu cần. Mở rộng ăn I / O với tất cả các chip được chọn. Nếu tôi có sự sang trọng của I / O và không gian kết nối và không cần các bus, tôi sẽ luôn đi với SPI.
Hans

I2C phức tạp hơn như thế nào? Tôi đã sử dụng cả hai bus trên các micros khác nhau (PIC nhỏ và ARM có kích thước khá) và trong mọi trường hợp, thiết lập I2C đơn giản hơn (tức là ít đăng ký hơn để ghi). Nếu bất cứ điều gì, SPI phức tạp hơn vì các tùy chọn lấy mẫu dữ liệu và phân cực đồng hồ.
Armandas

6
@Armandas - không đời nào! SPI có 4 chế độ có thể cho phân cực đồng hồ / dữ liệu và hai trong số chúng chiếm ưu thế - gần như tất cả các thiết bị SPI cập nhật đầu ra MISO của chúng trên cạnh rơi của đồng hồ và đọc đầu vào MOSI của chúng trên cạnh tăng của đồng hồ. Bạn có thể tìm ra cái nào trong vài phút bằng cách nhìn vào bảng dữ liệu và sau đó bạn đã hoàn tất. Nếu bạn chọn nhầm chế độ, bạn sẽ nhanh chóng nhận ra khi bạn nhìn vào dấu vết dao động. Lỗi dữ liệu SPI rất hiếm và không khiến bạn bị mắc kẹt trong các trạng thái kỳ lạ theo cách I2C làm.
Jason S

6
Tôi nói I2c phức tạp hơn nhiều vì tôi đã từng phải viết trình điều khiển I2C tại một công ty ARM. Tôi đã theo dõi bộ máy trạng thái của các tài liệu NXP và nó dài khoảng 20 tiểu bang. Tôi đã mất một thời gian để tìm hiểu xác nhận, khi byte cuối cùng được đọc / ghi, v.v. Tôi chưa bao giờ gặp phải bất kỳ vấn đề nào với SPI, chỉ cần phải sắp xếp đồng hồ và dữ liệu.
Hans

1
@JonL, thật lòng mà nói, tôi là người duy nhất cung cấp câu trả lời hoàn chỉnh cho đến nay, vì tôi là người duy nhất thảo luận về vấn đề của bảng đột phá cụ thể mà OP muốn sử dụng và chỉ ra rằng nó không có sẵn trong cả SPI và I2C, nhưng chỉ I2C - vì vậy ông sử dụng I2C nếu ông muốn sử dụng bảng đặc biệt này. Những cái khác chỉ xử lý giao diện nào (SPI hoặc I2C) dễ giao diện hơn, mà tôi cũng đề cập đến.
tcrosley

Câu trả lời:


98

Tóm lược

  • SPI nhanh hơn.
  • I2C phức tạp hơn và không dễ sử dụng nếu vi điều khiển của bạn không có bộ điều khiển I2C.
  • I2C chỉ cần 2 dòng.

I2C là một hệ thống xe buýt với dữ liệu hai chiều trên tuyến SDA. SPI là kết nối điểm-điểm với dữ liệu vào và dữ liệu trên các dòng riêng biệt (MOSI và MISO).

Về cơ bản SPI bao gồm một cặp thanh ghi thay đổi, trong đó bạn đồng hồ dữ liệu vào một thanh ghi thay đổi trong khi bạn đồng hồ dữ liệu khác. Thông thường dữ liệu được ghi bằng byte bằng cách mỗi lần 8 xung đồng hồ liên tiếp, nhưng đó không phải là yêu cầu SPI. Bạn cũng có thể có độ dài từ 16 bit hoặc thậm chí 13 bit, nếu bạn thích. Mặc dù trong đồng bộ hóa I2C được thực hiện theo trình tự bắt đầu trong SPI, nhưng SS được thực hiện ở mức cao (SS hoạt động ở mức thấp). Bạn tự quyết định sau bao nhiêu xung đồng hồ này. Nếu bạn sử dụng các từ 13 bit, SS sẽ chốt đồng hồ cuối cùng theo bit sau 13 xung đồng hồ.
Vì dữ liệu hai chiều nằm trên hai dòng riêng biệt nên dễ dàng giao tiếp.

NN+3N+2

Giống như tcrosley nói SPI có thể hoạt động với tần suất cao hơn nhiều so với I2C.

I2C phức tạp hơn một chút. Vì đó là xe buýt nên bạn cần một cách để giải quyết các thiết bị. Giao tiếp của bạn bắt đầu bằng một chuỗi bắt đầu duy nhất: dòng dữ liệu (SDA) bị kéo xuống thấp trong khi đồng hồ (SCL) ở mức cao, phần còn lại của dữ liệu truyền thông chỉ được phép thay đổi khi đồng hồ ở mức thấp. Trình tự bắt đầu này đồng bộ hóa mỗi giao tiếp.
Vì giao tiếp bao gồm địa chỉ chỉ cần hai dòng cho bất kỳ số lượng thiết bị nào (tối đa 127).

chỉnh sửa
Rõ ràng là dòng dữ liệu là hai chiều, nhưng đáng chú ý là điều này cũng đúng với dòng đồng hồ. Nô lệ có thể kéo dài đồng hồ để kiểm soát tốc độ xe buýt. Điều này làm cho I2C không thuận tiện cho việc chuyển cấp hoặc đệm. (Các dòng SPI trong chế độ tiêu chuẩn đều là một chiều.)

Sau khi mỗi byte (địa chỉ hoặc dữ liệu) được gửi, người nhận phải xác nhận việc nhận bằng cách đặt xung xác nhận trên SDA. Nếu vi điều khiển của bạn có giao diện I2C, điều này sẽ tự động được chăm sóc. Bạn vẫn có thể đập nó nếu vi điều khiển của bạn không hỗ trợ nó, nhưng bạn sẽ phải chuyển chân I / O từ đầu ra sang đầu vào cho mỗi xác nhận hoặc đọc dữ liệu, trừ khi bạn sử dụng chân I / O để đọc và một cho viết.

Ở mức 400kHz tiêu chuẩn I2C chậm hơn nhiều so với SPI. Có những thiết bị I2C tốc độ cao hoạt động ở mức 1 MHz, vẫn chậm hơn nhiều so với SPI 20 MHz.


7
Tôi chưa gặp một vi điều khiển xử lý tất cả các trường hợp góc của I2C cần xử lý phát hiện và phục hồi lỗi thích hợp theo cách có thể sử dụng mà không cần phải là chuyên gia I2C. Tôi đã luôn phải tạm thời chuyển từ thiết bị ngoại vi I2C "thông minh" sang bitbanging để xử lý trường hợp đồng hồ bị mất khi SDA bị giữ ở mức thấp, đó là một nỗi đau hoàn toàn. /
Jason S

(nhưng +1 vì tôi đồng ý với phần còn lại của câu trả lời của bạn)
Jason S

Thậm chí có những thiết bị I2C xung quanh hoạt động ở mức 3,4 MHz, nhưng tôi không chắc liệu những thiết bị này có thể được kết hợp với các thiết bị chậm hơn hay không (vì tất cả các thiết bị cần có khả năng theo địa chỉ xe buýt). Tôi cũng tin rằng định thời của I2C 3,4 MHz hơi khác một chút.
Hans

@Hans - HS I2C dường như tương thích xuống với các thiết bị 400kbit phổ biến hơn. Thành thật mà nói, (không có nghiên cứu kỹ lưỡng) Tôi chưa bao giờ thấy một vi điều khiển hỗ trợ HS (chưa), đó là lý do tại sao tôi không muốn đề cập đến nó.
stevenvh

@stevenvh: Việc triển khai hai dây của một số bộ điều khiển (ví dụ Cypress PSOC) yêu cầu SCK ở mức thấp trong ít nhất một hoặc hai chu kỳ của đồng hồ bên trong trước khi chúng chốt và sẽ bị hỏng. Tôi không biết tại sao họ không thể phát hiện và kéo dài điều kiện khởi động I2C mà không có xung đồng hồ hệ thống, nhưng hành vi như vậy có nghĩa là khi một con chip như vậy chạy ở tốc độ xung nhịp hệ thống thấp, tất cả các giao dịch I2C trên xe buýt phải được chạy chậm). Ngay cả hoạt động 400Khz cũng quá nhanh đối với PSOC chạy ở tốc độ 3 MHz.
supercat

39

(chỉnh sửa: Để rõ ràng, nhiều vấn đề sau đây liên quan đến tính toàn vẹn tín hiệu gây ra bởi việc sử dụng các thiết bị I2C / SPI, do Olin chỉ ra chính xác.)

Trừ khi bạn có những ràng buộc thúc đẩy bạn về phía ít dây hơn (chúng tôi đã có một dự án với đầu nối kín, mỗi tiếp điểm bổ sung khá đắt tiền), tránh I2C khi có thể và gắn bó với SPI.

SPI khá dễ đối phó trên phần cứng và phần mềm. Trong phần cứng, có hai dòng dữ liệu được chia sẻ là Master In Slave Out (MISO hoặc SOMI) và Master Out Slave In (MOSI hoặc SIMO), đồng hồ dùng chung được tạo bởi chủ và một chip chọn cho mỗi thiết bị. Dòng CS xuống thấp, đồng hồ quay vòng và về cơ bản sẽ dịch chuyển các bit đầu vào và dịch chuyển các bit đầu ra, cho đến khi giao dịch kết thúc, tại thời điểm đó, đường CS lên cao. Khi đường CS của họ cao, các thiết bị nô lệ không giao tiếp: họ bỏ qua các đường CLK và MOSI và đặt chân MISO của họ vào trạng thái trở kháng cao để cho người khác sử dụng.

Nếu bạn có một vi điều khiển sử dụng một số thiết bị SPI và nó có thiết bị ngoại vi SPI tích hợp, hãy gửi đầu ra CS của vi điều khiển đến bộ khử kênh (ví dụ 74HC138) và điều khiển các dòng địa chỉ để chọn thiết bị giữa các giao dịch SPI; bạn viết từ vào một thanh ghi để xếp hàng chúng cho đầu ra và đọc lại chúng sau khi chân CS được nâng lên cao.

Bởi vì tất cả các tín hiệu SPI đều là một hướng, chúng có thể được đệm, được sử dụng trên một hàng rào cách ly với các bộ cách ly kỹ thuật số và có thể được gửi từ bảng này sang bảng khác bằng trình điều khiển dòng như LVDS. Điều duy nhất bạn phải lo lắng là độ trễ lan truyền khứ hồi, điều này sẽ hạn chế tần suất tối đa của bạn.


I2C là một câu chuyện hoàn toàn khác. Mặc dù đơn giản hơn nhiều từ quan điểm đấu dây, chỉ với hai dây SCL và SDA, cả hai dòng này đều là các đường hai chiều dùng chung sử dụng các thiết bị thoát nước mở với một ống kéo bên ngoài. Có một giao thức cho I2C bắt đầu bằng cách truyền địa chỉ thiết bị, để có thể sử dụng nhiều thiết bị nếu mỗi thiết bị có địa chỉ riêng.

Từ quan điểm phần cứng, rất khó sử dụng I2C trong các hệ thống có bất kỳ tiếng ồn đáng kể nào. Để đệm hoặc cô lập các dòng I2C, bạn phải sử dụng các IC kỳ lạ - vâng, chúng tồn tại, nhưng không có nhiều: chúng tôi đã sử dụng một trên một dự án và nhận ra rằng bạn có thể sử dụng một bộ cách ly, nhưng bạn không thể sử dụng hai trong loạt - nó sử dụng các giọt điện áp nhỏ để tìm ra phía nào là kết thúc của sự vật, và hai lần giảm là hai.

Ngưỡng mức logic của I2C phụ thuộc vào Vcc, do đó bạn phải thực sự cẩn thận nếu bạn sử dụng các thiết bị 3V / 3.3V và 5V trong cùng hệ thống.

Bất kỳ tín hiệu nào sử dụng cáp nhiều hơn một hoặc hai chân đều phải lo lắng về điện dung của cáp. Điện dung 100pf / mét không phải là không bình thường đối với cáp đa dẫn. Điều này khiến bạn phải giảm tốc độ xe buýt, hoặc sử dụng điện trở pullup thấp hơn, để có thể xử lý điện dung thêm đúng cách và đáp ứng các yêu cầu về thời gian tăng.

Vì vậy, giả sử bạn có một hệ thống mà bạn nghĩ rằng bạn đã thiết kế tốt và bạn có thể xử lý hầu hết các vấn đề về tính toàn vẹn tín hiệu và tiếng ồn là rất hiếm (nhưng vẫn còn tồn tại). Bạn phải lo lắng về điều gì?

Có một loạt các điều kiện lỗi bạn phải chuẩn bị để xử lý:

  • Thiết bị nô lệ không thừa nhận một byte cụ thể. Bạn phải phát hiện điều này và dừng lại và khởi động lại chuỗi liên lạc. (Với SPI, bạn thường có thể đọc lại dữ liệu bạn gửi nếu bạn muốn đảm bảo rằng nó đã được nhận mà không gặp lỗi.)

  • Bạn đang đọc một byte dữ liệu từ một thiết bị nô lệ và thiết bị bị "thôi miên" vì tiếng ồn trên dòng đồng hồ: Bạn đã gửi 8 đồng hồ cần thiết để đọc byte đó, nhưng vì tiếng ồn, thiết bị nô lệ nghĩ rằng đã nhận được 7 đồng hồ và vẫn đang truyền 0 trên đường dữ liệu. Nếu thiết bị đã nhận được đồng hồ thứ 8, nó sẽ giải phóng dòng dữ liệu cao để chủ có thể tăng hoặc giảm dòng dữ liệu để truyền bit ACK hoặc NACK hoặc chủ có thể truyền điều kiện dừng (P). Nhưng nô lệ vẫn đang giữ dòng dữ liệu thấp, chờ đợi vô ích cho một đồng hồ khác. Nếu chủ không sẵn sàng thử thêm đồng hồ, xe buýt I2C sẽ bị kẹt trong bế tắc. Trong khi tôi đã sử dụng một số bộ vi điều khiển xử lý các điều kiện ACK / NACK bình thường,

  • Trường hợp thực sự khủng khiếp là khi một chủ nhân đang ghi dữ liệu vào một thiết bị nô lệ và một nô lệ khác diễn giải địa chỉ thiết bị không chính xác và nghĩ rằng dữ liệu được truyền có nghĩa là dành cho nó. Chúng tôi đã có các thiết bị I2C (bộ mở rộng I / O) đôi khi có các thanh ghi được đặt không chính xác vì điều này. Gần như không thể phát hiện trường hợp này và để mạnh mẽ với tiếng ồn, bạn phải định kỳ thiết lập tất cả các thanh ghi, để nếu bạn gặp phải lỗi này, ít nhất nó sẽ được khắc phục sau một khoảng thời gian ngắn. (SPI không bao giờ gặp phải vấn đề này - nếu bạn gặp trục trặc trên đường CS, nó sẽ không bao giờ tồn tại lâu và bạn sẽ không nhận được dữ liệu do thiết bị nô lệ đọc nhầm.)

Rất nhiều điều kiện trong số này có thể được xử lý đúng trong giao thức nếu có phát hiện lỗi (mã CRC), nhưng rất ít thiết bị có điều này.


Tôi thấy rằng tôi phải xây dựng phần mềm phức tạp trong thiết bị chính I2C của mình để xử lý các điều kiện này. Theo tôi, nó không đáng giá trừ khi những ràng buộc về hệ thống dây buộc chúng ta phải sử dụng I2C chứ không phải SPI.


5
Không thích tôn giáo của bạn về IIC không có chỗ ở đây. Cả IIC và SPI đều giỏi trong những gì họ làm và mỗi người đều có vị trí của mình. Hầu hết sự phản đối của bạn đối với IIC đến từ việc sử dụng nó không phù hợp. IIC chỉ nên được coi là trên tàu, mặc dù nó được sử dụng thường xuyên trong ngành cung cấp điện để kiểm soát nguồn cung cấp thông minh. Nếu bạn thấy mình muốn bộ đệm IIC, thì đó là một dấu hiệu mạnh mẽ IIC không phải là giải pháp phù hợp. Tuy nhiên, IIC hoạt động rất tốt cho tất cả các thiết bị tốc độ thấp trên cùng một bảng.
Olin Lathrop

2
Ngưỡng mức logic của I2C phụ thuộc vào Vcc, do đó bạn phải thực sự cẩn thận nếu bạn sử dụng các thiết bị 3V / 3.3V và 5V trong cùng hệ thống . Không, điều này là sai. Ngưỡng logic IIC là ở điện áp cố định. Bạn có thể kết hợp một cách tầm thường các hệ thống 5 V và 3,3 V bằng cách kéo các dòng lên chỉ 3,3 V.
Olin Lathrop

5
Đó không phải là sự không thích tôn giáo của I2C, đó là sự không thích thực tế đối với I2C. Bạn nói đúng về việc dễ dàng hơn nhiều với các hệ thống trên tàu; Tôi sẽ sử dụng nó khi nó hợp lý, nhưng nó làm tăng thêm chi phí phần mềm và quá nhiều kỹ sư phần cứng chỉ dán một thiết bị I2C lên bảng mà không thảo luận về sự đánh đổi gây ra nhiều vấn đề đau đầu về phần mềm.
Jason S

3
IIC dễ dàng hơn một chút để thực hiện bằng điện và SPI có lẽ dễ dàng hơn một chút trong phần sụn. Cả hai đều khá dễ dàng và thẳng tiến ở cả hai khía cạnh.
Olin Lathrop

2
@Olin - ngưỡng 1,5 V cố định dường như được sử dụng trong quá khứ, nhưng theo phiên bản mới nhất của ngưỡng thông số thực sự là 0,3 Vcc và 0,7 Vcc. Báo giá này từ thông số kỹ thuật đề cập đến 1,5 V cho các thiết bị cũ.
stevenvh

16

Bảng đột phá cho thiết bị tại SparkFun thực sự chỉ dành cho phiên bản I2C (MPU-6500). Phiên bản MPU-6000 có cả giao diện SPI và I2C trên cùng một con chip và tôi không thấy SparkFun có một bo mạch với con chip đó. Vì vậy, tôi tin rằng bạn bị hạn chế sử dụng I2C nếu bạn muốn sử dụng bảng cụ thể đó. Nhưng dù sao tôi cũng khuyên bạn nên sử dụng I2C trong các tình huống của bạn.

Nói chung, bạn sẽ thấy rằng bus I2C dễ sử dụng hơn từ quan điểm phần cứng so với bus SPI. I2C là xe buýt 2 dây (SCL / SDA):

SCL – Serial clock.
SDA – Serial data (bidirectional).

SPI là xe buýt 4 dây (SCLK / MOSI / MISO / CS):

SCLK– Serial clock.
MOSI – Master-out, Slave-in. Data from the CPU to the peripheral.
MISO – Master-in, Slave out. Data from the peripheral back to the CPU.
CS – Chip select.

Bạn có thể có một số thiết bị được kết nối với một bus I2C. Mỗi thiết bị có bộ địa chỉ riêng được tích hợp vào chip. Địa chỉ thực sự được phát trên bus dưới dạng byte đầu tiên của mỗi lệnh (cùng với bit đọc / ghi). Điều này, cùng với một số chi phí khác, yêu cầu nhiều bit hơn được gửi qua bus I2C so với SPI cho cùng chức năng.

Các loại thiết bị khác nhau (bộ nhớ, I / O, LCD, v.v.) có phạm vi địa chỉ khác nhau. Một số thiết bị, thường được sử dụng nhiều lần trong một hệ thống (chẳng hạn như bộ mở rộng I / O PCF8574), sử dụng một hoặc nhiều dòng địa chỉ (AD0-2 cho PCF8574) có thể được buộc cao hoặc thấp để chỉ định các bit thấp của địa chỉ. MPU-6500 có một dòng địa chỉ như vậy (AD0), vì vậy hai trong số chúng có thể được sử dụng trong cùng một hệ thống.

Bạn cũng có thể có nhiều thiết bị trên một bus SPI, nhưng mỗi thiết bị phải có dòng chọn chip (CS) riêng. Do đó, mô tả 4 dây là một chút sai lầm - nó thực sự là giao diện ba dây + một dây bổ sung cho mỗi thiết bị. Tôi không có kinh nghiệm với loạt bo mạch Arduino, nhưng tôi tin rằng điều này sẽ khiến việc sử dụng SPI trở nên khó khăn hơn trên Arduino, vì nếu bạn cần nhiều dòng chọn chip, điều này sẽ bắt đầu trở nên cồng kềnh với các phép gán pin thông thường được sử dụng bởi các lá chắn khác nhau .

Tôi tin rằng hầu hết các bảng Arduino chạy ở mức 5 volt, với một số bảng mới hơn chạy ở 3,3v. MPU-6500 chạy ở 3.3v. Nếu điện áp "cao" đầu vào tối thiểu cho bus I2C trên CPU 5v là 3v trở xuống, bạn có thể tránh các sự cố chuyển đổi cấp bằng cách chỉ cung cấp điện trở kéo 10K đến 3,3v trên các đường SCL và SDA, vì bus đang mở người sưu tầm. Đảm bảo rằng bất kỳ pullup nội bộ 5v nào trên CPU đều bị tắt.

Tuy nhiên, tôi đã kiểm tra biểu dữ liệu cho ATmega2560 (sử dụng Arduino ADK 5v làm ví dụ) và điện áp 'cao "đầu vào tối thiểu của nó là 0,7 * Vcc, hoặc 3,5v lớn hơn 3,3v. Vì vậy, bạn cần một số mức hoạt động TI PCA9306 , yêu cầu điện trở pullups ở cả hai mặt 5v và 3,3v của chip, chỉ tốn 78 cent với số lượng duy nhất.

Tại sao sau đó chọn SPI trên I2C? Chủ yếu là vì SPI có thể chạy nhanh hơn nhiều - lên đến nhiều 10 MHz trong một số trường hợp. I2C thường được giới hạn ở 400 KHz. Nhưng đây không thực sự là vấn đề đối với gia tốc kế MPU-6050/6000, vì nó chạy ở tốc độ 400 KHz đối với I2C và chỉ 1 MHz đối với SPI - không có nhiều khác biệt.


3
Một lý do khác để chọn SPI trên I2C: Tất cả các dòng là đơn hướng, điều này làm cho mọi thứ như bộ chuyển cấp dễ dàng hơn một chút.
đánh dấu

3
I2C dễ hơn SPI?! Điều duy nhất về I2C dễ dàng hơn là khả năng kết nối nếu bạn có thể kết nối mọi thứ lại với nhau. Mặt khác, tính toàn vẹn tín hiệu khó hơn trong I2C và việc triển khai phần mềm mạnh mẽ khó hơn trong I2C.
Jason S

2
@JasonS, tôi đã hoàn thành hàng tá dự án phần mềm nhúng bằng I2C và chưa bao giờ gặp phải sự cố khóa mà bạn đề cập trong bài đăng của mình. Tôi có thể hiểu bạn không thích nó do kinh nghiệm xấu của bạn. Tôi hiện đang có một sản phẩm trên thị trường bằng cách sử dụng I2C DAC để phát âm thanh, đồng thời đọc bộ đệm dữ liệu tiếp theo của thẻ SD qua SPI. Công trình tuyệt vời. Tôi không thể sử dụng SPI cho cả thẻ DAC và thẻ SD vì tôi đã bị tranh chấp xe buýt và âm thanh bị vỡ. Micro (một cấp thấp) chỉ có một SPI và một cổng I2C.
tcrosley

1
Tôi rất ấn tượng rằng bạn có thể xuất âm thanh sang I2C DAC! (tốc độ xung nhịp tối đa là bao nhiêu?) Nếu bạn đang sử dụng IC trên bo mạch với thời gian ngắn, xác suất chạy vào bị khóa là rất nhỏ, nhưng nó vẫn tồn tại. (Ngoài ra, bạn sẽ không bao giờ gặp phải nó nếu bạn chỉ ghi dữ liệu vào I2C. Nó yêu cầu bạn phải đọc từ một thiết bị sẵn sàng chờ đợi mãi mãi cho những gì nó nghĩ là đồng hồ bị thiếu / thêm.)
Jason S

1
@JasonS, âm thanh chỉ có chất lượng âm thanh, 8KHz - Tôi đang sử dụng ngắt 128 us để xuất ra mỗi mẫu 16 bit. I2C cũng chạy trên ngắt riêng của nó. Thời gian rảnh được sử dụng để đọc dữ liệu của thẻ SD. Điểm tốt về khóa máy không bao giờ xảy ra trên văn bản. Ngoại trừ ADC, tôi thường sử dụng I2C cho các thiết bị đầu ra. Tuy nhiên - bạn có biết giao diện chỉ đọc (2 nút, gia tốc kế và cần điều khiển) giữa điều khiển từ xa Wii và Wii Nunchuck (trên cáp 3 ') là I2C ở mức 400 KHz không? Rất nhiều thông tin trên web đang hack giao diện thiết bị này.
tcrosley

15

Nói chung, SPI là một bus nhanh hơn - tần số xung nhịp có thể nằm trong phạm vi MHz. Tuy nhiên, SPI yêu cầu ít nhất 3 dòng để liên lạc hai chiều và chọn thêm nô lệ cho mỗi thiết bị trên xe buýt.

I2C chỉ yêu cầu 2 dòng, bất kể bạn có bao nhiêu thiết bị (trong giới hạn, tất nhiên). Tuy nhiên, tốc độ nằm trong phạm vi kHz (100-400kHz là điển hình).

Hầu hết các bộ vi điều khiển, ngày nay, có hỗ trợ phần cứng cho cả hai xe buýt, vì vậy cả hai đều đơn giản như nhau để sử dụng.


4
@Jason: Bạn dường như có một số thành kiến ​​chống lại IIC, nhưng thật không công bằng khi lừa người khác vì điều đó. Cả IIC và SPI đều "dễ dàng", mỗi loại có nếp nhăn riêng. SPI cần thêm dòng, có thể không dễ dàng. IIC phức tạp hơn một chút, nhưng vẫn dễ dàng thực hiện tất cả các cài đặt phần sụn, điều mà tôi đã thực hiện có thể nhiều lần. Nó không mất nhiều mã như vậy. Cả hai đều có vị trí của mình và cả hai đều đủ dễ dàng để điều đó không phải là một yếu tố cho bất cứ ai biết những gì họ đang làm.
Olin Lathrop

5
@Jason: Tôi mới kiểm tra và mã IIC chung của tôi để triển khai phần mềm IIC trên PIC 8 bit chỉ có 311 dòng và có lẽ hơn một nửa số đó là nhận xét. Điều đó giúp bạn có một giao diện thủ tục cho xe buýt IIC ở mức độ thường xuyên để bắt đầu, đặt, nhận, dừng, v.v. Thỏa thuận lớn. Một mô-đun gọi để điều khiển EEPROM đơn giản là 272 dòng, có thể có 1/2 nhận xét và bao gồm một số quản lý cấp cao như dữ liệu mặc định, giao diện gỡ lỗi UART, v.v ... Điều này hoàn toàn không đáng để tranh luận liệu có mất 10 lệnh không hơn SPI là vô nghĩa.
Olin Lathrop

2
@Andrew Kohlsmith - I2C is designed for on-board applications.- Rõ ràng các nhà sản xuất thiết bị I2C không đồng ý với bạn. Lấy TMP100 . Trang sản phẩm nêu rõ: The TMP100 and TMP101 are ideal for extended temperature measurement in a variety of communication, computer, consumer, environmental, industrial, and instrumentation applications.Điều tương tự cũng đúng với TMP75
Connor Wolf

5
@FakeName Bạn không chính xác; Tôi đã dành 13 năm làm điện tử công nghiệp. (bắt đầu và giám sát các máy phát ba pha LỚN là môi trường ồn ào RẤT NHIỀU) Không phải SPI đáng tin cậy hơn, mà là thiết kế hệ thống với tất cả các chế độ thất bại được lên kế hoạch và tính toán, và có các tùy chọn khôi phục được tích hợp trong hệ thống khi cần. Tôi chưa bao giờ, đã từng có một sự đột biến tiếng ồn giết chết I2C (hoặc SPI cho vấn đề đó), nhưng tôi cũng không bao giờ chỉ dựa vào bộ điều khiển I2C để làm mọi thứ cho tôi. Đó là vấn đề lập kế hoạch và thiết kế, không phải là một chiếc xe buýt sẽ tốt hơn.
akohlsmith

2
@akohlsmith: I2C đơn chủ nô lệ phải mạnh mẽ với chủ "bit-bang". Nếu có nhiều nô lệ và hai đồng thời bị "nhầm lẫn" theo các cách khác nhau, xe buýt có thể bị khóa không thể phục hồi (ví dụ: nếu hai hoặc nhiều chip bộ nhớ chứa đầy số 0 đều nghĩ rằng chủ nhân đang cố đọc chúng, nhưng bộ đếm bit của chúng không đồng bộ, sau đó mỗi người sẽ chỉ giải phóng SDA trong suốt thời gian mà người kia đang khẳng định nó, và không có gì chủ nhân có thể làm để giải phóng xe buýt trừ khi nó có thể lái một "cao" đủ mạnh để vượt qua mọi nô lệ.
supercat

12

SPI có thể chạy nhanh hơn nhiều so với I2C (một số thiết bị SPI vượt quá 60 MHz; tôi không biết thông số I2C "chính thức" có cho phép các thiết bị trên 1 MHz không). Việc thực hiện một thiết bị nô lệ bằng cách sử dụng một trong hai giao thức yêu cầu hỗ trợ phần cứng, trong khi cả hai đều cho phép thực hiện dễ dàng các bậc thầy "phần mềm bit-bang". Với phần cứng tương đối tối thiểu, người ta có thể xây dựng một nô lệ tuân thủ I2C, nó sẽ hoạt động chính xác ngay cả khi chủ nhà có thể tự ý quyết định bỏ qua xe buýt lên đến 500us một lần, mà không cần thêm dây bắt tay. Tuy nhiên, hoạt động SPI đáng tin cậy, ngay cả với hỗ trợ phần cứng , thường yêu cầu một trong hai thêm dây bắt tay hoặc nếu không thì máy chủ "thủ công" thêm độ trễ sau mỗi byte bằng thời gian phản hồi trong trường hợp xấu nhất của nô lệ.

Nếu tôi có máy khoan, bộ phận hỗ trợ SPI của bộ điều khiển sẽ chứa một vài tính năng bổ sung đơn giản để cung cấp truyền dữ liệu hai chiều trong suốt 8 bit giữa các bộ điều khiển với khả năng bắt tay và đánh thức, sử dụng tổng cộng ba dây đơn hướng (Đồng hồ và MOSI [chính -out-Slave-in] từ chủ; MISO [master-in-Slave-out] từ nô lệ). Khi so sánh, giao tiếp hiệu quả và đáng tin cậy giữa các bộ vi điều khiển với cổng SPI "stock", khi cả hai bộ xử lý có thể bị trì hoãn một cách độc lập trong khoảng thời gian tùy ý, yêu cầu sử dụng nhiều dây hơn (Chip-Chọn, Đồng hồ, MISO và MOSI để bắt đầu với, cộng với một số loại dây xác nhận từ nô lệ. Nếu nô lệ có thể bắt đầu gửi dữ liệu một cách không đồng bộ (ví dụ: vì ai đó đã nhấn nút), thì người ta phải sử dụng một dây khác làm "đánh thức"

I2C không cung cấp tất cả các khả năng mà SPI "cải tiến" của tôi sẽ có, nhưng nó cung cấp các khả năng bắt tay tích hợp mà SPI thiếu, và trong nhiều triển khai, nó cũng có thể bị loại bỏ để cung cấp thức tỉnh, ngay cả khi chủ nhân là phần mềm bit-bang. Do đó, đối với giao tiếp giữa các bộ xử lý, tôi rất khuyến nghị I2C qua SPI trừ khi cần tốc độ cao hơn SPI có thể cung cấp và việc sử dụng các chân phụ là chấp nhận được. Đối với thông tin liên lạc giữa các bộ xử lý, nơi cần số lượng pin thấp, UART có rất nhiều thứ để giới thiệu chúng.


Có phiên bản I2C tốc độ cao cho phép 1 MHz; I2C bình thường là 400kHz.
Kháng chiến

@TheResistance: Tôi biết rằng I2C bình thường là 400kHz, nhưng các phiên bản được chỉ định lên tới 1 MHz. Những gì tôi không biết là liệu các phiên bản nhanh hơn đã được chỉ định.
supercat

Theo thông số kỹ thuật 400kbps (không phải kHz, tôi đã sử dụng sai đơn vị ở đó) là Chế độ nhanh, 1Mb / giây là Chế độ nhanh Plus và có chế độ Tốc độ cao lên tới 3,4Mb / giây. Siêu nhanh lên tới 5Mb / giây, nhưng là một hướng.
Kháng chiến

@TheResistance: Cảm ơn. Tôi đã không nghe nói về những phiên bản sau này. Chính xác thì ý của bạn là 'đơn hướng' là gì? Tôi biết rằng tốc độ giao tiếp giữa chủ và nô lệ SPI có thể tăng nhanh hơn so với chủ nô vì nô lệ được đảm bảo có được đồng hồ sau chủ, nhưng tôi không chắc về khái niệm tương đương cho I2C. Có một liên kết?
supercat

Tìm thông số kỹ thuật ở đây . Trên trang 23 có ghi rằng Ultra-fast có thể được sử dụng cho các thiết bị không gửi lại dữ liệu (chỉ ghi), thậm chí không phải ACK.
Kháng chiến

8

Câu hỏi này đã được khám phá kỹ lưỡng trong các câu trả lời xuất sắc ở đây, nhưng có lẽ có thêm một quan điểm đối với I 2 C tôi có thể đưa ra từ quan điểm của một nhà sản xuất chip.

Giao diện điện của I 2 C là một bộ sưu tập mở . Bây giờ thở và nghĩ về những tác động. Sử dụng I 2 C, tôi có thể thiết kế một con chip hoàn toàn không tin tưởng vào điện áp hoạt động của xe buýt. Tất cả những gì tôi cần có thể làm là kéo dòng SDA xuống thấp nếu nó làm tôi hài lòng, và so sánh điện áp của SCL và SDA với một số điện áp ngưỡng tham chiếu mặt đất mà tôi có thể chọn. Và nếu tôi loại bỏ các cấu trúc bảo vệ phía cao thông thường và thay thế chúng bằng các cấu trúc khác, tôi có thể tạo ra một con chip hoàn toàn có thể sống cuộc sống riêng của nó từ phần còn lại của hệ thống - SCL, SDA không bao giờ cung cấp bất kỳ dòng điện nào cho chip của tôi và tôi chắc chắn sẽ không cung cấp bất kỳ hiện tại cho các chân. Đó là lý do tại sao nó là một chiếc xe buýt tốt cho đồng hồ thời gian thực và những thứ năng lượng thấp khác như thế.


4

Một điều tôi chưa từng thấy được đề cập trong các câu trả lời khác là I2C hỗ trợ nhiều chủ trên cùng một xe buýt. Nếu bạn cần giao tiếp hai chiều và không muốn sử dụng phương pháp bỏ phiếu, I2C sẽ hoàn thành công việc.

Trong khoảng cách xa hơn, CAN có khả năng tương tự và mạnh mẽ hơn. Nhưng CAN là một giao thức không đồng bộ đòi hỏi hỗ trợ phần cứng và thu phát, vì vậy nó có thể không phải là một lựa chọn trong một hệ thống chi phí thấp.


Điểm hay (trên đa chủ), tôi cũng đã thấy các thiết bị SPI có chân ngắt, trong khi một thiết bị vẫn là chủ, cả hai đều có thể khởi tạo giao tiếp (hai chiều). Đối với các thiết bị từ xa ở đó, tất nhiên là có nhiều tùy chọn chắc chắn hơn và tốt hơn (như CAN).
Paul

0

Sử dụng giao thức SPI và ghi bit của bạn trực tiếp vào thiết bị bất cứ khi nào đồng hồ đồng bộ tăng. Mạch logic xnor có thể được sử dụng để khớp với địa chỉ "tự chế" từ bộ nhớ để chọn thiết bị mong muốn như thể đó là thiết bị i2c.

I2c đang tích hợp mạch có thẩm quyền bên trong định dạng của thiết bị, tiêu chuẩn ... vv rất phức tạp và khác biệt, với một spi bạn có thể sử dụng bộ nhớ spi để hiển thị video trên màn hình, nhưng không phải i2c.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.