I2C chỉ hoạt động khi được thăm dò hoặc tải với 1Mohm


9

Tôi đang cố gắng khắc phục sự cố liên lạc giữa msp430fr5847 (chính) và cảm biến nô lệ với chip I2C không xác định (một phần của cảm biến công nghiệp)

Tôi đang gặp vấn đề với một loạt cảm biến mới trong đó dữ liệu của tôi được trả về với tất cả các số 0, tuy nhiên khi cố gắng khắc phục sự cố với Saleae logic pro (2Mohm, 10pf) hoặc máy hiện sóng của tôi (10Mohm, 50pf), hệ thống hoạt động hoàn hảo khi thăm dò chân SDA.

Khắc phục sự cố thêm mạch hoạt động chính xác nếu tôi thêm điện trở 1Mohm giữa SDA và mặt đất, nhưng không hoạt động nếu chỉ thêm một tụ điện 10pf hoặc 100pf.

Tôi đang sử dụng điện trở kéo 4,7k lên đường ray 3,3v của mình.

Điều gì có thể gây ra sự cố này và những gì có thể được thực hiện để khắc phục sự cố mà không vô tình khắc phục sự cố.


EDIT: 19/07/2017 Dưới đây là một dấu vết phạm vi nhanh chóng của các tín hiệu của tôi.

Một điều khác tôi quên đề cập đến là chỉ thăm dò SDA mới khiến bảng hoạt động, việc thăm dò SCL hoặc đường ngắt của tôi không làm cho nó hoạt động bình thường.

Phạm vi dấu vết của SDA và SCL


EDIT: 21/07/2017

Cốt truyện dày lên, có vẻ như việc kết nối một máy hiện sóng khác nhau sẽ không khiến mạch hoạt động chính xác và có thể thấy rằng sự khác biệt duy nhất là ACK không được truyền đi.

Hình ảnh phạm vi mới

Trong hình trên, dấu vết màu xanh lam và xanh lục là SCL và SDA khi mạch không hoạt động chính xác. Dấu vết màu vàng và màu hồng là từ khi tôi cũng kết nối logic Saleae của mình với Pin SDA và nối đất nhưng không cắm USB (cố gắng tránh các vòng lặp trên mặt đất).

Để thêm một chút nền tảng về cảm biến, đó là một cảm biến áp suất công nghiệp mà chúng tôi mua từ nhà sản xuất. Trước đây chúng tôi đã thiết kế và thử nghiệm các PCB này với lô cảm biến đầu tiên của chúng tôi. Gần đây chúng tôi đã nhận được một đợt mới và hiện đang gặp phải những vấn đề này. Tôi đã thực hiện một chút điều tra và tôi cực kỳ nghi ngờ (sau khi googling các câu tìm kiếm độc đáo từ biểu dữ liệu) rằng bên trong cảm biến sử dụng một bảng dữ liệu ZSC31014 hoặc tương tự, PDF TẠI ĐÂY


EDIT: 26/07/2017

Vì vậy, hy vọng phần cuối cùng trong việc giải quyết vấn đề này, theo câu trả lời chi tiết của SamGibson, tôi đã thực hiện sửa lỗi thiết lập bit cao của địa chỉ để che giấu sự rối loạn ở cuối bit start.

Điều này đã làm việc chủ yếu với dữ liệu đi qua như mong đợi, tuy nhiên bây giờ có vẻ như trong lệnh đọc đầu tiên sau khi ghi (nếu đó là thuật ngữ chính xác cho một nhóm các bit i2c), nô lệ cố gắng ACK sớm một chút (trong vị trí của bit ghi). Tôi có thể nói rằng đó là nô lệ kéo dòng xuống thông qua việc thêm một điện trở nhỏ (47 ohm) nối tiếp với Dòng SDA.

