Đối với những người thiếu kiên nhẫn, bạn có thể bỏ qua nền.
Lý lịch
Tôi đang lập trình một bộ vi điều khiển giao tiếp với SPI. Có một chủ và n
nô lệ chia sẻ xe buýt. Không có chip chọn. (Đây không phải là một thiết kế tồi, nhưng n
lớn và không đủ không gian cho n
các dòng phụ).
Do đó, trách nhiệm của những người nô lệ là giữ MISO của họ ở mức trở kháng cao và nhiều nhất là một trong số họ nói. Điều này được thực hiện bằng cách chỉ trả lời khi id của họ được bỏ phiếu.
Bây giờ chúng tôi muốn có một giai đoạn khám phá ban đầu, nơi chủ nhân phát hiện ra nô lệ với những gì id được gắn vào nó. Để làm cho cuộc sống dễ dàng hơn (trên một số khía cạnh), chúng tôi muốn có id duy nhất (và do đó, ví dụ 32 bit). Điều này khiến cho chủ nhân không thể bình chọn từng id một và xem ai trả lời (có quá nhiều khả năng).
Để giải quyết vấn đề này, tôi đã nghĩ ra một biến thể của tìm kiếm nhị phân trong đó các nô lệ trả lời chung và chủ có thể nhanh chóng tìm thấy id tối thiểu. Các nô lệ với id đó được bảo không tham gia nữa và thuật toán lặp lại. (Chi tiết không quan trọng).
Có một vấn đề mặc dù. Phản hồi tập thể cần phải là OR (hoặc logic AND) hợp lý của tất cả các phản hồi. Tôi đã được thông báo rằng dòng có thể được cấu hình theo cách mà bus MISO có thể hoạt động như một OR logic. Những gì tôi đã nói là:
- Đặt MISO trên bản chính là Kéo lên và
- Đặt MISO trên mọi nô lệ là Cống mở.
Tôi đã thử điều này, nhưng ngay cả với một nô lệ duy nhất, cấu hình này không hoạt động (máy hiện sóng hiển thị số không trên dòng). Nếu tôi định cấu hình MISO trên bản gốc làm đầu vào có trở kháng cao, tôi có thể thấy với máy hiện sóng rằng điện áp giảm xuống một nửa trong đó các bit của đầu ra từ hai nô lệ khác nhau (về cơ bản là ngắn mạch tôi đoán).
Lưu ý: định cấu hình MISO trên bản gốc là trở kháng cao và làm nô lệ cho mỗi lần kéo, tôi có thể nói chuyện riêng với từng người ngay cả khi có nhiều người trong số họ trên cùng một xe buýt. Ý tôi là, tôi nghi ngờ đó là một vấn đề của chính dòng.
Câu hỏi
Câu hỏi của tôi là, nếu điều này hoàn toàn có thể, và nếu vậy, làm cách nào tôi có thể định cấu hình các chân đầu vào và đầu ra của chủ và các nô lệ để dòng MISO được chia sẻ sẽ hoạt động như logic OR (hoặc logic AND)?
Biên tập
Hóa ra nó trở thành OR với logic phủ định đúng (về cơ bản là AND).
Vấn đề với một nô lệ đã được giải quyết bằng cách viết 1 vào chốt kéo lên trên bản gốc. Trước đây nó có trạng thái ban đầu là 0.
Chỉnh sửa 2
Hóa ra nô lệ ST ghi đè cấu hình GPIO của tôi về MISO dưới dạng mở và đã buộc nó ở mức cao khi một bản được viết. Tôi đã quyết định im lặng SPI và xuất MISO trong trường hợp cụ thể này bằng tay.