Forum: Mikrocontroller und Digitale Elektronik STM32H7 SPI HW-Fifos


von Hans-Georg L. (h-g-l)


Lesenswert?

Hat hier schon mal jemand mit den STM32H7 SPI HW-Fifos gearbeitet ?

3 der H7 SPIs haben Sende und Empfangs Fifos von jeweils 16Bytes.
Ich möchte die benutzen um externe registerbasierte Slaves (Full duplex) 
anzusteuern. Dazu muss ich 1 Byte Registeradresse senden und 3 Byte 
(24bit) Registerinhalt zurück lesen und das ganze für 3 Register, die 
nicht hintereinander liegen. Das ergibt insgesamt 3 Byte senden und 9 
Byte zurück lesen. Von den Fifos her passt es. Nur die Frage ist lässt 
sich das so Konfigurieren das der H7 das ohne zutun von CPU oder DMA nur 
mit Hilfe des SPI Controllers macht und nur ein "fertig"(treshold ?) 
Interrupt liefert.
Das ich den Empfangsfifo mehr als die Hälfte beschreibe stört nicht weil 
die Daten nicht kontinuierlich kommen sondern eine Pause dazwischen ist 
in der das Fifo geleert wird. Endziel wäre die Abfrage im 2,5µs Takt mit 
3 SPI und 3 Slaves parallel ohne Interrupt Orgien zu machen.

von m.n. (Gast)


Lesenswert?

Hans-Georg L. schrieb:
> Dazu muss ich 1 Byte Registeradresse senden und 3 Byte
> (24bit) Registerinhalt zurück lesen und das ganze für 3 Register, die
> nicht hintereinander liegen.

So wie ich Dich verstanden habe, kann das per DMA nur dann klappen, wenn 
die Übertragung mit nur einem durchgehenden /SS-Signal auskommt. Wird 
für jede neue Registeradresse ein neuer /SS-Zyklus benötigt, geht das 
wohl nur mit "TI mode transfer".
Welchen Baustein willst Du denn auslesen?

von Hans-Georg L. (h-g-l)


Lesenswert?

m.n. schrieb:
> Hans-Georg L. schrieb:
>> Dazu muss ich 1 Byte Registeradresse senden und 3 Byte
>> (24bit) Registerinhalt zurück lesen und das ganze für 3 Register, die
>> nicht hintereinander liegen.
>
> So wie ich Dich verstanden habe, kann das per DMA nur dann klappen, wenn
> die Übertragung mit nur einem durchgehenden /SS-Signal auskommt. Wird
> für jede neue Registeradresse ein neuer /SS-Zyklus benötigt, geht das
> wohl nur mit "TI mode transfer".
> Welchen Baustein willst Du denn auslesen?

Die Bausteine sind 3 x TDC7200 und soweit ich die H7 SPI verstanden habe 
sollte das direkt mit den eingebauten Hardware Fifos funktionieren. Das 
auslesen der Fifos kommt dann später mit oder ohne DMA. Muss ich wohl 
experimentieren wenn alles mal aufgebaut ist oder ein FPGA einsetzen.
Das ganze soll so eine Art TAPR TICC werden nur mit 3 Kanälen und viel 
höherer Samplerate.

: Bearbeitet durch User
von m.n. (Gast)


Lesenswert?

Beim TDC7200 muß für jeden Zugriff auf eine wahlfreie Adresse CSB neu 
aktiviert werden. Das wird mit DMA wohl nicht klappen. Eine Kette von 
ISR-Aufrufen hingegen würde gehen oder auch ein Timer.
Bei rund 500 MHz und Cache laufen ISRs recht flott!

Die max. Abtastrate wird durch die max. SPI-Geschwindigkeit von 20 MHz 
begrenzt. Da würde auch ein schneller FPGA nicht helfen. Kleiner Trost: 
der TDC7200 läuft auch noch mit 25 MHz SPI-Takt.
Wegen des Rauschens des TDC lohnt es sich nicht, den TDC_CAL2-Wert 
auszulesen und zu verrechnen. TDC_TIME1 und TDC_CAL1 reichen völlig aus.

Bei drei Kanälen wäre der AS6500 evetuell eine Alternative. Das Teil hat 
vier Kanäle, rauscht deutlich weniger, misst ab 0 ns und hat die 
Ergebnisregister in direkter Reihenfolge bei höherer max. SPI-Frequenz 
(50 MHz), kann aber auch nur über einen einzigen SPI-Kanal angesprochen 
werden.
Nur als Überlegung.

von m.n. (Gast)


Lesenswert?

Vielleicht nutzt es etwas: 
Beitrag "Re: Probleme beim STM32H743 & SPI"

von PittyJ (Gast)


Lesenswert?

Ich muss ja sagen, dass ich nicht versuchen würde, 3 Spi Busse 
gleichzeitig mit diesem genauen Timing/Frequenz einzulesen.
Die CPU hat bei mir oft noch etwas mehr zu tun, und dann kommt das 
gesamte System ausser Takt, wenn USB mal wieder dazwischen-interrupted.

Ich würde wirklich ein FPGA nehmen, was die 3 Chips versorgt, und die 
Nutzdaten in einen internen Fifo/Buffer schreibt. Diese können dann in 
einem Block, asynchron von der CPU gelesen werden.

Spi ist auf FPGA-Ebene nicht all zu kompliziert, und eine State-Maschine 
könnte ja alle 3 Slaves gleichzeitig bedienen, mit jeweils nur einer 
eigenen Miso Leitung.

von m.n. (Gast)


Lesenswert?

