Forum: Mikrocontroller und Digitale Elektronik STM32F4 8Bit parallel SPI ?


von Marco (Gast)


Lesenswert?

Hallo,

ich will ein System (master) abfragen mit einem STM32F4 (slave).
Dieses System liefert mir mit ca. 10MHz parallel Daten (8Bit + 2Bit 
Status).
Zum Steuern gibt es eine enable und eine Takt Leitung, also genauso wie 
SPI.

Mein FreeRtos mit Ethernet soll aber noch genug Rechen Zeit bekommen!

Gibt es eine flotte Methode das einzulesen?

Ich glaube das ein normaler Pin-Change-Interrupt wohl nicht reichen 
wird.
DMA wäre glaube ich das beste, aber geht sowas damit überhaupt?


Marco

von Dispol (Gast)


Lesenswert?

Schau Dir mal das SDIO Modul an.
Eine SD-Card kannst Du anstatt mit dem 1-Bit SPI Modus auch in einem 
4-Bit SPI Modus betreiben. Dann sind 4 Datenleitungen im Spiel.
Das SDIO Modul hat 1,4 oder 8.
Ob das allerdings als Slave geht, weiss ich nicht. Das Kamera-Interface 
würde ähnlich arbeiten. Als Slave. Dort müsste man mal schauen, ob das 
auch mit generischen Daten klar kommt

von Detlef K. (adenin)


Lesenswert?

Marco schrieb:
> DMA wäre glaube ich das beste, aber geht sowas damit überhaupt?
Ja das geht.

Wenn Du aber so spezielle Wünsche hast, dann solltest Du eventuell diese 
Chipfamilie nehmne: PSoC 5LP
Das ist ein Cortex-M3 mit etwas programmierbarer Peripherie drumrum.

von Detlef K. (adenin)


Lesenswert?

Dispol schrieb:
> Ob das allerdings als Slave geht, weiss ich nicht. Das Kamera-Interface
> würde ähnlich arbeiten. Als Slave. Dort müsste man mal schauen, ob das
> auch mit generischen Daten klar kommt

Bei den ARMs von Atmel kann man sich ebenfalls sowas "zusammenbasteln".
Das würde mit generischen Daten klar kommen.

: Bearbeitet durch User
von Marco (Gast)


Lesenswert?

Von Atmel bin ich gerade erst weg, weil mir die STM32 Prozessoren 
einfach besser gefallen hatten.

So ein bisschen Logik wäre schon toll, aber dann ist es ein Spezialtyp 
von Prozessor und das will ich einfach nicht mehr haben.
Die beste Spezialtyp Lösung wäre dann auch von XMOS, den XMOS gibt es 
auch  mit eingebauten ARM M3 Kern.
Aber wie gesagt, bitte nur Standard Prozessoren und keine Spezialtypen.

Das mit dem SDIO schaue ich mir mal an.
Das da was von 8Bit steht, habe ich anscheinend übersehen.

Marco

von Marco (Gast)


Lesenswert?

Das mit dem SDIO müsste jemand erklären der sich damit auskennt.

Soweit ich das sehe kann man damit nicht das machen was ich brauche.

Das Kamerainterface könnte möglicherweise funktionieren.
Da muss ich aber erst mal schauen wie ich die gewünschten Signale mit 
meinen Signale hin bekomme. Aber das sollte gehen im Notfall muss ich 
ein Signal invertieren damit es geht.

Danke auf das Kamerainterface wäre ich nie gekommen.

Marco

von Uwe B. (derexponent)


Lesenswert?

der STM kann ein halbes (oder ganzes Port) also 8 oder 16bit
per DMA direkt ins RAM kopieren (mit RAM-Adress increment usw)

falls du deine Signale also so routen kannst, das sie auf
einem gemeinsamen Port liegen, ist das kein Problem

diese Methode benutze ich z.B. in meinem Logic-Analyzer Projekt

Gruss Uwe

von adenin (Gast)


Lesenswert?