Tôi thường bắt đầu câu hỏi này như một câu hỏi mới nhưng khi tôi đính kèm cùng một phạm vi không có tác dụng trong việc khắc phục sự cố ở trên, vấn đề này dường như không còn nữa, đây thực sự có vẻ là một vấn đề biên giới ngay cả khi tôi gắn đầu dò phạm vi, mà không kết nối nó với phạm vi thì vấn đề được giải quyết nên tôi cho rằng đó là vấn đề điện dung.

Cốt truyện không có phạm vi kèm theo

Cốt truyện không có phạm vi

Sơ đồ sự cố với đầu dò phạm vi được đính kèm, nhưng không được gắn vào phạm vi, lưu ý điện áp cao hơn một chút khi nô lệ kéo xuống bit ghi thay vì bit ACK.

Với phạm vi kèm theo


1
Bạn có bất kỳ dấu vết phạm vi nào không
Kevin White

1
Bạn đã vô tình đảo ngược tín hiệu đồng hồ của bạn?
Andy aka

6
Xác nhận rằng bus I2C có và đang sử dụng một dây nối đất chung (MSP đến cảm biến I2C). Yêu cầu 3 dây: SDA, SCL và GND, với SDA & SCL được kéo lên Vcc (dây thứ 4 có thể) thông qua các điện trở kéo lên.
Chris Knudsen

1
@Hugoagogo - Yike! Cả SDA & SCL bất thường, theo những cách khác nhau. Tôi cho rằng dấu vết là với các cảm biến thất bại mới ? Nếu vậy, bạn có thể cung cấp một dấu vết với các cảm biến làm việc cũ ? Có lẽ sự khác biệt có thể không quá lớn, tức là bạn đã gặp vấn đề trước đây, nhưng nó chỉ hoạt động. Thông tin cơ bản khác có thể tiết lộ dữ liệu hữu ích, ví dụ: Làm thế nào để bạn biết đây là những chip I2C "mới", coi chip là "không xác định"? Tôi đoán một số kỹ thuật đảo ngược đã được thực hiện để cho phép MSP430 (mà bạn điều khiển?) Được sử dụng với một cảm biến (mà bạn không điều khiển?). Làm thế nào khác với cấu hình "ban đầu"?
SamGibson

1
Chà, tôi đồng ý với SamGibson. Tôi sẽ không nhanh chóng nói rằng các gai là lỗi đo lường. Tôi nghĩ bạn nên cố gắng nghiên cứu thêm một chút và cố gắng loại bỏ chúng, nếu chúng đến từ thiết lập đo lường của bạn hoặc tìm lý do tại sao chúng ở đó. Rốt cuộc, chúng dường như được xếp thẳng hàng với các cạnh rơi của SCL. Tôi cũng sẽ cố gắng nối cảm biến trực tiếp trên PCB. Điều đó có thể giúp bạn loại trừ rằng các vấn đề là do cáp hoặc khoảng cách của cảm biến từ bo mạch chính.
nickagian

Câu trả lời:


11

Tôi nghĩ rằng tôi đã tìm thấy câu trả lời. Hóa ra đây là một vấn đề đã biết, nhưng tôi chỉ thấy rằng sau khi tôi quyết định vấn đề là ở đâu, và tìm kiếm nó!

Đây là quá trình tôi đã trải qua, vì vậy bạn có thể làm theo nó (và, nếu cần, sau đó bạn có thể điều chỉnh cuộc điều tra của mình nếu bạn thấy kết quả khác với giả định của tôi). Điểm mấu chốt là dường như có sự không tương thích giữa (ít nhất là một số) hành vi MSP430 I²C và hành vi I²C cần thiết của thiết bị mà bạn nghi ngờ là I²C Slave, IDT ZSC31014 . Có bảng dữ liệu cho thiết bị đó là rất quan trọng để hiểu điều này, vì vậy cảm ơn bạn đã tìm thấy nó.

Tin tốt là có (ít nhất) 2 cách giải quyết cho vấn đề này, điều mà tôi sẽ giải thích ở cuối.

