In meinem Design tauchte ein unerwarteter Bedarf auf, der darin besteht, 2 Slave-SPI-Geräte gleichzeitig zu steuern. Zuerst hatte ich natürlich vor, den SPI-Bus wie gewohnt zu verwenden und beide Geräte über die /CS-Pins zu steuern, damit alles in Ordnung schien.
Als ich heute das Datenblatt von Gerät A durchgesehen habe, ist mir aufgefallen, dass es alle Daten auf einmal erwartet, was bedeutet, dass ich das ursprünglich geplante Verfahren nicht durchführen kann:
1) Gerät B auswählen 2) Daten von B lesen 3) Gerät B abwählen 4) Gerät A auswählen 5) Daten von B schreiben 6) Gerät A abwählen 7) Wiederholen, bis alle Daten von B zu A gehen (ca. 1,1 Mbit)
Das Gerät A nimmt an, dass es das Ende des Datenstroms ist, wenn sein /CS hoch geht. Natürlich kann ich nicht alles von B in einem Durchlauf lesen und im MCU-RAM speichern, da die Daten viel größer sind.
Als nächstes kam mir natürlich in den Sinn, 2 separate Master-SPIs gleichzeitig zu verwenden: beide Chips auswählen, Byte von B einlesen und sofort A zuführen.
Also meine Fragen sind:
a) Ist das mit einem ATmega32u4 möglich? Es spielt eine entscheidende Rolle im Gesamtdesign und der Wechsel zu einer anderen MCU wäre ein Schritt zurück.
b) Ich habe gelesen, dass der USART als zweiter SPI-Master fungieren kann. Ist das praktikabel und zuverlässig? Wie schwer ist die Umsetzung?
c) Wenn das leider nicht möglich ist und ich die MCU wechseln muss, welche würden Sie empfehlen? Beachten Sie, dass die USB-Fähigkeit des ATmega32U4 unerlässlich ist.
d) Wird der neue Prozess (Lesen von B, Zuführen zu A) wahrscheinlich ein unerwartetes Verhalten hervorrufen? Scheint aus meiner Sicht nicht, ich frage nur für den Fall, da ich ein neuer Ingenieur bin.
Jede andere Idee oder Richtung ist willkommen! Vielen Dank im Voraus.
UPDATE Falls es eine bedeutende Rolle spielt, Gerät A ist ein FPGA, während B ein Flash-Speicher ist. Die MCU hat eine doppelte Rolle: Laden Sie den Bitstream vom PC über USB herunter und speichern Sie ihn auf dem Flash-ROM / verwenden Sie den gespeicherten Bitstream, um das FPGA beim Zurücksetzen/Einschalten zu konfigurieren. Sowohl FPGA als auch Flash verwenden SPI. Laut Datenblatt des FPGA (ice40-Familie, Lattice, „ iCE40-Programmierung und -Konfiguration “, S.26) muss das Bild ohne Unterbrechung programmiert werden.
Vielleicht möchten Sie einen ganz anderen Ansatz wählen. Anstatt sowohl das PROM als auch das FPGA als Slave-Geräte an den µC anzuschließen, schließen Sie das PROM direkt an das FPGA an und lassen Sie das FPGA im SPI-Master-Modus statt im SPI-Slave-Modus booten. Bonus: Das Booten geht schneller.
Sie können weiterhin vom µC aus auf das PROM zugreifen, nachdem das FPGA für Firmware-Updates oder Datenspeicherung gebootet hat, indem Sie die SPI-Schnittstellensignale des µC durch die FPGA-Logik leiten.
a) Afaik der Atmega hat nur 1 SPI-Bus.
b) Keine Erfahrung (aber ich bin Anfänger)
c) Ich verwende meistens STM#2. Diese haben 2 SPI-Busse und wenn Sie mehr benötigen, gibt es Versionen mit 3 (oder möglicherweise sogar mehr). Der billigste (kostet weniger als ein Arduino) STM32F103C8T6 hat 2 SPI-Busse.
d) Die SPI-Busse auf dem STM32 (und wahrscheinlich anderen UCs) sind unabhängig, daher sollte es keine Probleme mit dem Prozess geben. Da STM32 jedoch über DMA verfügt, können Sie dies möglicherweise "direkt" tun, dh eingehende SPI-Daten sofort an das ausgehende SPI senden.
Sie geben an, dass das FPGA das Ende der Konfigurationsdaten annimmt, wenn CS deaktiviert wird. Gibt es auch ein Timeout? Das heißt, wenn Sie eine unbestimmte Verzögerung haben können, während Sie CS aktiv lassen, wird sich das Gerät dann richtig verhalten?
Wenn einfach verhindert werden muss, dass das FPGA-Gerät die Transaktion schließt, kann das Problem dahingehend vereinfacht werden, dass CS ausgewählt bleibt, während nicht zugelassen wird, dass Befehle an den Flash als Datenmüll eingelesen werden. Dafür ist ein zweiter SPI-Master vielleicht zu viel des Guten
Ich würde vorschlagen, ein Puffergerät zwischen MCU und FPGA für die MISO
, MOSI
, und SCLK
Leitung zu verwenden und dieses zu verwenden, um die SPI-Signale zu deaktivieren, indem der Reset/Enable-Pin am Puffergerät verwendet wird.
Die Transaktion würde aussehen
USART als SPI-Master
Wie das Datenblatt in Kapitel 19 sagt,
Der universelle synchrone und asynchrone serielle Empfänger und Sender (USART) kann auf einen Master-SPI-kompatiblen Betriebsmodus eingestellt werden.
So können Sie zwei unabhängige SPI (Master)-Ports haben, um Daten zwischen den Slaves zu übertragen.
Verwendung eines externen I 2 C-EEPROM
Anstelle eines SPI-Flashs können Sie ein I 2 C-EEPROM an den TWI-Port (PD0, PD1) der MCU anschließen. I 2 C wird in Atmel-esisch TWI oder 2-wire Serial Interface genannt , aber sie sind im Wesentlichen dasselbe. Nachteil: EEPROMs sind im Allgemeinen teurer als Flash-Speicher.
TurboJ
Lange Pham
Manos
CapnJJ
Manos
Manos
CapnJJ
Manos