Wenn Du DMA einsetzt und dein Master den Takt vorgibt, dann muss(!) der 
Systemtakt mindestens das 14fache betragen. Also wenn dein Master 10MHz 
Ausgabetakt bringt, dann musst dein STM32 mit mindestens 140MHz laufen.
Das ist bei Atmel genauerer beschrieben, warum das so ist, gilt aber 
auch auf dem STM32.

von m.n. (Gast)


Lesenswert?

Marco schrieb:
> ich will ein System (master) abfragen mit einem STM32F4 (slave).

Ich habe es nicht verstanden: der 'slave' fragt den 'master' ab?

adenin schrieb:
> Das ist bei Atmel genauerer beschrieben, warum das so ist, gilt aber
> auch auf dem STM32.

DMA auf diversen ARM-Prozessoren ist herstellerabhängig. Beim STM32F4 
gibt es z.B. keinen ext. DMAREQ; dessen Möglichkeiten bzgl. DMA sind 
eher bescheiden.

von adenin (Gast)


Lesenswert?

m.n. schrieb:
> DMA auf diversen ARM-Prozessoren ist herstellerabhängig. Beim STM32F4
> gibt es z.B. keinen ext. DMAREQ; dessen Möglichkeiten bzgl. DMA sind
> eher bescheiden.

Es gibt die Möglichkeit eines "ext. DMAREQ".
Man muss nur wissen, wozu Dinge missbrauchbar sind.

von npn (Gast)


Lesenswert?

adenin schrieb:
> Es gibt die Möglichkeit eines "ext. DMAREQ".
> Man muss nur wissen, wozu Dinge missbrauchbar sind.

Dann sage es bitte und behalte dein Wissen nicht für dich. Ich wette, 
das würde viele interessieren.

von adenin (Gast)


Lesenswert?

Der CLK des Masters geht an den ETR von einen der Timer des STM32.
Dieser Timer ist so konfiguriert, das er nach einem Zählimpuls den UEV 
erzeugt und so einen DMA-Request auslöst.

Elementar, mein lieber Watson...

von npn (Gast)


Lesenswert?

adenin schrieb:
> Elementar, mein lieber Watson...

Das mag schon sein, mein lieber Holmes :-)
Aber jeder fängt mal an und weiß nicht von Geburt an alles.
Vielen Dank für deine Erläuterungen!

von Marco (Gast)


Lesenswert?

Tricks wollte ich nicht unbedingt benutzen, auch wenn das recht 
interessant ist was Du da gemacht hast.

Ich werde das Kamerainterface benutzen.
Das ganze ist dann austauschbar auf andere Prozessoren mit diesem 
Interface.
Auch wenn ich da so schnell nicht wieder ran will, obwohl so ein M7 wäre 
auch nett dafür.

Da Du dich anscheinend gut auskennst:
Ich bekomme X Daten geliefert (10Bit) die brauche ich aber nachher in 2 
getrennten Arrays (Bit 0-7 Daten) (Bit 8-9 ERROR Status).
Das Kamerainterface speichert die aber als 16Bit Array.
Wie könnte man die Daten umkopieren ohne es von Hand zumachen?
Also eine Art DMA memcpy mit "kopiere nur die Ungeraden/Geraden Bytes".

Für meine Anwendung muss ich extern ein paar Inverter und wenn das mit 
dem kopieren nicht geht noch 2 FlipFlops zur ERROR-Status Speicherung 
einbauen.

Marco

von adenin (Gast)


Lesenswert?

Eigendlich gibt es ja dafür struct.
Aber dafür hätt ich einen Trick, wenn Du umbedingt zwei Arrays willst.

von Arc N. (arc)


Lesenswert?

Marco schrieb:
> Von Atmel bin ich gerade erst weg, weil mir die STM32 Prozessoren
> einfach besser gefallen hatten.
>
> So ein bisschen Logik wäre schon toll, aber dann ist es ein Spezialtyp
> von Prozessor und das will ich einfach nicht mehr haben.

Was heißt Spezialtyp? Bis auf den Core sind die div. Cortex-Mx von 
Atmel, Freescale, NXP, ST usw. usf. auch nicht zueinander kompatibel. 
Ebenso die genannten PSoC5 LP: Core ist ein normaler Cortex-M3, die 
Peripherie was eigenes. So was gab/gibt es von FPGA-Hersteller schon 
länger.

