Làm thế nào để giải quyết xung đột địa chỉ I2C?


39

Tôi muốn kết nối nhiều thiết bị nô lệ I2C với một bộ điều khiển vi mô trên cùng một bộ chân nhưng tất cả các thiết bị I2C đều có chung một địa chỉ. Các địa chỉ được cố định trong phần cứng.

Có cách nào để kết nối nhiều thiết bị có cùng địa chỉ không?

Có lẽ một số loại mô-đun dịch địa chỉ I2C với mỗi thiết bị có địa chỉ có thể định cấu hình để tôi có thể gán địa chỉ của riêng mình cho từng thiết bị.

Câu trả lời:


24

Không có gì được tích hợp trong I2C để làm điều này, thông thường các thiết bị nô lệ sẽ có một số chân ngoài có thể được đặt thành 0 hoặc 1 để chuyển một vài bit địa chỉ để tránh vấn đề này. Ngoài ra, tôi đã giao dịch với một vài nhà sản xuất có số 4 hoặc 5 phần cho một phần, sự khác biệt duy nhất là địa chỉ I2C của nó.

Hầu hết các thiết bị đều có phần cứng cụ thể xử lý giao tiếp I2C, đó là ACK nô lệ nằm trong phần cứng nên bạn thực sự không thể hack xung quanh nó.

Đối với mô-đun dịch thuật, bạn có thể mua một số PIC $ 0,5 với 2 bus I2C và viết một số mã nhanh để làm cho chúng hoạt động như các dịch giả địa chỉ mà tôi đoán.


Cảm ơn. Vâng, các thiết bị này có một địa chỉ được chọn, nhưng chỉ giữa hai địa chỉ và tôi muốn kết nối hơn 5 thiết bị, vì vậy tôi vẫn kết thúc bằng các cuộc đụng độ. Tôi đã không nghĩ đến việc sử dụng PIC. Cần làm việc. Không có gì ngoài kệ mà loại điều này?
Simon P Stevens

11
NXP tạo ra một loạt các bộ ghép kênh / công tắc cho I2C, bạn có thể xử lý một số thứ khác: ics.nxp.com/products/i2cmuxes, ví dụ bạn có thể tạo trong 3 nhánh phụ của mình, mỗi nhánh có 2 thiết bị và sử dụng một trong các công tắc của NXP để đạt được mục tiêu của bạn.
Đánh dấu

Tuyệt, đó chính xác là thứ mà tôi đang tìm kiếm. Tôi chỉ không biết tên. Cảm ơn.
Simon P Stevens

Câu trả lời này là 7 tuổi, vì vậy tôi tin rằng nó có thể là tốt nhất tại thời điểm nó được cung cấp. Tuy nhiên, đối với những người khác đến bây giờ, một số câu trả lời mới hơn (hiện được xếp hạng thấp hơn trong danh sách) cung cấp các cách tiếp cận tốt hơn dựa trên các thành phần mới hơn hiện có trên thị trường.
Gạch

6

Tôi vừa gặp vấn đề này với nhiều thiết bị I2C có địa chỉ cố định. Giải pháp của chúng tôi là sử dụng các dòng I / O trên vi điều khiển để buộc các dòng SDA ở mức cao trên các thiết bị mà chúng tôi không muốn xử lý, trong khi dòng I / O cho thiết bị mà chúng tôi nhắm đến được đặt làm đầu vào (trở kháng cao ). Điều này có nghĩa là chỉ thiết bị được nhắm mục tiêu phù hợp với địa chỉ I2C và các thiết bị khác bỏ qua mọi dữ liệu tiếp theo.

Nhiều thiết bị I2C có cùng địa chỉ

Các điện trở trên đường SDA cho các thiết bị không hoạt động cuối cùng đóng vai trò là lực kéo cho xe buýt, vì vậy giá trị chính xác sẽ phụ thuộc vào số lượng thiết bị bạn có và loại xe bạn cần cho xe buýt. Vì vậy, nếu bạn chọn điện trở 10K, thì 3 thiết bị không hoạt động sẽ cung cấp cho pullup 3K3.

Các điốt schottky đảm bảo rằng thiết bị vẫn có thể kéo dòng SDA đủ thấp khi truyền dữ liệu trở lại máy chủ.


Tôi đánh giá cao rằng bạn đã theo dõi và đăng này. Đây là một giải pháp khá khéo léo, tôi chắc chắn nó sẽ hữu ích cho người khác.
Simon P Stevens

Một thích hợp tốt có thể được sử dụng trên một số ứng dụng. Tôi rất thích nó.
Harry Svensson

5

Nếu không có thiết bị I2C nào sử dụng kéo dài đồng hồ (bắt tay) và nếu bạn đang đập mạnh vào bản gốc I2C, một cách đơn giản là có một số thiết bị trao đổi đồng hồ và chân dữ liệu. Trong quá trình truyền byte, thiết bị có đồng hồ và chân dữ liệu được hoán đổi sẽ thấy mỗi bit "0" là một sự kiện (dữ liệu tăng và giảm không có đồng hồ) và sẽ thấy mỗi bit "1" là điểm dừng I2C và bắt đầu (đồng hồ tăng trong khi dữ liệu thấp, giảm do dữ liệu tăng và giảm, sau đó là đồng hồ giảm). Các điều kiện dừng và khởi động có chủ ý cho một thiết bị có thể được xem là các bit dữ liệu, nhưng trừ khi một thiết bị có quá nhiều điều kiện khởi động và dừng giữa các bit "1", không có khả năng bất kỳ thiết bị nào sẽ "vô tình"


