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ủ.
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ủ.
Câu trả lời:
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 in
và SCL 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.]
while (read_SCL() == 0) { // Clock stretching