Điều gì xảy ra nếu tôi bỏ qua các điện trở pullup trên các đường I2C?


33

Vừa nãy tôi nhận ra rằng dữ liệu I 2 C và các dòng đồng hồ (SDA và SCL) phải có điện trở pullup.

Vâng, tôi đã xây dựng một vài đồng hồ sử dụng DS1307 RTC (xem biểu dữ liệu ) theo sơ đồ dưới đây. Lưu ý rằng tôi đã bỏ qua cả hai điện trở pullup.

Sơ đồ đồng hồ của tôi không có điện trở pullup trên đường I2C

Cả hai đồng hồ hoạt động tốt, một trong số họ đang làm việc hơn 3 tháng nay. Làm thế nào là có thể? Trong mọi trường hợp, tôi muốn biết:

  1. Điều gì xảy ra khi pullups I 2 C bị bỏ qua?

  2. Có phải việc thiếu pullups có khả năng làm hỏng bất kỳ hai IC nào trong bảng của tôi không?

Tôi đang trả lời câu hỏi giải quyết trường hợp cụ thể của tôi về việc kết nối ATmega328P với DS1307 RTC như trong sơ đồ tôi đã cung cấp, nhưng nếu câu hỏi không quá rộng, sẽ rất hữu ích khi biết những gì xảy ra khi bỏ qua nói chung , tức là trong các kịch bản khác của hoạt động I 2 C.

Tái bút Tôi đã tìm kiếm trên mạng để tìm câu trả lời, nhưng chỉ có thể tìm thấy các bài viết về kích thước của pullups.

Cập nhật: Tôi đang sử dụng Arduino IDE 1.03 và phần sụn của tôi xử lý RTC bằng cách sử dụng DS1307RTC Arduino lib (thông qua các chức năng của nó RTC.read()RTC.write()). Lib đó lần lượt sử dụng Wire.hđể nói chuyện với RTC.

Cập nhật 2: Dưới đây là một loạt các ảnh chụp phạm vi tôi đã chụp để giúp giải thích cách I 2 C hoạt động mà không cần các pullups bên ngoài.

Phạm vi bắn 1 Phạm vi bắn 2

Cập nhật 3 (sau khi thêm I 2 C pullups): Dưới đây là một loạt ảnh phạm vi khác tôi đã chụp sau khi thêm điện trở pullup (4K7) thích hợp vào các dòng I 2 C (trên cùng một bảng). Thời gian tăng giảm từ khoảng 5 khúc xuống còn 290 ns. Tôi 2 C bây giờ hạnh phúc hơn nhiều.

Phạm vi bắn 3 Phạm vi bắn 4


2
Mã của bạn có vô hiệu hóa pullups trên các chân đó không?
Ignacio Vazquez-Abrams

@ IgnacioVazquez-Abrams Không có đề cập trực tiếp đến các chân SDA và SCD (18 & 19) trong mã của tôi. Tôi xử lý RTC bằng cách sử dụng lib lib DS1307RTC và các chức năng của nó RTC.read () và RTC.write ().
Ricardo

Lần lượt lib đó sử dụng Wire.h để nói chuyện với RTC.
Ricardo

3
Vâng, chắc chắn sử dụng pullups nội bộ. Lưu ý các đường cong thay vì các cạnh sắc nét.
Ignacio Vazquez-Abrams

Câu trả lời:


28

1) Điều gì xảy ra khi các pullups I2C bị bỏ qua?

Sẽ không có thông tin liên lạc trên xe buýt I 2 C. Ở tất cả. MCU sẽ không thể tạo điều kiện khởi động I 2 C. MCU sẽ không thể truyền địa chỉ I 2 C.

Tự hỏi tại sao nó làm việc trong 3 tháng? Đọc tiếp.

2) Việc thiếu pullups có khả năng làm hỏng bất kỳ hai IC nào trong bảng của tôi không?

Chắc là không. Trong trường hợp cụ thể này (MCU, RTC, không có gì khác), chắc chắn là không.

3) Tại sao đầu tiên MCU có thể giao tiếp với thiết bị nô lệ I 2 C? I 2 C yêu cầu điện trở kéo lên. Nhưng chúng không được bao gồm trong sơ đồ.