Cốt truyện dày lên, có vẻ như việc kết nối một máy hiện sóng khác nhau sẽ không khiến mạch hoạt động chính xác và có thể thấy rằng sự khác biệt duy nhất là ACK không được truyền đi.

Các dấu vết mới là hữu ích, cảm ơn, mặc dù tôi diễn giải chúng một chút khác nhau.

. dấu vết mới nhất. Tôi vẫn sẽ đề nghị điều tra rằng SCL không hoạt động cuối cùng, nhưng tôi không tin rằng nó có liên quan đến vấn đề chính.)

Có hai "trục trặc" trên SDA:

  • Một trục trặc ngay trước hoặc ngay sau xung ACK không phải là hiếm, khi I²C Master giải phóng quyền kiểm soát SDA để cho phép Slave thực hiện ACK và sau đó Master có thể lái lại SDA. Vì vậy, tôi bỏ qua cái đó.

  • Đó là trục trặc SDA sớm , trước xung SCL đầu tiên, điều này bất thường hơn. Từ biên độ của trục trặc SDA ban đầu đó (xem sau) và thực tế nó chỉ xảy ra trước xung SCL đầu tiên đó (được dán nhãn 0), nhưng không xảy ra trước các xung SCL sau đó, nơi chúng ta có thể thấy một trục trặc trên SDA (như SCL các xung có nhãn 4, 5, 6 hoặc 7), chúng tôi biết đó không phải là vật phẩm đo lường, cũng không phải là khớp nối từ SCL (ví dụ).

(Để tham khảo sau, sự cố SDA ban đầu trông giống như ít nhất 2V trong dấu vết mới nhất, do đó, với Vdd ở mức 3.6V từ các nhận xét trước đó, điều đó làm cho biên độ trục trặc của SDA ít nhất (2 / 3.6) = 0.55 x Vdd. các ngưỡng mức logic I2C có liên quan sẽ thảo luận sau.)

Bỏ qua sự khác biệt ACK, tôi tin rằng tôi thấy một sự khác biệt khác giữa hai bộ dấu vết trong ảnh chụp màn hình thứ hai đó. Biên độ của trục trặc SDA ban đầu đó có vẻ hơi khác nhau, so sánh dấu vết SDA hàng đầu được dán nhãn C1(màu vàng-ish?) Và dấu vết SDA thứ 2 được dán nhãn M3(màu xanh). Bây giờ tôi tin rằng sự khác biệt về biên độ của trục trặc SDA ban đầu đó, là điều có thể khiến vấn đề của bạn xuất hiện hoặc biến mất, như tôi giải thích dưới đây.

Thậm chí nhiều độ phân giải cụ thể hơn về trục trặc sẽ giúp ích (đó là một trong những vấn đề trong việc cố gắng xử lý các vấn đề "từ xa" - tôi không thể tự mình vận hành phạm vi!). Tôi sẽ giả sử rằng khi bạn phóng to, có vẻ như bắt đầu logic I²C bình thường "1" (nghĩa là đường cong RC ở cạnh tăng, đặc biệt là nếu bạn tạm thời làm cho pull-up yếu hơn, ví dụ như 10k) trừ khi nó không ' t đạt đến điện áp dương hoàn toàn trước khi nó được dẫn đến logic "0" một lần nữa. Đó là những gì được hiển thị trên một trang web khác được liên kết sau đó. Nếu bạn thấy hình dạng khác với trục trặc của bạn, thì phân tích sau này của tôi có thể không áp dụng.

I²C Master đang điều khiển xe buýt tại điểm trục trặc đó, giữa I²C Start và xung đồng hồ SCL đầu tiên (mà bạn đã gắn nhãn "0" mặc dù đó là MSbit). Điều đó khiến tôi nghi ngờ về hành vi MSP430, mặc dù với SCL ở mức thấp vào thời điểm đó, một trục trặc SDA không nên ảnh hưởng đến các thiết bị tuân thủ I²C, vì chúng sẽ chờ SCL tăng cao trước khi chúng đọc trạng thái SDA tiếp theo.

