Abgreifen der SPI-Kommunikation mit 328U

Ich versuche, Daten aus einer alphanumerischen 4x14-Segmentanzeige zu extrahieren, die über 2 * 595 in Reihe und 4 Transistoren gesteuert wird. Serielle Daten werden von STM32f103 eingespeist, seine Firmware sollte nicht geändert werden. Das Problem ist, dass Atmega mit 16 MHz nicht mit dem 2,2-MHz-SPI-Takt von ARM zurechtkommt. Und es ist ein kontinuierliches 16-Bit-Wort, Atmega hat nur einen 8-Bit-SPDR-Puffer.

Gibt es eine Ein-Chip-Lösung, mit der ich Daten von der Datenleitung speichern und zwischen den Übergängen mit einem langsameren Takt als Master lesen kann? Ich habe nicht genug Pins, um es parallel zu machen. Wird ein oder verdrahteter (Dioden-) Takt auf 595 funktionieren?

Antworten (4)

Wenn Sie Zugriff auf die 595er haben, können Sie möglicherweise die seriellen Daten aus ihnen heraustakten, nachdem sie vom STM32 geladen wurden. Der ATmega überwacht das Latch-Signal (möglicherweise mit Pin-Change-Interrupt) und taktet dann die Daten über den QH'-Pin des zweiten 595 aus, sobald sie in den Ausgangsregistern gespeichert wurden.

Sie müssten den 595-Takteingang zwischen dem SPI-Takt des STM32 und einem Taktausgang des ATmega umschalten. Wenn der SMT32-Takt niedrig ist, würde ein einfaches ODER-Gatter ausreichen, oder Sie könnten einen Multiplexer aus 4 NAND-Gattern (ein 74HC00-IC) herstellen.

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Latch läuft mit 125 Hz und ich habe 10 Pins.
Ich weiß nicht, wie das passiert ist, es sollte ein Kommentar sein!

Ich mache mir Sorgen, dass ein 328p einem 72-MHz-Cortex-M3 mit DMA nicht gewachsen ist. Die SPI-Taktrate ist nicht das Problem (328p kann bis zu F_CPU/2 gehen), sondern die Inter-Byte-Zeit. Sie können leicht ein Byte erhalten, das SPI-Peripheriegerät gibt Ihnen einen Interrupt. Sie müssen dann dieses Byte verarbeiten/speichern und auf das nächste warten. Wenn der STM32 DMA verwendet, gibt es buchstäblich keine Verzögerung zwischen den Bytes, sodass Sie unabhängig davon, wie Sie den ISR-Code optimieren, Daten verlieren.

Ich würde das Problem mit einem SN74LS674 angehen - 16-Bit-Parallel-In, Serial-Out-Register. Verbinden Sie es mit allen Ausgängen der 595er und lesen Sie über SPI.

Eine Lösung ist ein kleiner 8-Bit-Mikro mit einem SPI-Subsystem, das mit dieser Geschwindigkeit umgehen kann. 2,2 MHz ist für SPI nicht sehr hoch, daher sollten die meisten "modernen" Mikros dies tun und über genügend RAM verfügen, um alles zu puffern. Das Auslesen kann auf jede für den Arduino geeignete Weise erfolgen.

Sie werden wahrscheinlich keinen kundenspezifischen IC für diese Anwendung finden, und wenn doch, ist er teurer als ein kleiner 8-Pin-PIC oder AVR. Mikrocontroller sind heute manchmal billiger als die 595er.

Ich würde vorschlagen, dass Sie überhaupt nicht mit dem Hochgeschwindigkeits-Ausgangsschieberegister arbeiten müssen. Was Sie beschreiben, ist eine einfache Multiplex-Anzeige, bei der die einzelnen Ziffern (14 Segmente) durch die 4 Freigabesignale für relativ lange Zeiträume eingeschaltet werden. Die Datenausgaben sind für jede Ziffer über den gesamten Anzeigezeitraum stabil.

  1. Nehmen Sie die vierstelligen Freigabesignale an 4 328p-Eingangspins, indem Sie die (ich nehme hier an) fallende Flanke verwenden, um einen Interrupt auszulösen. Sie haben jetzt eine ISR für jede Ziffer, da sie aktiviert ist. Da es wahrscheinlich ist, dass die Abtastrate für die Ziffern weniger als 2 kHz oder so beträgt, können Sie davon ausgehen, dass jede Ziffer für etwa 500 us aktiviert ist.

  2. Führen Sie die 14 Segmentdatenbits in 2 * 8: 1-Multiplexer (74HCT151) ein, wobei die Ausgangsbits jeweils zu einem Eingangspin Ihres 328p gehen.

  3. Verwenden Sie drei Ausgangsbits auf dem 328p, um das Bit einzustellen, das vom Low/High-Byte der Segmente empfangen wird.

Für den Code, wenn Sie einen Interrupt von der Ziffer aktivieren:

  1. Setzen Sie select für die Muxes auf Null (0x000).
  2. Lesen Sie das LS-Bit in jedem Byte und speichern Sie den Wert in 2 Speicherstellen für die Ziffer.
  3. Inc wählen, um jedes Bit im Low/High-Byte durchzuschleifen und zu lesen.
  4. Rent

Da die Interrupts niemals in Konflikt geraten, können Sie eine einzelne Routine zum Lesen/Schleifen verwenden und einfach einen Zeiger zum Speichern der niedrigen/hohen Bits einrichten.

Dies würde am Ende eine 2-Chip + MCU-Lösung mit 6 Eingangspins und 3 Ausgangspins sein, die auf dem 328p verwendet werden. Möglicherweise benötigen Sie auch Pullup-Widerstände an den Scan-Transistoren. (Sie müssten einige schematische Informationen bereitstellen, um den Bedarf ermitteln zu können.)