von Marco (Gast)


Lesenswert?

@adenin: Wie geht der Trick?



Mit Spezialtypen meinte ich wirklich diese "Exoten" mit FPGA/2. 
Kern/....
Ich habe lieber normale Standard Ware.
Wenn ich in 5 Jahren das Projekt nochmal ändern will, gibt es mit 
Sicherheit einen Standard Prozessor mit einen ähnlichen Interface.

Das je nach Prozessor Familie Unterschiede gibt sollte doch jeden klar 
sein.

von Detlef K. (adenin)


Lesenswert?

Marco schrieb:
> @adenin: Wie geht der Trick?

Naja, der ist nicht schön, aber selten, und ich würde es auf keinen 
Fall so machen.
Du hast dein BufferArray, wo die DMA die Daten reinschreibt.
Das Array aus dem Du die Daten ausließt beginnt bei der selben Adresse, 
wie das BufferArray.
Das Array für die Statusbits beginnt an der um ein Byte höheren Adresse.
1
uint16_t BufferArray[1025];  //eins mehr als Benutzt werden, weil StatusArray das letzte überragt
2
uint16_t* DataArray;
3
uint16_t* StatusArray;
4
5
DataArray = BufferArray;
6
StatusArray = BufferArray+1;
7
8
//Zum zugreifen du musst aber die unbenötigten Bits maskieren.
9
for(i=0;i<1024;i++)
10
{
11
Data = DataArray[i] & 0x0ff;
12
Status = StatusArray[i] & 0x03;
13
}


Besser ist natürlich über struct.
Und so mach ich das (naja, so ähnlich).
1
typedef struct _sample_t{
2
 uint8_t Data; 
3
 uint8_t Status; 
4
} sample_t;
5
6
sample_t BufferArray[1024];
7
8
for(i=0;i<1024;i++)
9
{
10
Data = BufferArray.Data[i];
11
Status = BufferArray.Status[i];
12
}

Das waren jetzt nur Beispiele und erheben keinen Anspruch auf 
syntaktische Sauberkeit. ;)

Ausserdem könnte es sein, das Du, je nach Verhalten deines Compilers das 
struct als _attribute_ ((_packed_)) definieren musst.
damit das Byte auch wirklich nur 2Byte groß wird. Es könnte sonst 
unerwatete (aber berechtrigte) 8 Byte groß werden.

: Bearbeitet durch User
von Marco (Gast)


Lesenswert?

Das ist ein von Hand kopierren, das kostet aber viel zu viel Zeit.
Hatte da mehr an DMA gedacht.

Nun ja, jetzt ist erst einmal basteln angesagt und das Projekt 
aufsetzen.
Dann werden bestimmt noch mal ein paar fragen aufkommen.

Marco

von Detlef K. (adenin)


Lesenswert?

Marco schrieb:
> Das ist ein von Hand kopierren, das kostet aber viel zu viel Zeit.
> Hatte da mehr an DMA gedacht.

Das ist kein "von Hand kopierren".
Das ist ein "garnichtkopieren".
Die Schleife steht ja nur dafür, das Du irgendwann mal was mit den Daten 
machst und wie Du darauf zugreifen musst.

Hast Du die schon Gedanken machen lassen, ob an dem von Dir gewählten 
Prozessor überhaupt DCMI und Ethernet gleichzeitig möglich ist? Thema: 
Maping der Alternativen Funktionen (AF)

von Marco (Gast)


Lesenswert?

Bin gerade am Pin verteilen.
An dem LGFP176 sollte das aber alles dran passen.
Mal schauen ob das auch an dem 100 oder 144 Pin Typ alles dran passt.

Ich brauche nachher keine misch Arrays
Die Daten müssen als ein Block vorliegen, sonst kann ich die nicht 
weiterverarbeiten.

Ich werde nur 8Bit abfragen und die 2 Statusleitungen anderweitig 
auswerten.

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.