Vì vậy, I²C Slave có thực sự tuân thủ I²C không? Hóa ra, ZSC31014 " cầu kỳ " và ít dung sai hơn một số thiết bị I²C khác, vào đúng thời điểm mà tôi tin rằng MSP430 đang tạo ra sự cố đó!

Bảng dữ liệu ZSC31014 liệt kê 3 khu vực nơi chúng thừa nhận hành vi I²C của thiết bị là "khác nhau". Bạn cũng có thể bị ảnh hưởng bởi hai người đầu tiên trong danh sách này vào những thời điểm khác (đó không phải là một phần của phân tích này), nhưng đó là điểm thứ ba mà tôi đã đánh dấu bên dưới màu đỏ, có liên quan đến trục trặc SDA ban đầu đó:


trích xuất từ ​​bảng dữ liệu ZSC31014


Biên độ của trục trặc SDA sớm đó là rất quan trọng . Nếu trục trặc đó không tăng đủ để được ZSC31014 nhận ra là logic "1" trước khi nó rơi lại, thì bạn vẫn ổn - thiết bị phải thấy một điểm rơi trên SDA để phá vỡ "quy tắc" đó và nó chỉ có thể là một cạnh giảm nếu nó đã được công nhận là logic "1".

Bất cứ điều gì ảnh hưởng đến biên độ của sự cố SDA đó, như tải bổ sung của 'bộ phân tích phạm vi hoặc logic trên tín hiệu SDA, có thể đủ để ngăn chặn sự cố được ZSC31014 nhận ra khi đạt đến logic "1" và do đó không "rơi" Cạnh SDA ", điểm thứ ba trong danh sách, có thể xảy ra (vào một ngày tốt, tùy thuộc vào điện áp, nhiệt độ, v.v.). Tuy nhiên, như bạn đã tìm thấy, sự khác biệt giữa các máy hiện sóng khác nhau là đủ để có nghĩa là một số trong số chúng thêm tải đủ để ngăn chặn vấn đề, và những cái khác thì không. Thiết lập này phải rất ít!

Điều này khẳng định sự lo lắng của tôi rằng các lô cảm biến "hoạt động" trước đó của bạn, có thể "chỉ" hoạt động, vì MCU MSP430 trên các thiết lập "hoạt động" đó có thể cũng sẽ tạo ra sự cố SDA. Lý thuyết của tôi về sự khác biệt có thể có giữa các lô cảm biến, có thể giải thích hành vi khác nhau mà bạn đã báo cáo (lô "làm việc" so với lô "không hoạt động") sẽ được giải thích tiếp theo.

Thật thú vị, ZSC31014 khác với I²C tiêu chuẩn ở một khu vực khác không được đề cập trong danh sách đó từ nhà sản xuất và điều này có thể giải thích tại sao bạn dường như thấy sự khác biệt giữa các lô cảm biến.

Ngưỡng logic I²C tiêu chuẩn là (đơn giản hóa) - dưới 0,3 x Vdd đối với logic "0" và trên 0,7 x Vdd đối với logic "1" như được hiển thị trong thông số kỹ thuật của I²C :


ngưỡng mức logic từ đặc tả I2C


Tuy nhiên, ZSC31014 có các ngưỡng khác nhau , 0,2 x Vdd và 0,8 x Vdd, có nghĩa là "vùng không xác định" giữa các ngưỡng đó lớn hơn các thiết bị I²C điển hình:


ngưỡng mức logic từ biểu dữ liệu ZSC31014


"Vùng không xác định" lớn hơn đó làm tăng khả năng trục trặc xâm nhập vào vùng điện áp không xác định, trong đó nó có thể được nhận dạng là logic "1" (hãy nhớ rằng, mọi thứ trên 0,2 x Vdd đều có thể được ZSC31014 nhận ra là logic "1" , vì trong khu vực không xác định, mọi thứ đều được phép - nó chỉ cao hơn 0,8 x Vdd khi nó phải được công nhận là logic "1"). Và, như đã giải thích trước đây, nếu trục trặc được ZSC31014 nhận ra là đã đạt đến logic "1", thì khi nó lại rơi vào logic "0", bạn đã phá vỡ "quy tắc" được đánh dấu màu đỏ cho hành vi I²C cần thiết bởi ZSC31014.