Có thể, bạn đã kích hoạt tính năng pull-up nội bộ trên ATmega. Từ những gì tôi đã đọc 1 , ATmega có 20kΩ pull-up nội bộ, có thể được bật hoặc tắt từ phần sụn. 20kΩ là quá yếu cho việc kéo lên I 2 C. Nhưng nếu xe buýt có điện dung thấp (vật lý nhỏ) và giao tiếp đủ chậm, thì 20kΩ vẫn có thể khiến xe buýt hoạt động. Tuy nhiên, đây không phải là một thiết kế đáng tin cậy tốt, so với việc sử dụng các điện trở kéo lên rời rạc.

1 Không phải là một anh chàng ATmega.

cập nhật: Trong phản hồi dạng sóng I 2 C, được thêm vào OP
Các dạng sóng trong OP có hằng số thời gian tăng rất dài. Đây là dạng sóng I 2 C thường trông giống như

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

PIC18F4550, Vcc = + 5V, 2.2kΩ kéo lên. Dạng sóng cho thấy SCL. Thời gian tăng trên SDA là như nhau. Kích thước vật lý của bus là vừa phải: 2 thiết bị phụ, chiều dài PCB ≈100mm.


Cảm ơn câu trả lời của bạn! Có, ATmega có pullups phải được kích hoạt trong trường hợp của tôi. Tôi sẽ kiểm tra lại mã và các lib tôi đang sử dụng và cũng đặt bảng thông qua phạm vi. Tôi hy vọng rằng sẽ làm mọi thứ rõ ràng một chút.
Ricardo

1
Trước tiên, bạn có thể muốn kiểm tra lại bằng biểu dữ liệu của thiết bị nô lệ của mình. Nếu tôi nhớ đúng, các pullups trên ATMega có thể ở mức từ 30k-60k (tùy thuộc vào Vcc, nhiệt độ và một số yếu tố khác; bạn thực sự không thể phụ thuộc vào chúng để có sức đề kháng đáng tin cậy). Bạn muốn đảm bảo rằng bạn gửi đủ dòng cho nô lệ để đảm bảo logic hợp lý 1. Nếu điện trở quá lớn, thiết bị nô lệ của bạn sẽ không có đủ dòng và bạn sẽ ở cùng một chỗ với bạn hiện nay.
audiFanatic

4
@audiFanatic +1. BTW, IMO, bao gồm các điện trở kéo vào bảng đột phá và cài đặt chúng theo mặc định là một lỗi. Hãy tưởng tượng điều gì xảy ra nếu ai đó có nhiều bảng đột phá trên một xe buýt I2C. Mỗi lần kéo lên thường là 2,2kΩ hoặc hơn. Các điện trở kéo lên trên tất cả các bảng đột phá xuất hiện song song. Kéo kết hợp trở nên quá cứng đối với I2C. [Thông tin thêm về vấn đề tiềm ẩn này tại đâytại đây .]
Nick Alexeev

2
@Ricardo Đó không phải là một chiếc xe buýt I2C hạnh phúc trên ảnh chụp phạm vi của bạn [bộ ảnh phạm vi đầu tiên trong OP]. Tôi cũng đã thêm một phạm vi bắn vào câu trả lời của tôi.
Nick Alexeev

3
Bài viết này có một số dạng sóng của tín hiệu i2c tốt và xấu: dsscircuits.com/index.php/articles/ mẹo
ford

16

Thư viện bạn sử dụng và các thư viện phụ thuộc vào (Dây), cho phép kéo lên bên trong ATMega. Đây là những pull-up yếu, và trong sử dụng bình thường, bổ sung bất kỳ pull-up bên ngoài (hai điện trở song song). Do điện trở tương đối cao từ 20k đến 70k, chúng không gây ra nhiều nếu có bất kỳ vấn đề nào với bên ngoài đang sử dụng.

Điều gì xảy ra khi các pullups I2C bị bỏ qua?

Bây giờ không có điện trở bên ngoài, các pull-up bên trong yếu là điều duy nhất thúc đẩy dòng cao. Tùy thuộc vào bố cục bảng của bạn, tốc độ của dòng i2c của bạn, tần suất bạn truy cập nó, nhiễu bên ngoài, v.v., chúng có thể hoạt động, chúng có thể không. Bạn may mắn ra ngoài. Bạn có pull-up, không phải là những gì bạn mong đợi.

