Làm thế nào để tôi cắn chủ I²C?


8

Tôi đã cài đặt RPi.GPIO . Nó chưa hỗ trợ I²C , nhưng tôi có thể sử dụng nó để cắn I²C không?

Tôi chỉ cần Raspberry Pi làm chủ.


1
Tại sao không thêm hỗ trợ? Các chip hỗ trợ nó và có trình điều khiển xung quanh. Có vẻ ngớ ngẩn để bit bang nó!
Alex Chamberlain


Tôi muốn làm một chút đập bằng Python. Bạn đã thành công để làm điều đó? Sử dụng RPi.GPIO và chuyển đổi pin giữa GPIO.OUT / false (trạng thái xuống) và GPIO.IN (trạng thái ra) có làm nên mánh khóe?
Pygmalion

Câu trả lời:


4

Như một trong những người bình luận đã chỉ ra, sử dụng triển khai I²C gốc / phần cứng được ưu tiên hơn nhiều, vì các tín hiệu I²C được tạo ra sẽ đẹp hơn nhiều (đọc: tương thích). Tải CPU sẽ không đáng kể vì bạn không phải chờ đợi để tạo ra độ trễ và thường nhanh hơn (400 kHz là một tốc độ tiêu chuẩn).

Tuy nhiên, đôi khi bit rất hữu ích, khi bạn cần tạo ra một mẫu tín hiệu cụ thể hoặc khi đơn giản phần cứng I²C không tồn tại hoặc không phù hợp vì một số lý do. Một ví dụ hay về mã bitbanging có thể được tìm thấy trong bài viết Wikipedia I²C .

Một thiết kế đơn giản hơn và được ưa thích hơn, nếu hiệu suất không phải là quan trọng nhất, là tuân theo thuật toán từ bài viết Wikipedia (và các bình luận bên dưới). Bạn cần chọn hai dòng, một cho SCL một cho SDA, cung cấp điện trở kéo lên phù hợp. Hãy nhớ rằng trạng thái dòng nhàn rỗi là "cao". Bạn sẽ định cấu hình các dòng là "ra" và chuyển đổi chúng theo bất kỳ cách nào bạn cần. Để bỏ phiếu cho các dòng cho ACK hoặc kéo dài đồng hồ, bạn nên đặt chúng ở mức cao, chuyển sang chế độ "đầu vào" và sau đó kiểm tra trạng thái dòng. Các bước để tạo trạng thái bắt đầu, dừng và dữ liệu nằm trong liên kết Wikipedia ở trên.

Nếu bạn cần phải nhận được rằng bit cuối cùng của hiệu suất ra thiết kế của bạn, bạn có thể sử dụng bốn chân, SDA in, SDA out, SCL inSCL out. Những cái 'trong' được đặt vĩnh viễn thành đầu vào và 'ra' vĩnh viễn được đặt thành đầu ra. Điều này giúp bạn tiết kiệm các cuộc gọi để chuyển đổi chế độ pin.

[Được chỉnh sửa để cung cấp thiết kế đơn giản hơn như được nêu trong các ý kiến ​​dưới đây.]


2
Tôi nghĩ rằng bạn có thể sử dụng chỉ hai chân IO với pullups. Thay vì đặt ghim cao và thấp, bạn mô phỏng cống mở bằng cách chuyển đổi ghim giữa ra (thấp) và vào (cao thông qua pullup).
John La Rooy

2
Đây là một câu trả lời tồi nhưng tôi mới và không có đủ đại diện để downvote. Bạn có thể làm điều đó với 2 I / Os theo cách mà gnibbler nói. I2C là một bus đa chiều và lái nó lên cao với đầu ra đẩy trong khi một thiết bị khác lái thấp sẽ gây ra đoản mạch.
stevenvh

1
@gnibbler Bạn hoàn toàn chính xác về cách lái các dòng. Tôi sẽ chỉnh sửa câu trả lời của mình ngay khi tôi có một phút. Tuy nhiên, các chân "trong" là cần thiết nếu bạn muốn phát hiện ACK hoặc kéo dài đồng hồ, cả hai đều cần thiết cho bất kỳ giao tiếp nghiêm trọng nào.
mikijov

1
@stevenvh Tôi không bao giờ đề nghị kéo đẩy, và tôi sẽ chỉnh sửa câu trả lời của mình để rõ ràng hơn. Nhưng các chân bổ sung là cần thiết để phát hiện ACK và kéo dài đồng hồ.
mikijov

1
@MikiJ, tôi không nghĩ bạn cần thêm ghim, bạn chỉ có thể nhìn vào giá trị trên ghim khi nó chuyển sang đầu vào. Đó là những gì họ làm trong mã trên wikipedia. Tìm kiếmwhile (read_SCL() == 0) { // Clock stretching
John La Rooy
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.