Do không nhận biết được các mức logic trong vùng điện áp "không xác định" đó, nên nhà sản xuất cảm biến sẽ không phá vỡ thông số kỹ thuật nếu họ tạo một lô chỉ nhận ra logic "1" khi đạt 0,7 x Vdd, nhưng tạo ra một lô khác nhận ra một logic "1" thấp đến 0,4 x Vdd chẳng hạn. Lô thứ hai giả định đó sẽ có nhiều khả năng thấy sự cố SDA là một cạnh SDA giảm, vi phạm điểm thứ ba trong danh sách của họ, nhưng không phá vỡ đặc điểm kỹ thuật của họ.

(Nhiều vấn đề tôi đã làm việc trong nhiều năm qua đã xảy ra như sau: Có hai thiết bị, không có thiết bị nào phá vỡ một đặc điểm kỹ thuật có sơ hở - nhưng một trong số đó là cầu kỳ và kém khoan dung hơn , ở điểm Một thiết bị khác cần các thiết bị được kết nối để trở nên khoan dung hơnhoạt động không rõ ràng của nó ! Mỗi thiết bị trong số hai thiết bị đó đều giao tiếp tốt với phần lớn các thiết bị khác, nhưng không đáng tin cậy (hoặc hoàn toàn thất bại) khi kết nối với nhau.)

vậy, bạn có thể làm gì? Tôi nghĩ về hai lựa chọn:

  • Không sử dụng MSP430 - sử dụng MCU khác không tạo ra trục trặc SDA sớm đó. Tuy nhiên tôi hy vọng bạn đã đầu tư nhiều thời gian vào phần mềm và sẽ không muốn chuyển mã sang MCU khác, nếu điều đó có thể tránh được.

  • "Bit-bang" giao thức I²C trên MSP430, thay vì sử dụng mô-đun phần cứng I²C tích hợp. Bằng cách đó, bạn có toàn quyền kiểm soát các tín hiệu I²C và có thể ngăn chặn sự cố đó xảy ra. Tuy nhiên, rõ ràng sẽ có một số công việc để tạo các thói quen I²C của riêng bạn, gỡ lỗi chúng và mã kết quả có thể lớn hơn so với khi sử dụng mô-đun phần cứng MSP430 I²C, đây có thể là một vấn đề nếu bạn thiếu không gian Flash.

Sau đó, tôi đã tìm kiếm các vấn đề MSP430 I²C và tôi thấy rằng sự kết hợp này của MSP430 + ZSC31014 là một vấn đề đã biết, do sự cố SDA ban đầu từ MSP430! Xem chủ đề này trên diễn đàn TI E2E MSP430:

Diễn đàn TI E2E: MSP430 xung trục I2C gây rắc rối cho chip ngoại vi I2C

Cách giải quyết đề cập ở đó, là để thay đổi địa chỉ ZSC31014 I ² C để SDA là cao vào thời điểm khi trục trặc tích cực có thể xảy ra, và vì SDA được làm bằng cao thì dù sao, không có thực tế trục trặc trên SDA:

Cách giải quyết của chúng tôi là định cấu hình chip ZSC để có địa chỉ với bit 6 được đặt (ví dụ: chúng tôi hiện đang sử dụng 0x42) - điều này biến xung trục trặc thành một bit "cao" sạch đẹp cho thời lượng của bit địa chỉ 6, bị loại bỏ của các cạnh rơi có vấn đề.

Cách giải quyết tương tự có hiệu quả ngược lại với gợi ý trong biểu dữ liệu ZSC31014, trong hộp màu đỏ mà tôi đã đánh dấu. Họ nói rằng một trục trặc SDA phải được ngăn chặn nếu bit đầu tiên (là MSbit) của địa chỉ I²C ZSC31014 là 0 - vì vậy đừng biến MSbit của địa chỉ I²C thành "0", thay vào đó là "1" đặt bit 6 trong địa chỉ I²C 7 bit!

