SPI hoặc I2C: sử dụng cho xe buýt dài


36

Tôi đang dự tính một dự án sẽ yêu cầu một số AVR nói chuyện với nhau qua xe buýt. Họ sẽ cách nhau tối đa 6 feet.

Có vẻ như cả I2C và SPI đều có thể cho phép một loạt các micrô giao tiếp qua xe buýt, nhưng tôi chưa thấy bất cứ điều gì nói về việc đó sẽ kéo dài bao lâu. Có ai đã thử kết nối các giao thức này trong khoảng cách vài feet chưa?


Tôi đã chạy xe buýt I2C qua cáp trong một lần. Nhìn chung, tôi nên sử dụng CAN hoặc RS-485 thay thế (có vi điều khiển ở cả hai đầu).
Nick Alexeev

Câu trả lời:


19

Như những người khác đã nói, SPI và I2C có thể được sử dụng trên một khoảng cách dài miễn là các điện trở kéo lên, tần số xung nhịp, v.v.

Các lựa chọn thay thế chính (sẽ cho khả năng chống ồn tốt hơn) là RS485CAN . Cả hai đều sử dụng các dòng vi sai để giảm thiểu các vấn đề nhiễu và phù hợp hơn với thời lượng truyền dữ liệu này so với I2C hoặc SPI. Tuy nhiên, tôi không nghĩ rằng nhiều (bất kỳ?) AVR đi kèm với các thiết bị ngoại vi CAN tích hợp, giúp CAN sử dụng dễ dàng hơn nhiều.

Tôi sẽ nói rằng điều quan trọng nhất cần xem xét khi chọn xe buýt là đảm bảo rằng giao thức bạn sử dụng để liên lạc giữa các thiết bị bao gồm CRC hoặc tương đương để bạn có thể xác định liệu tin nhắn đã được nhận chính xác chưa (CÓ THỂ là một phần của cái túi). Xem xét điều này, cũng rất hữu ích khi có phản hồi loại ACK / NACK như một phần của giao thức để thông điệp bị hỏng có thể được truyền lại.


Có vẻ như một trong hai sẽ làm việc. Tôi chủ yếu nghĩ về hai giao thức cụ thể này bởi vì hầu hết các AVR hỗ trợ chúng một cách tự nhiên, mà không cần thêm các thành phần bổ sung. Nếu không, RS485 hoặc CAN sẽ là một lựa chọn tốt.
edebill

Nếu bạn không bị hạn chế đối với các gói thông qua lỗ, thì ST có bộ vi điều khiển STM32 và STM8 mạnh mẽ và hiệu quả về chi phí với CAN, NXP có một loạt vi điều khiển LPC17xx và cũng có một vài loại khác. CAN đang ngày càng trở nên phổ biến (và giá cả phải chăng) trên rất nhiều bộ vi điều khiển.
DrAl

1
Thực sự có một số máy AVR có bộ thu CAN được tích hợp, nhưng cũng giống như các nhà cung cấp khác, nó chỉ nằm trong một tập hợp con giới hạn của chip.
davr

1
Microchip có một vài PIC có CAN. microchip.com/wwwproducts/Devices.aspx?dDocName=en010302 . Mặc dù vậy, tôi sẽ thừa nhận rằng chúng hơi "sôi nổi" đối với chương trình, đặc biệt là trong các thư viện C18 / C30 của Microchip. Khi xem xét mã, chúng tôi đã quan sát thấy một số mã thư viện rất khó đọc do các chi tiết triển khai - bộ đệm truyền được sử dụng làm bộ đệm nhận, các tên cờ thực sự trái ngược với những gì chúng đại diện. Chắc chắn không phải là thứ tôi muốn giới thiệu cho ai đó mới phát triển vi điều khiển.
J. Polfer

2
CAN và RS-485 thực sự là táo và cam. CAN định nghĩa giao thức cấp bit cũng như lớp điện vật lý (PHY). RS-485 chỉ là một đặc điểm kỹ thuật của lớp vật lý, nó chỉ định không có gì về giao thức. Bạn hoàn toàn có thể tìm thấy hoặc triển khai một giao thức thực tế trên RS-485 PHY. CAN được thiết kế cho môi trường tiếng ồn cao, chủ yếu được sử dụng trong ngành công nghiệp ô tô và sản xuất. Giao thức của nó là một hệ thống truyền tin nhắn khá phức tạp và có chi phí rất cao (tốc độ dữ liệu thực tế thấp) nhưng có tính toàn vẹn dữ liệu cao.
Đánh dấu

10