PittyJ schrieb:
> Die CPU hat bei mir oft noch etwas mehr zu tun, und dann kommt das
> gesamte System ausser Takt, wenn USB mal wieder dazwischen-interrupted.

USB hat eigene Puffer und kann daher mit geringer Priorität abgearbeitet 
werden. Aber das Problem ist ja auch (mal wieder) aus der Luft 
gegriffen.

PittyJ schrieb:
> Ich würde wirklich ein FPGA nehmen, was die 3 Chips versorgt,

Um den Aufwand überschaubar zu halten, würde ich eher 3 x ATtiny nehmen, 
die den seriellen Datenstrom für die Ausgabe erledigen. Es sind ja immer 
konstante Befehle. Der Empfang kann über SPI + DMA im Hintergrund 
laufen.
Letztlich kann das der H7 alles selber erledigen.

von Hans-Georg L. (h-g-l)


Lesenswert?

m.n. schrieb:
> Beim TDC7200 muß für jeden Zugriff auf eine wahlfreie Adresse CSB neu
> aktiviert werden. Das wird mit DMA wohl nicht klappen. Eine Kette von
> ISR-Aufrufen hingegen würde gehen oder auch ein Timer.
> Bei rund 500 MHz und Cache laufen ISRs recht flott!
>
> Die max. Abtastrate wird durch die max. SPI-Geschwindigkeit von 20 MHz
> begrenzt. Da würde auch ein schneller FPGA nicht helfen. Kleiner Trost:
> der TDC7200 läuft auch noch mit 25 MHz SPI-Takt.
> Wegen des Rauschens des TDC lohnt es sich nicht, den TDC_CAL2-Wert
> auszulesen und zu verrechnen. TDC_TIME1 und TDC_CAL1 reichen völlig aus.
Bei meinen ersten Versuchen, vor 2 Jahren mit den TDC7200 habe ich auch 
festgestellt, das mehr Referenzzyklen nicht viel mehr bringen. Das 
Rauschen lag bei +/- 100ps max für einen single shot, 200ns Messzeit und 
Modus 1. Ein zusätzliche Referenzperiode muss ja mit gemessen werden 
weil der TDC nicht unter 12ns messen kann.

> Bei drei Kanälen wäre der AS6500 evetuell eine Alternative. Das Teil hat
> vier Kanäle, rauscht deutlich weniger, misst ab 0 ns und hat die
> Ergebnisregister in direkter Reihenfolge bei höherer max. SPI-Frequenz
> (50 MHz), kann aber auch nur über einen einzigen SPI-Kanal angesprochen
In einem Thread in der time-nuts mailliste war der AS schlechter wie der 
TDC ...
Der AS6500 war mir zu teuer, deshalb habe ich mir 2 AS6501 (2 Kanal) 
besorgt. Aber das wird ein weiteres Projekt, die werde ich aber nicht 
über SPI sondern über LVDS mit einem FPGA auslesen. Da will ich bei 
10Mhz jede Periode samplen und in einen Histogram Speicher lesen. Aber 
erst mal ist der TDC7200 dran.

von m.n. (Gast)


Angehängte Dateien:

Lesenswert?

Hans-Georg L. schrieb:
> In einem Thread in der time-nuts mailliste war der AS schlechter wie der
> TDC ...

Gib mir einen Link - die mache ich fertig!
Es stimmt eben nicht. Siehe Anlage.

Hans-Georg L. schrieb:
> Der AS6500 war mir zu teuer, deshalb habe ich mir 2 AS6501 (2 Kanal)
> besorgt.

Bei Mouser war es genau anders herum; den AS6501 habe ich wegen der 
besseren Lötbarkeit genommen und weil zwei Kanäle reichten.

> Aber das wird ein weiteres Projekt, die werde ich aber nicht
> über SPI sondern über LVDS mit einem FPGA auslesen.

LVDS ist ein starkes Argument!
Wenn Du Erfahrungswerte hast, gib Bescheid.

von Hans-Georg L. (h-g-l)


Lesenswert?

m.n. schrieb:
> Hans-Georg L. schrieb:
>> In einem Thread in der time-nuts mailliste war der AS schlechter wie der
>> TDC ...
>
> Gib mir einen Link - die mache ich fertig!
> Es stimmt eben nicht. Siehe Anlage.
>
Ist schon lange her müsste ich erst wieder suchen ;-)

> Hans-Georg L. schrieb:
>> Der AS6500 war mir zu teuer, deshalb habe ich mir 2 AS6501 (2 Kanal)
>> besorgt.
>
> Bei Mouser war es genau anders herum; den AS6501 habe ich wegen der
> besseren Lötbarkeit genommen und weil zwei Kanäle reichten.
>
Ich kaufe auch bei Mouser, habe gerade nachgeschaut da habe ich was beim 
Preis verwechselt, die kosten das gleiche und der 6500 hat 4 Kanäle. 
Aber der 6500 hat nur 1 x SPI  Kanal für alle 4 Eingänge und der AS6501 
hat getrennte LVDS für jeden Eingang.

>> Aber das wird ein weiteres Projekt, die werde ich aber nicht
>> über SPI sondern über LVDS mit einem FPGA auslesen.
>
> LVDS ist ein starkes Argument!
> Wenn Du Erfahrungswerte hast, gib Bescheid.

Der 6501 kann bis 12.5 Mhz samples (16bit) über LVDS, single oder double 
data rate übertragen. Bei DDR ist der LVDS Takt nicht mehr so hoch und 
für Spartan6 oder Zynq Boards, die ich hier habe, und den serdes gut zu 
bewältigen.

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.