Việc thiếu pullups có khả năng làm hỏng bất kỳ hai IC nào trong bảng của tôi không?

Ngay cả khi không có pull-up bên trong, việc thiếu bất kỳ pull-up nào cũng sẽ không làm hỏng IC. Bản dựng bên trong của các dòng SCl và SDA của thiết bị i2c giống như các bóng bán dẫn NPN. Chúng là các bộ sưu tập mở , về cơ bản là các điốt được điều khiển / chuyển đổi hiện tại.

Mặc dù vậy, điều cuối cùng cần lưu ý là việc bật lên bên trong, khi ATMega của bạn ở mức 5v và thiết bị i2c là thiết bị chỉ có 3,3v, có thể gây ra sự cố. Hoặc nếu bạn có các thiết bị kéo bên trong và các điện trở bên ngoài được kết nối với điện áp 3.3v hoặc điện áp khác, cũng có thể gây ra sự cố. Về cơ bản, đó là một lỗi cố ý bỏ qua trong thư viện Dây.


4
+1 - You do have pull-ups, just not ones you expected.- Tôi đoán bạn đóng đinh nó. Cảm ơn!
Ricardo

Để bạn biết rằng tôi đã thêm một vài bức ảnh phạm vi để giúp làm rõ những gì đang diễn ra với thiết lập của tôi.
Ricardo

2
@Ricardo yep, nhìn thấy những người đó, ở 33khz. Một phần ba tốc độ quy định i2c thấp nhất và tín hiệu vẫn rất tệ. Ở 100khz hoặc 400khz, bạn sẽ không có giao tiếp làm việc. Mặc dù vậy, điều tuyệt vời là nhiều thiết bị i2c hoạt động ở một phần nhỏ của tốc độ tối đa. Chỉ cần nhớ, các pullups bên trong có thể lên tới 70k ohm, một điện trở i2c điển hình là 4,7k
Passerby

8

Nói chung, bạn sẽ cần phải có các điện trở pullup cho mạch giao diện I 2 C. Nếu giao diện thực sự là thông số kỹ thuật đầy đủ I 2 C ở cả hai đầu của dây thì các đường tín hiệu không có điện trở sẽ không bao giờ có thể đi đến mức cao. Chúng có thể vẫn ở mức thấp hoặc đi đến một số mức trung gian được xác định bởi dòng rò ở các bộ phận ở mỗi đầu. Lý do cho điều này là bởi vì I 2 C thực sự là một xe buýt thoát nước mở.

Một số thiết bị thực sự có thể có điện trở pullup trên chip trong phạm vi 20K đến 100K ohm chỉ để giữ các chân giao diện ở mức không hoạt động cao khi giao diện I 2 C không được sử dụng. Đối với các giao diện đơn giản và ngắn, các điện trở pullup này có thể vừa đủ để cung cấp dòng điện cần thiết để kéo các đường dây lên cao trong khi đồng hồ và / hoặc dữ liệu đang được báo hiệu.

Thật khó để nói từ sơ đồ của bạn, nhưng trong một số trường hợp, giao diện I 2 C được triển khai bằng cách sử dụng các chân cổng I / O cho mục đích chung và sau đó đập vào phần mềm. Đôi khi, người triển khai có thể không vận hành các chân I / O trong cấu hình này bằng phương pháp thoát mở và điều này có thể đóng vai trò tại sao một giao diện không có điện trở pullup dường như hoạt động.

Vào cuối ngày, bạn có thể nợ chính mình để kiểm tra tín hiệu trên một trong những đồng hồ trước đó của bạn bằng cách sử dụng máy hiện sóng để xem liệu 1 và 0 trên giao diện có hoạt động trong các mức điện áp cụ thể không. Sau đó, bạn sẽ biết chắc chắn liệu bạn có cực kỳ may mắn với việc thực hiện đó hay không nếu một trong những yếu tố mà tôi đã đề cập ở trên đang diễn ra.


4

Điều gì xảy ra khi các pullups I2C bị ngừng hoạt động?