Một số bàn chân không nên có vấn đề, chỉ cần sử dụng dây xoắn nếu bạn có thể. SPI dễ đệm hơn (nếu bạn cần) so với I2C vì các tín hiệu SPI đều là đơn hướng, trong khi tín hiệu của I2C nằm trên các đường chia sẻ.

các bộ vi điều khiển AVR có thể xử lý các chế độ nô lệ I2C và SPI cũng như các chế độ chủ không? (bạn cần cả hai)


2
dây xoắn ?? KHÔNG BAO GIỜ xoắn dữ liệu I2C và dòng đồng hồ! Với SPI, đây có lẽ là một vấn đề ít hơn, nhưng tôi sẽ không bao giờ xoắn các đường tín hiệu trừ khi nó là một cặp cân bằng, trong trường hợp xoắn là một ý tưởng rất tốt.
Wouter van Ooijen

không bao giờ nói không bao giờ; Tôi sẽ thực hiện khớp nối điện dung nhỏ (vì vặn) giữa dữ liệu + đồng hồ bất kỳ ngày nào thay vì khớp nối cảm ứng nhỏ với điện tử công suất ồn (vì không xoắn)
Jason S

4
Xin lỗi, tôi chắc chắn không đồng ý. Ở trạng thái 1, các dòng có trở kháng khá cao. Nhìn thấy nó xong, thấy nó thất bại. Tùy chọn tốt nhất là có các đường mặt đất thấp giữa hoặc thậm chí tốt hơn ở cả hai phía của các đường I2C.
Wouter van Ooijen

10

Đối với I2C trên một khoảng cách xa, bạn có thể muốn tìm hiểu một số giải pháp "lặp lại bus I2C". Hãy nhớ rằng bất kỳ khoảng cách tối đa nào bạn có thể tìm thấy cho giao tiếp I2C hoặc SPI chủ yếu đề cập đến tổng khoảng cách xe buýt chứ không phải khoảng cách giữa hai nút trong xe buýt.

Bạn có thể muốn xem xét RS485 cho các loại vấn đề này. Đó là một giao thức bus nối tiếp giao tiếp qua các dòng vi sai, vì vậy khi sử dụng dây xoắn, khả năng nhiễu sẽ được giảm thiểu. Khoảng cách rất dài có thể đạt được theo cách này. Nhược điểm là bạn sẽ cần thêm một IC mã hóa RS485 (như MAX485, không đắt lắm) trong mạch của bạn.


RS485 chắc chắn là một cách tốt để đi cho một điều như vậy.
Scott Murphy

Hãy nhớ rằng RS485 có hai khía cạnh khác với RS232 có phần độc lập: các mức logic vi sai vật lý và khía cạnh multimaster. Bạn có thể chọn + chọn những thứ này, chúng tôi đã sử dụng cả hai bộ dịch LVDS và RS485 với UART (RS232) để chuyển từ điểm sang điểm vào các phần đa hướng của RS485.
Jason S

2
btw RS485 không phải là một giao thức! nó chỉ định nghĩa lớp vật lý. Phải nói rằng, bạn chắc chắn có thể sử dụng SPI trên RS485 !!! Nó sẽ là một giải pháp gọn gàng để giữ thông tin liên lạc ở chế độ SPI nếu cần (tôi giả sử nó có thể được kết nối với một ADC từ xa hoặc tương tự). Sử dụng SPI trên RS485, bạn sẽ cần kiểm tra tốc độ quay của bộ thu phát tương thích với các cơ sở dữ liệu SPI được đề xuất
smashtastic

8

Một lợi thế chưa được đề cập của SPI so với I2C là tất cả các dây SPI đều đơn hướng và luôn được điều khiển cao hoặc thấp. Điều này cho phép giao tiếp nhanh hơn nhiều so với I2C, giảm tính nhạy cảm với tiếng ồn và cho phép các cổng đơn giản được sử dụng làm bộ lặp. Một tùy chọn hữu ích khác là giao tiếp không đồng bộ đơn giản (mỗi dây một hướng). Nhược điểm duy nhất tôi có thể thấy đối với giao tiếp không đồng bộ là nó thường yêu cầu cả hai bên phải "tỉnh táo", với đồng hồ ổn định, để trao đổi dữ liệu.

Đối với một dự án của riêng tôi, tôi đã sử dụng giao thức SPI được sửa đổi một chút 3 dây và đã tìm thấy kết quả khả quan. Tôi gửi dữ liệu bitmap hiển thị (trong đó thỉnh thoảng hỏng dữ liệu sẽ không phải là vấn đề lớn) ở tốc độ 10mbps và dữ liệu khác ở tốc độ 2,5mbps mà không gặp khó khăn.