6
Tôi không hạ thấp, nhưng điều này có vẻ hơi rủi ro với tôi. Trải nghiệm của tôi với I2C là nó đủ tiếng ồn chỉ với kết nối thông thường. Tuy nhiên, bạn sử dụng từ "hack" và đề cập đến cảnh báo "nếu không có thiết bị i2c nào sử dụng đồng hồ kéo dài", vì vậy nếu nó có thể hoạt động cho ai đó, thì hãy cung cấp thêm năng lượng cho họ.
Jason S

5

Tôi sẽ xem xét sử dụng các bộ chuyển mạch xe buýt để ghép kênh I2C giữa các thiết bị có địa chỉ xung đột. Công tắc bus có điện dung và điện trở rất thấp, và không giống như bộ đệm / trình điều khiển, chúng là công tắc thực sự kết nối hoặc ngắt kết nối hai nút mạch.

Công tắc xe buýt thường có một đặc điểm kỳ lạ, điều đó không quan trọng đối với I2C vì nó sử dụng các thiết bị thoát nước mở: công tắc xe buýt có điện trở thấp khi buộc các điện áp gần 0 (Vss), nhưng điện trở tăng lên đáng kể khi tiếp cận điện áp cung cấp điện Vdd. (Điều này là do về cơ bản chúng là các MOSFET có điện áp cổng tại nguồn điện khi chúng bật, do đó, khi điện áp chuyển đổi tiếp cận Vdd, VSS có sẵn thấp hơn nhiều)


1
Liên kết bị hỏng. fairchildsemi.com/product-t Technology / bus-switches hoạt động tốt hơn.
florisla

4

Tôi có hai cảm biến ánh sáng màu TCS3414 mà tôi muốn so sánh (Gói FN và CS, có các bộ lọc khác nhau). Địa chỉ I2C là cứng. Sau khi xem cách I2C hoạt động theo các dòng SCL (đồng hồ) và SDA (dữ liệu), có vẻ như việc tắt dòng SDA sẽ ngăn chip bắt đầu hoặc dừng bit và do đó khiến nó không hoạt động. Vì vậy, đã sử dụng một công tắc tương tự CMOS (4066B) để bật hoặc tắt dòng SDA cho từng thiết bị. Điều này chỉ hoạt động tốt để chuyển đổi giữa hai thiết bị. Tôi biết đó là một bản hack và PCA9548 sẽ tốt hơn nhiều, nhưng tôi không có một tiện ích nào.


Trên thực tế, đây hoàn toàn không phải là một hack và tôi cho rằng đây sẽ là câu trả lời được chấp nhận. Tôi đã thấy điều này được sử dụng trong một số sản phẩm thương mại và tôi không thể nghĩ ra giải pháp nào tốt hơn (trừ khi bạn không có GPIO và do đó cần một giải pháp I2C thuần túy như các mux dành riêng cho I2C). Các mux tương tự tốt của ol có nhiều băng thông và có giá rẻ.
Jay Carlson

4

Hiện tại đã có câu trả lời- Công nghệ tuyến tính có loạt dịch giả địa chỉ LTC4316 / 17/18. Họ là tương đối mới, và có sẵn là không chắc chắn.


Thành phần rất thú vị. Hầu hết các thiết bị I2C có 2 địa chỉ cố định và LTC4316 này có thể có khả năng nhân đôi địa chỉ với chi phí hợp lý.
Mehrad

4

Một số nhà sản xuất cung cấp IC ghép kênh I2C và chuyển đổi IC.

Một mux có thể kích hoạt một kênh tại một thời điểm; một công tắc có thể cho phép nhiều cái song song.

Kiểm tra ví dụ các dịch vụ của NXP , TIMaxim .

Để thử nghiệm, Adaf Berry có một bảng TCA9548a .

Nếu bạn có 8 chip mục tiêu có địa chỉ giống hệt nhau, hãy chọn MUX 8-to-one. Trước khi truy cập bất kỳ chip mục tiêu nào, hãy định cấu hình MUX để kích hoạt bus I2C chính xác.

Ưu điểm

  • Không yêu cầu lập trình (so với cách tiếp cận dựa trên vi điều khiển)
  • Có thể hỗ trợ các tính năng và tốc độ I2C mà bạn cần (so với các bus bus analog / kỹ thuật số thông thường). Ví dụ: MUX thông thường (không phải I2C) sẽ không chuyển địa chỉ cuộc gọi chung cho tất cả các kênh của nó.

-1

Sử dụng chip demux đơn giản (ví dụ 74HC139 afaik) và kết nối chân I2C CLK với đầu vào (vì chân I2C CLK chỉ là đầu ra). Sử dụng chân GPIO để kiểm soát đầu ra mong muốn. Sau đó pin dữ liệu I2C có thể được chia sẻ giữa tất cả các nô lệ.


6
SCL không chỉ là đầu ra. Một nô lệ có thể kéo dài đồng hồ nếu nó cần làm chậm nó.
stevenvh

Bạn có thể sử dụng bộ ghép kênh tương tự (hai chiều) nhưng bộ giải mã có thể không hoạt động vì lý do được nêu bởi stevenh. Nếu bạn sử dụng bộ ghép kênh, bạn sẽ cần một bột giấy yếu ở phía nô lệ để đảm bảo nó không hoạt động. Cũng chỉ thay đổi lựa chọn bộ ghép kênh khi bus không hoạt động.
Kevin White
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.