Làm cho xe buýt dùng chung hoạt động như HOẶC


10

Đố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à nnô 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 nlớn và không đủ không gian cho ncá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

  1. Hóa ra nó trở thành OR với logic phủ định đúng (về cơ bản là AND).

  2. 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.


Tôi ghét hỏi, vì tôi chắc rằng bạn đã nghĩ về nó, nhưng bạn đã cân nhắc sử dụng I2C hay CAN chưa? Chúng được thiết kế cho n thiết bị, trong khi SPI thực sự được thiết kế để sử dụng với chip chọn cho từng thiết bị.
Bob

@bob, vâng. Họ quá chậm. Dù sao, nếu câu trả lời cho câu hỏi của tôi là "không thể", thì chúng ta chỉ cần thực hiện một chút công việc thủ công, nhưng sản phẩm cuối cùng vẫn tốt hơn nhiều với SPI.
Shahbaz

1
Thật đáng tiếc khi bạn đang sử dụng 32 bit làm địa chỉ vì nếu bạn đang sử dụng 24 bit (16.772.216 biến thể), bạn có thể gửi lệnh "khám phá" và đợi 16.772.216 đồng hồ và bạn có thể có tất cả thông tin nô lệ của mình. Với tốc độ 10Mb / giây sẽ mất ít hơn 2 giây và không có xung đột để tìm ra. Hey ho - bạn đã cho tôi suy nghĩ +1 cho điều đó.
Andy aka

@Andyaka, 24 bit cũng có thể không tệ (nhưng 32 bit chắc chắn tốt hơn). Nếu tôi hiểu bạn một cách chính xác, bạn có nghĩa là mỗi nô lệ trả lời đồng hồ thứ nhất của nó bằng 1 và chủ nhân nhìn vào đồng hồ nào tạo ra một đồng hồ? Điều đó không tệ, ngoại trừ nô lệ trả lời theo byte. Vì vậy, mỗi nô lệ trả lời với 8 bit, và trừ khi tôi có thể làm cho bus hoạt động như OR, thì phản hồi từ một nô lệ bị "mất" trong các phản hồi của nô lệ khác (tất cả 1 từ một nô lệ bị kéo xuống bởi 0 phần còn lại).
Shahbaz

@Shahbaz nếu bạn có quyền kiểm soát mã của nô lệ, bạn có thể biến điều này thành "đặc biệt" trong đó nô lệ chỉ trả lời với 1 bit tại thời điểm được phân bổ của họ. Vâng, bạn có ý chính của suy nghĩ của tôi.
Andy aka

Câu trả lời:


5

SPI mà không cần chọn là những gì Microchip sử dụng trên chip MCP23017 của họ (và các loại khác). Không có gì sai với cách tiếp cận đó.

Vâng, những gì bạn muốn là có thể, nhưng bạn phải làm cho nô lệ được thoát nước. Bạn có thể gian lận bằng cách đặt một diode (schottky) nối tiếp với mỗi đầu ra nếu bạn không thể khiến chúng hoạt động như một cống mở.

Cách tiếp cận liệt kê của bạn giống như được sử dụng bởi xe buýt một dây Dallas để liệt kê và xe buýt CAN để phân xử.

Nhưng một nhược điểm nghiêm trọng trong cách tiếp cận của bạn là tốc độ hiện bị giới hạn bởi thời gian tăng, được điều khiển bởi điện trở kéo lên. Điều này sẽ chậm hơn so với khi được điều khiển bởi một đầu ra đẩy và có thể sẽ giới hạn tốc độ mà bạn có thể vận hành xe buýt.

Nếu bạn có hai ghim dự phòng trên mỗi nô lệ, bạn có thể xâu chuỗi chúng và có sơ đồ liệt kê dựa trên vị trí của chúng trong chuỗi cúc.


Có, tôi đã quên đề cập đến việc tôi cũng được thông báo rằng tôi cần giảm tốc độ (điều mà tôi đã làm khoảng 20 lần (giảm từ 4Mpbs xuống 128Kb / giây)). Đó là giai đoạn ban đầu và thuật toán của tôi có thể xử lý tốc độ chậm hơn (nó vẫn khá nhanh). Thật không may, tôi nghi ngờ chúng ta sẽ thiết kế lại phần cứng ngay bây giờ. Chi phí không chỉ đơn giản là bỏ qua giai đoạn này và nói cho chủ biết những gì ids mong đợi.
Shahbaz