Đây là một câu trả lời rất cũ, nhưng bạn sẽ nói về khoảng cách bạn đã gửi giao thức SPI đã sửa đổi của bạn? (Đó là điểm của câu hỏi ...)
Daniel Griscom

@DanielGriscom: Thông thường khoảng 3 feet, trên cáp không ấn tượng lắm, nhưng đôi khi dài hơn.
supercat

6

Mặc dù cả I2C và SPI đều được thiết kế cho các chuyến đi ngắn (một vài inch), cả hai đều có thể được sử dụng trên các chuyến đi dài hơn với cáp thích hợp và chú ý đến điện dung của xe buýt nói chung.

Mặc dù tôi có ít kinh nghiệm với SPI, I2C không quá khó khăn khi bạn luôn cần tính toán kích thước phù hợp cho điện trở kéo lên của mình. Ngoài ra, có bộ đệm I2C chuyên dụng và rẻ tiền khá dễ sử dụng. Tuy nhiên, bạn vẫn sẽ phải sử dụng điện trở kéo lên có kích thước phù hợp cho mạng của mình.

Tôi đã sử dụng I2C để kết nối mạng giữa hai AVR ở khoảng cách 8 feet, chỉ sử dụng điện trở kéo lên và cáp xoắn chất lượng cao, được bảo vệ tốt.


bạn phải coi chừng w / I2C bằng cáp đa dẫn, điện dung có thể khiến bus chậm lại đáng kể.
Jason S

6

Như nhiều người đã đề xuất, I2C và SPI được sử dụng tốt nhất cho khoảng cách ngắn. Mặc dù có thể triển khai một giải pháp với các giao diện này, nhưng tôi thực sự khuyên bạn nên tìm một giải pháp khác, "chuẩn hơn" (ví dụ: Ethernet, RS485, CAN, v.v.). - Đặc biệt nếu bạn dự định sử dụng dây cáp để đạt khoảng cách 6ft giữa các bộ vi điều khiển.


6

Chỉ là một FYI, giao diện giữa điều khiển từ xa Nintendo Wii không dây và người bạn đồng hành Nunchuck của nó sử dụng I2C qua cáp dài khoảng 3 feet. Ngoài ra còn có cáp mở rộng 3 feet kéo dài tổng chiều dài lên khoảng 6 feet. Không hoàn toàn giống với thiết lập của bạn (chỉ có hai thiết bị được kết nối với nhau), nhưng đó là một ví dụ về I2C qua cáp trong một sản phẩm tiêu dùng được sử dụng rộng rãi.


4

Tôi đã làm việc trong một dự án liên quan đến khoảng 80 nút dựa trên AVR trong mạng sao giao tiếp qua I2C. Đó là một mớ hỗn độn và cuối cùng không hoạt động. Nhận cập nhật cho tất cả các nút mất vài giây và một kết nối bị lỗi sẽ phá hủy toàn bộ mạng. Lần cuối tôi nói chuyện với anh chàng đã tạo ra các nút, anh ta nói rằng anh ta đã ngừng sử dụng I2C cho các dự án như thế này. Thật không may, tôi không biết tại sao cụ thể I2C không đầy đủ ở đây.


1
I2C chậm hơn nhiều so với SPI ... cũng có thể là do dự án của bạn quản lý trọng tài trong trường hợp va chạm ... hoặc điện dung có thể đủ cao với tất cả các nút mà bạn chỉ phải sử dụng tốc độ xung nhịp chậm.
Jason S

2

Nó sẽ dễ dàng với khoảng cách ngắn. Những gì bạn có thể làm là tìm ra những khoảng cách đó và hệ thống cáp của bạn có ý nghĩa gì về điện dung và trở kháng đường dây và xem loại tần số nào (thời gian tăng / giảm) bạn có thể vượt qua chúng. Ngoài một số điểm nhất định, tốt nhất nên coi chúng là đường truyền. Nếu nó trông tệ, bạn thực sự có thể chuyển sang một số dòng nối tiếp khác như EIA-232 hoặc 422. Điều đó có thể có nghĩa là một con chip phụ ở cả hai đầu nhưng sẽ kéo dài ra xa. Nếu bạn thực sự cần phải đi nhanh và xa, bạn sẽ cần một cái gì đó nhiều hơn (ethernet, đừng bỏ qua radio hoặc laser :).


2

Nếu bạn có thể kiểm soát tốc độ đồng hồ và bạn không cần truyền dữ liệu tốc độ cao, bạn nên cố gắng làm chậm đồng hồ. Điều này sẽ làm cho nó ít bị ảnh hưởng bởi tiếng ồn.

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.