Nhiều khả năng, bus I2C đơn giản sẽ không hoạt động.

Việc thiếu pullups có khả năng làm hỏng bất kỳ hai IC nào trong bảng của tôi không?

Hầu như không.


3

Các dòng I2C của bạn sẽ không hoạt động. Nếu tôi không nhầm, I2C chỉ xác nhận tín hiệu thấp, nhưng không đưa chúng trở lại trạng thái cao, đó là lý do tại sao bạn cần những điện trở đó.

Bất kỳ thiếu pull-up sẽ không làm hỏng bất kỳ IC.


Chân I2C là cống mở.
Matt Young

1

I2C là một giao thức logic-logic; vì vậy dữ liệu và dòng đồng hồ của bạn là mở cống. Nói cách khác, phần cứng I2C chỉ có thể khiến các dòng này ở mức thấp; chúng được thả nổi khi không phải là số không. Đó là nơi mà các điện trở kéo lên. Đây là một sơ đồ đơn giản hóa, nhưng làm việc với tôi trong một giây.

sơ đồ

mô phỏng mạch này - Sơ đồ được tạo bằng CircuitLab


Bạn có thể thấy; cần có điện trở kéo lên để đảm bảo logic 1 được nhìn thấy ở đầu ra khi logic TTL không điều khiển đầu ra ở mức thấp. Logic logic không thể điều khiển các dòng cao như tôi đã đề cập. Nếu điều này không có mặt, đầu ra sẽ bị trôi nổi và không thể đoán trước được những gì bạn có thể thấy ở đầu ra (đối với tất cả những gì bạn biết, lò vi sóng hoặc rối loạn chức năng đường ruột của đồng nghiệp do một con gấu keo không đường nào đó gây ra có thể gây ra giá trị dao động).

Bây giờ, nếu bạn triển khai I2C trong phần mềm với vi điều khiển, điều này có thể sẽ không gặp quá nhiều vấn đề vì rất có thể nó sẽ sử dụng logic CMOS, có thể điều khiển đầu ra cả cao hay thấp.


1
Vui vì nó đã giúp.
audiFanatic

2
Cho dù các thiết bị sử dụng logic TTL hay CMOS không thành vấn đề - đầu ra TTL bình thường và đầu ra CMOS bình thường sẽ kéo tín hiệu lên và xuống. Các tín hiệu I2C là bộ thu mở TTL, hoặc (nhiều khả năng) là cống thoát mở - trong cả hai trường hợp, bóng bán dẫn kéo tín hiệu cao bị thiếu trong giai đoạn đầu ra của nguồn, vì vậy cần phải có điện trở kéo lên kéo các tín hiệu cao. Có thể là vi điều khiển có các pull-up bên trong trên các pint đó.
Peter Bennett

3
-1 Như Peter Bennett đã nói, rất nhiều câu trả lời này là sai. Gọi tín hiệu TTL là "open-Drain" là cách tặng.
Joe Hass

Lưu ý rằng có những lợi thế khi thực hiện I2C với TTL, cụ thể là bạn thường không cần trình dịch mức để xử lý các thành phần có điện áp cung cấp khác nhau được gắn vào cùng một bus. Chỉ cần đặt điện áp pullup thành điện áp đầu vào chấp nhận cao nhất của chip điện áp thấp nhất là đủ nhiều lần với các giai đoạn đầu vào TTL . Trên CMOS, điều đó sẽ không hoạt động.
Ben Voigt

@BenVoigt: Không - gọi cấu hình "yêu cầu điện trở kéo lên" "TTL" là sai, vì sự sắp xếp này có thể được thực hiện với cả CMOS hoặc TTL, và DS1307 là một phần của CMOS. Bảng dữ liệu Maxim nêu rõ rằng các đầu ra là cống mở và sơ đồ khối hiển thị FET cho một đầu ra.
Peter Bennett

0

Khi tôi đập I2C với micro là chủ cung cấp đồng hồ thì tôi đã có thể lái SCL mà không cần pullup.

Tuy nhiên, SDA không cần phải là OC với pullup để thiết bị nô lệ có thể kéo xuống và phản hồi đúng cách.

Trân trọng

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.