Forum: Projekte & Code Portextension: SPI mit AVR und CPLD


von Axel Schnell (Gast)


Angehängte Dateien:

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.



von Peter D. (peda)


Angehängte Dateien:

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

von Axel Schnell (Gast)


Lesenswert?

Lieber Peter,

ich bin immer wieder beeindruckt über die sehr kompakten Entwürfe von 
Ihnen.
(zb. rc5 dekoder). Meine Hochachtung.

Axel

von Lupin (Gast)


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

von Axel Schnell (Gast)


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

von Falk (Gast)


Lesenswert?

@ Lupin

Ja, das geht, man braucht aber für jedes Pin zwei Bit, eins für die 
Richtung und eins für die Daten. Ds gibts aber auch schon fertig als IC, 
z.B. 74HC299.

MFG
Falk

von Peter D. (peda)


Lesenswert?

Falk wrote:

> Ja, das geht, man braucht aber für jedes Pin zwei Bit, eins für die
> Richtung und eins für die Daten. Ds gibts aber auch schon fertig als IC,
> z.B. 74HC299.

Nö, der 74HC299 hat nur ein gemeinsames /OE für alle.
Aber für nen Datenbus reicht das ja.

Die CPLD-Ausgänge haben auch alle nen OE-Term.


Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.