Do luồng chủ đề của diễn đàn TI E2E và bảng dữ liệu ZSC31014 đều tập trung vào địa chỉ I²C, nên có lẽ sự cố SDA không xảy ra hoặc không xảy ra sự cố trong quá trình gửi dữ liệu khác trên xe buýt. Bạn sẽ cần phải điều tra rằng.

Do đó, bỏ qua cách giải quyết đầu tiên của việc sử dụng MCU khác, hai cách giải quyết (thực tế hơn) là:

  • Bit-bang xe buýt MSP430 I²C bằng cách viết mã của riêng bạn, để bạn không tạo ra trục trặc đó trên SDA, hoặc
  • Thay đổi địa chỉ ZSC31014 I ² C để bit 6 của địa chỉ 7-bit của nó được thiết lập, có nghĩa là SDA đã cao khi trục trặc nếu không sẽ xảy ra, vì vậy không thực tế trục trặc xảy ra trên SDA khi ZSC31014 được đề cập (giả định rằng một trục trặc SDA hoặc không xảy ra sau các I²C khác Bắt đầu các sự kiện trong khi truyền dữ liệu hoặc nếu xảy ra, ZSC31014 không bị "đảo lộn").

Mong rằng sẽ giúp!


2
Đây là một câu trả lời tuyệt vời và rất hữu ích, trước khi tôi đánh dấu là đã chấp nhận, có bất kỳ cách nào tôi có thể cung cấp cho bạn thêm một số đại diện để gắn bó với nó thông qua việc khắc phục sự cố. Tôi cũng sẽ cập nhật câu hỏi của tôi với cách giải quyết của tôi khi tôi nhận được nó.
Hugoagogo

1
@Hugo - Đó là một suy nghĩ rất tử tế :-) Tôi tin rằng nó có thể được thực hiện bằng cách đưa ra một tiền thưởng trong đó lý do tiền thưởng sẽ là " Trả lời câu trả lời hiện có ". Tôi không phải là một chuyên gia trong quá trình này, vì vậy tôi không thể nói nhiều hơn thế. Tất nhiên tôi rất vui khi có thêm đại diện (phải mất vài giờ để phân tích và viết bài ;-)) nhưng nếu bạn không muốn sử dụng tiền thưởng, hoặc không thể tìm ra quy trình , sau đó không phải lo lắng, dù sao đó cũng là nghiệp tích cực :-) Hy vọng câu trả lời của tôi có hiệu quả!
SamGibson

@Hugo - Tôi không biết liệu bạn có được thông báo về các cập nhật cho câu trả lời không, nhưng chỉ là FYI, tôi đã thêm một đoạn về SCL và phần dưới của nó (vẫn là một câu đố, nhưng tôi nghi ngờ nó liên quan đến vấn đề chính) và tôi đã dự đoán biên độ của "trục trặc SDA sớm" trong dấu vết phạm vi mới nhất là ít nhất 0,55 x Vdd, nằm trong vùng điện áp "không xác định", nơi các cảm biến khác nhau (hoặc các cảm biến khác nhau ;-)) có thể xử lý đó có phải là logic "1" hay không, mà không phá vỡ đặc điểm kỹ thuật của chúng. Tôi sẽ ngoại tuyến một thời gian sớm, vì vậy một lần nữa, chúc may mắn!
SamGibson

1
Cảm ơn một lần nữa vì sự giúp đỡ tôi sẽ có tiền thưởng vào thứ Hai khi tôi vào. (Đối với hồ sơ tôi không nhận được thông báo cập nhật cho câu trả lời)
Hugoagogo

tôi có thể khiến bạn cân nhắc về một bản cập nhật cuối cùng cho câu hỏi này không.
Hugoagogo
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.