Portextension: SPI mit AVR und CPLD

Gast #454686
Lesenswert?
• ▲
▼
An einen AVR Microcontroller soll eine Porterweiterung mit der USI 
Schnittstelle angeschlossen werden. Wie schon öfter beschrieben, können 
hierfür externe Schieberegister (74LS165 /74LS595) benutzt werden.  In 
der hier vorgeschlagenen Lösung wird aber ein einfacher programmierbarer 
CPLD Baustein verwendet, der mit der XILINX Entwicklungsumgebung als SPI 
Slave programmiert wird. Der xc9572xl ist kostengünstig zB. bei Reichelt 
erhältlich und wird mit den Funktionen beider Schieberegister 
programmiert. Für die Hardwarebeschreibung des CPLD Bausteins wird eine 
Kombination aus VHDL und  Schaltplaneingabe benutzt. Die SPI Funktion 
wird nicht in VHDL modelliert, sondern als Schaltplanmodul eingebunden. 
8 Bit Ausgabe und 8 Bit Eingabe können in einen SPI Zyklus übertragen 
werden. Dies hat den Vorteil das nur wenig Resourcen im Baustein 
benötigt werden, mehr als drei Viertel  stehen für weitere 
Logikfunktionen, die dann auf VHDL Ebene modelliert werden können, zur 
Verfügung. Ein externer Takt wird in dem vorliegenden Entwurf für den 
CPLD nicht benötigt, da das Timing über SCLK des SPI realisiert wird.
In dem .zip Archiv sind enthalten: C Programm (CodevisionAVR) mit 
eingebundener Assemblerroutine zur Datenübertragung über die USI 
Schnittstelle eines ATtiny2313 als SPI Master, Schaltplan des SPI Slave 
und VHDL Top Level Modul  für XILINX Entwicklungsumgebung. UCF Datei zur 
CPLD Portdefinition, JED Datei zum Download mit Impact. Schaltbild der 
Verbindung AVR - CPLD.

Die Kommunikation wurde getestet, ein 8 Bit Wert vom xc9572 wird über 
SPI zum ATtiny übertragen und anschließend wieder über SPI zum xc9572xl 
zurückgeschrieben und dort ausgegeben. Mit einem Takt von 8 Mhz für den 
Atmel ergab sich eine SPI Clockfrequenz von ca 1 Mhz.


Angehängte Dateien:
#454881
Lesenswert?
• ▲
▼
Ja, sowas ähnliches hatte ich auch mal mitm ATV750 (20 Macrozellen) 
gemacht (siehe Anhang).

Ist ja nur ein Schieberegister mit nachgeschaltetem Latch.

Das sind dann 12 Codezeilen in CUPL, Schaltplaneingabe hätte zu lange 
gedauert.

Ich hab auch noch ein Fast-Reset mit drin, wenn STB und CLK gleichzeitig 
1 sind, werden die Ausgangsregister sofort rückgesetzt.

Mit STB werden die Ausgangsregister gesetzt und das Schieberegister auf 
parallel Laden umgeschaltet.


Der XC9572 hat ja viel mehr Macrozellen, müßte für mindestens 35 
Eingänge und 35 Ausgänge reichen.


Peter
Angehängte Dateien:
Gast #454899
Lesenswert?
• ▲
▼
kann man damit auch einen bidirektionalen portexpander aufbauen (also 
jeder pin umschaltbar zwischen in und output) oder habe ich da was 
falsch verstanden? ich brauche sowas um per cpld einen flash zu 
beschreiben und aus zu lesen der da dran hängt
Gast #454994
Lesenswert?
• ▲
▼
Im vorliegenden Konzept sind jeweils 8 getrennte Inputs und Outputs 
verfügbar. Bidirektionalität von I/O Pins und weitere Ansteuerlogik kann 
dann aber zusätzlich im Toplevel VHDL Modul modelliert  werden.

Axel

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.