Quay lại câu hỏi, tôi đã cấu hình nô lệ là cống mở. Tôi nên cấu hình máy chủ như thế nào?
Shahbaz

1
Không có gì đặc biệt ở chân MISO của chủ, ngoại trừ pullup. Tôi nghi ngờ bạn sẽ đạt 128Kb / giây với thiết kế kéo lên, nhưng YMMV. Đọc một số tài liệu I2C chuyên sâu có thể giúp ích, đó là xe buýt có dây hoặc kéo lên, vì vậy mọi thủ thuật được áp dụng ở đó có thể giúp bạn.
Wouter van Ooijen

Cảm ơn rất nhiều. Tôi sẽ thử làm chậm xe buýt hơn nữa để xem điều gì sẽ xảy ra. Tôi đoán cuối cùng tôi cũng phải nghiên cứu và hiểu ý nghĩa của việc kéo lên, thoát nước và những thứ khác thực sự có ý nghĩa gì. (Kỹ sư phần mềm ở đây!)
Shahbaz

1
Đặt một máy hiện sóng trên xe buýt và kiểm tra những gì xảy ra. Thời gian tăng có thể quá chậm, nhưng cũng có thể có tiếng chuông.
Wouter van Ooijen

4
  • Đặ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).

Bạn cần kiểm tra điện trở tương đương của chân i / o chính trong chế độ kéo lên.

Thông thường, chế độ kéo lên có điện trở rất cao, có thể 50 kOhms hoặc cao hơn. Nó nhằm giữ cho pin không bị trục trặc do emi hoặc tiếng ồn khác hoặc để đặt mặc định cho các tín hiệu điều khiển rất chậm, đồng thời không lãng phí quá nhiều năng lượng khi làm điều đó.

Như Wouter đã chỉ ra, trong một chiếc xe buýt mở, tốc độ bị giới hạn bởi điện trở kéo lên. Giá trị điện trở cao hơn làm cho xe buýt chậm hơn. Các giá trị tiêu biểu trong I2C (đạt 100 hoặc 400 kHz) là 1 đến 5 kOhms. Bạn sẽ muốn một lực cản kéo lên tương tự để đạt được tốc độ tương tự.

Tôi nghĩ rằng bạn cần sử dụng một điện trở kéo lên bên ngoài (từ 1 đến 5 kOhms hoặc hơn) thay vì kéo lên pin i / o của chủ để làm cho sơ đồ này hoạt động.


Cảm ơn những gợi ý. Tôi không phải là một anh chàng điện tử, nhưng tôi phải nhờ đồng nghiệp xem qua đề nghị của bạn. Tôi cần có dây - hoặc chỉ cho một pha ban đầu của chương trình và trong pha thông thường, pin không được cấu hình là kéo lên. Vì vậy, có lẽ điện trở bên ngoài không phải là một lựa chọn.
Shahbaz

Nếu bạn có một pin i / o miễn phí trên micro chính, bạn có thể kết nối nó với xe buýt thông qua, giả sử, 5 kOhms. Sau đó bật nó lên cao trong quá trình liệt kê xe buýt và biến nó thành Z cao trong quá trình giao tiếp bình thường.
Photon

1

Để một chiếc xe buýt có dây và hoạt động, các nút trên xe buýt cần phải thoát nước, tức là chúng phải truyền đi

  • logic thấp bằng cách kéo xuống mạnh mẽ, và
  • logic cao bằng cách ngắt kết nối từ xe buýt.

Hơn nữa, xe buýt phải được kéo lên yếu.

Hành vi kỳ dị mà bạn thấy với một chủ nhân không truyền và một nô lệ truyền duy nhất có thể được giải thích bằng cách chủ nhân kéo lên mạnh mẽ hoặc nô lệ kéo xuống yếu.

Bạn cần xác định điều nào ở trên đang xảy ra.

