Sind USB-zu-SPI-*Slave*-Bridge-Chips leicht erhältlich?

Ich möchte ein batteriebetriebenes Gerät an USB anschließen, ohne dass Benutzer Treiber installieren müssen. Die Anforderungen an die Datenübertragung sind moderat, daher wären die ~60 kByte/s des HID-Modus in Ordnung, aber ich möchte nicht viel langsamer sein. Der Hauptprozessor wird wahrscheinlich auch dann mit Batterien betrieben, wenn ein USB-Kabel angeschlossen ist. Daher möchte ich, dass der Prozessor immer dann schläft, wenn der PC nicht aktiv kommuniziert.

Ich habe überlegt, eine USB-zu-Seriell-Brücke zu verwenden, aber die, die ich gesehen habe, würden bei den meisten Mikrocontrollern erfordern, dass die Datenrate langsam genug ist, um die Reaktionszeit für Unterbrechungen der seriellen Schnittstelle im schlimmsten Fall zu berücksichtigen. Während alle, die ich gesehen habe, einem Controller erlauben, anzugeben, ob er bereit ist, Daten zu empfangen, hat keiner die Möglichkeit, einen "nicht bereiten" Controller zu bitten, sich bereit zu machen. Alle USB-zu-SPI-Bridge-Chips, die ich gesehen habe, sind darauf beschränkt, als SPI-Master zu fungieren, was die Situation für jeden daran angeschlossenen Mikrocontroller noch schlimmer machen würde.

Eine USB-Schnittstelle, die als SPI-Slave mit einem Interrupt-Pin fungiert, erscheint ideal, da sie sehr schnell kommunizieren kann, wenn der Hauptprozessor kommunizieren möchte, und dem Hauptprozessor mitteilen kann, wann er Aufmerksamkeit benötigt, aber selbst dann keine Daten verlieren würde Der PC sollte es senden, gerade als der Hauptprozessor schlafen gehen wollte (der Interrupt würde innerhalb von etwa 100 Mikrosekunden ein Aufwachen auslösen, woraufhin der Controller fragen könnte, was passiert ist, und dann Daten empfangen könnte). Im Gegensatz zu USB-zu-Seriell- oder USB-zu-SPI-Master-Bridges, die einen nichtflüchtigen Konfigurationsspeicher benötigen, könnte eine USB-zu-SPI-Slave-Bridge von dem SPI-Master konfiguriert werden, mit dem sie verbunden ist, was möglicherweise den Siliziumbedarf reduziert .

Es sollte zumindest möglich sein, einen billigen USB-kompatiblen Mikrocontroller zu verwenden und ihn so zu programmieren, dass er als Brücke fungiert; Wenn jemand so etwas getan und als Open Source veröffentlicht hat, würde ich das genauso schnell verwenden, als es neu zu implementieren. Es könnte möglich sein, einen UART anstelle von SPI zu verwenden, wenn das Gerät Handshaking unterstützt und einen Pin hat, der anzeigt, wann es Daten zu senden hat (auch wenn es zurückgehalten wird); ein solcher Ansatz könnte notwendig sein, wenn ein Mikrocontroller als Brücke verwendet wird, da die meisten Mikrocontroller lausige SPI-Slaves abgeben. Auf der anderen Seite, wenn so etwas als preiswertes Teil von der Stange erhältlich ist, scheint das einfacher zu sein, als Mikrocontroller-Chips kaufen und dann programmieren zu müssen. Hat jemand irgendwelche Empfehlungen?

Nachtrag

Ich hätte vielleicht klarstellen sollen, dass ich versuche, etwas wirklich Billiges zu finden, und evaluiere die Möglichkeiten, entweder einen Hauptcontroller mit integriertem USB zu verwenden oder eine Art Brücke zu verwenden. Die Verwendung einer Brücke kann die Verwendung eines billigeren Hauptprozessors ermöglichen, als sonst erforderlich wäre, und kann das Netzteildesign vereinfachen (da die Brücke über USB mit Strom versorgt werden könnte, ohne sicherstellen zu müssen, dass der Prozessor Strom vom +5-V-USB und nicht vom +6V Batterie, wenn beide Versorgungen verfügbar waren); Selbst wenn Bridge + CPU am Ende ein oder zwei Cent mehr sind als eine USB-fähige Haupt-CPU, könnte die Trennung des USB von den anderen CPU-Funktionen immer noch ein "Gewinn" sein.

Von den Designs, die ich bisher gebaut habe, verwendete mein Favorit einen FT245 in Kombination mit einem CPLD in einer Tastatur/Anzeige/USB-Platine, die über eine 3-adrige SPI-Schnittstelle (zwei Drähte von der Hauptplatine) mit der Hauptplatine kommunizierte ; ein Draht geht zurück). Wenn sich sowohl die Uhr als auch die Daten im Ruhezustand befanden, würde das CPLD die Datenrückgabe verwenden, um anzuzeigen, wann die Haupt-CPU sie warten musste (weil eine Taste gedrückt wurde, Daten auf dem USB angekommen sind, der USB eingesteckt/ausgesteckt war usw .) Die Haupt-CPU könnte dann in ihrer relativen Freizeit aufwachen, das CPLD fragen, was genau es wollte, und tun, was immer getan werden musste. Ich mochte diesen Kommunikationsstil sehr, aber FT245 und CPLD zusammen kosten zu viel. Darüber hinaus könnte die Möglichkeit, HID anstelle von CDC zu verwenden, das Endkundenerlebnis verbessern.

Konzeptionell scheint es, dass ein Chip, der als Brücke zwischen USB und einer CPU dient, die darauf ausgelegt ist, mit ihm zu kommunizieren, elektrisch einfacher und billiger sein könnte als die USB-zu-anderen-Dinge-Schnittstellen, die ich seitdem gesehen habe würde keinen nichtflüchtigen Konfigurationsspeicher benötigen und würde nicht sehr viele Konfigurationsoptionen erfordern - hauptsächlich Aktivierungen für die verschiedenen Endpunkte, möglicherweise einige Zeitüberschreitungen und einen Speicher für Daten, die den Host am Kontrollendpunkt füttern. Die meiste andere Logik würde vom angeschlossenen Prozessor gehandhabt werden. Leider kenne ich kein solches Gerät, das tatsächlich zum Verkauf steht.

Vielleicht kann der FT232H-USB-zu-Multiprotokoll-Seriell-Chip tun, was Sie wollen.
Maxim Integrated bietet die serielle USB-Schnittstellen-Engine MAX3421E, die über den SPI-Port eines externen Mikrocontrollers gesteuert wird. Kaufen oder testen Sie MAX3421EEHJ+ direkt vom Hersteller: maximintegrated.com/en/products/interface/controllers-expanders/… Evaluierungskit und Anwendungshinweise verfügbar. ( Disclosure: Ich arbeite bei Maxim. Dies ist ein älterer Teil, den wir meiner Meinung nach nicht aktiv bewerben, aber er ist immer noch verfügbar. Sie erwähnen die Verwendung von HID-Gerätetreibern, siehe App-Hinweise 3936 und 3937.) Hoffe, das hilft.
Die meisten USB-fähigen Mikrocontroller könnten dies tun, zumindest in dem Maße, in dem dies überhaupt möglich ist. Während Mikros dazu neigen, als SPI-Meister „glücklicher zu sein“, können die meisten auch Sklaven sein.
Wäre so etwas wie Atmega8U2/16U2 zu teuer?
Der Preisunterschied zwischen USB-fähiger MCU und einer Kombination aus MCU+Bridge spricht in den meisten Fällen zugunsten einer einzelnen MCU. Hinzu kommen einfachere und kleinere Leiterplatten, die sich ebenfalls auf den Preis auswirken können. Der einzige Nachteil ist die Notwendigkeit, Ihrem Code einen USB-Stack hinzuzufügen.
@Maple: Der Markt hat sich ein wenig verändert, seit ich die ursprüngliche Frage gestellt habe. Ich stimme sicherlich zu, dass der Preisaufschlag für USB-Funktionalität in einem Mikro heutzutage stark gesunken ist, aber 2014 war er erheblich.
Oh, ich wurde wieder einmal von einer alten Frage getäuscht. Was macht dieser Community-Bot, der jeden Tag mehr und mehr Relikte hochschiebt?!

Antworten (3)

Der FTDI-USB-zu-Seriell-Konverter folgte meiner MCU im SPI-Slave-Modus.

Die Firmware würde einfach Daten zwischen dem SPI-In-Port und der Tx-Leitung übertragen, um sie über den FTDI an den USB-Port zu senden.

In ähnlicher Weise würde die Firmware Rx-Daten vom USB-/seriellen Anschluss zwischenspeichern und im SPI-Tx-Puffer ablegen, um darauf zu warten, zurückgelesen zu werden.

Einfache Lösung mit zwei ICs, um USB-zu-SPI-Slave zu erreichen.

Kennen Sie Controller mit einem anständigen SPI-Slave-Modus? Alle, die ich gesehen habe, erfordern, dass die SPI-Byterate langsam genug eingestellt wird, dass die Zeit zwischen den Bytes immer die längste Zeit überschreitet, die der Controller möglicherweise (ununterbrochen) einer anderen Aufgabe widmen muss.
welche hast du dir angeschaut? Keine Geschwindigkeitsbeschränkungen mit PICs, soweit mir bekannt ist. Sie erhalten einen Interrupt, wenn die Daten vollständig empfangen wurden, kopieren Sie den Wert aus dem Puffer und löschen Sie den Interrupt, die Arbeit ist erledigt. Dann kann Ihre Hauptschleife bei Bedarf analysieren, bei Bedarf eine Antwort vorbereiten oder die Daten stromaufwärts zum FTDI spritzen, das sie über einen USB-/seriellen Tunnel leitet. Im Gegensatz zu Downstream-Daten besteht der Hauptunterschied darin, dass Sie beim Empfangen von Daten vom PC diese möglicherweise in einem Puffer speichern müssen, der darauf wartet, dass der SPI-Master die Daten extrahiert.

Ich denke, aus Kosten- und Platzgründen wäre ein USB-fähiger uC (z. B. der ATTiny85) der beste Ansatz. Sie können es an jedes Protokoll anpassen, das Ihre Haupt-CPU sehen soll, es verfügt über ein paar hundert Bytes RAM zum Puffern, während der Weck-Interrupt verarbeitet wird, und es ist ein SOP-8, das buchstäblich ein paar Cent kostet.

ATTiny85 ist nicht USB-fähig.
@dim du hast recht, sorry ... ich habe völlig vergessen, dass diese winzigen Module eigentlich eine Zwei-Chip-Lösung mit separatem USB-Transceiver sind.

Dieser FTDI-Chip arbeitet als I2C-Slave und scheint relativ billig zu sein:

http://www.ftdichip.com/Support/Documents/DataSheets/ICs/DS_FT200XD.pdf

Und dieser arbeitet als SPI-Slave:

http://www.ftdichip.com/Support/Documents/DataSheets/ICs/DS_FT220X.pdf

Ich glaube, der FT220X benötigt seine lizenzfreien Treiber und fungiert nicht als HID.