Đặt nô lệ vào chế độ trở kháng cao và kết nối xe buýt với mặt đất thông qua điện trở 10k. Nếu điện áp đường dây không thay đổi đáng kể, thì chủ sẽ tăng mạnh và bạn cần khắc phục điều đó. Mặt khác, làm thủ tục tương tự với Slave (lần này kết nối điện trở với Vcc); nếu điện áp đường dây tăng đáng kể, nô lệ sẽ kéo xuống yếu (sửa nó). Nếu không, hãy tìm những biến dạng không gian thời gian trong khu vực xung quanh bạn.


Xin lỗi vì sự thiếu hiểu biết của tôi trong thiết bị điện tử, nhưng nếu nô lệ kéo xuống mạnh mẽ, điều đó không làm cho xe buýt hoạt động như AND? Tôi đang nói vì những nô lệ muốn cao đang ngắt kết nối và những người muốn thấp đang kéo xuống, vì vậy kết quả chung là xuống, phải không?
Shahbaz

@Shahbaz, xấu của tôi, tất nhiên xe buýt sẽ có dây - và, tôi đã sửa câu trả lời. Nếu bạn muốn có dây - hoặc, chỉ cần đảo ngược các cực (chủ kéo xuống yếu, nô lệ kéo mạnh lên).
avakar

Đọc trên wikipedia, tôi nhận ra rằng họ gọi nó là có dây - và hoặc có dây - hoặc với logic - đúng.
Shahbaz

1

Tôi sẽ đề nghị có một động tác kéo lên hoặc kéo xuống thụ động trên xe buýt (tôi sẽ giả sử kéo lên) và có nô lệ chủ động lái xe buýt (lái xe cao và lái xe thấp) khi họ có điều gì đó để nói và thả nổi . Có các lệnh địa chỉ truy vấn lấy địa chỉ và mặt nạ và hướng dẫn mỗi nô lệ xuất 00 hoặc không làm gì (tiếp tục thả đầu ra của nó) dựa trên việc nó có thích địa chỉ và mặt nạ không. Nếu có thể, hãy để chủ nhân lái xe buýt cao một thời gian trước khi nô lệ bắt đầu lái nó. Tùy thuộc vào cường độ kéo lên và liệu chủ có lái xe buýt cao hay không, trước khi nô lệ được phép kéo thấp, có thể cần phải hạn chế tốc độ xe buýt trong giai đoạn thiết lập. Mặt khác, khi thiết lập xong,


Nếu hai nô lệ chủ động lái xe cao và thấp, tôi dự kiến ​​sẽ đọc gì từ xe buýt?
Shahbaz

Người ta nên tránh bao giờ có một nô lệ cố gắng lái xe cao trong khi một người khác đang lái xe thấp. Một nô lệ chỉ nên lái xe buýt khi (1) nó biết đó sẽ là điều duy nhất làm như vậy, hoặc (2) nó biết rằng nó và mọi người khác đang lái xe buýt sẽ lái nó ngược lại với sự nhàn rỗi thụ động của nó tiểu bang.
supercat

Điều này có nghĩa là gì? ... việc mỗi nô lệ được chọn chủ động lái cả cấp cao và cấp thấp sẽ cho phép xe buýt đến ...
Shahbaz

@Shahbaz: Khi một nô lệ có điều gì đó để nói, nó nên chủ động lái xe buýt lên cao để truyền các bit "1" và thấp để truyền các bit "0". Khi một nô lệ không có gì để nói, nó không nên lái xe buýt. Lưu ý rằng việc nô lệ chủ động lái xe buýt lên cao khi họ muốn gửi bit "1" sẽ cho phép xe buýt hoạt động nhanh hơn nhiều so với việc dựa vào lực kéo thụ động để lái xe buýt cao.
supercat

@Shahbaz: Điều mà supercat đang cố nói, là ở trạng thái liệt kê, một điện trở sẽ kéo lên dòng và nô lệ chỉ nên gửi "0" hoặc không có gì (đầu ra cống mở), nhưng sau đó, trong giao tiếp bình thường, chỉ một một nô lệ nên hoạt động tại một thời điểm và nô lệ hoạt động sẽ gửi "0" hoặc "1" (đầu ra bình thường). Do đó, điện trở kéo lên và điện dung dòng chỉ giới hạn tốc độ bit trong quá trình liệt kê. Sau đó, trong giao tiếp bình thường, tốc độ bit có thể cao hơn, vì lái xe chủ động cho phép.
Laszlo Valko
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.