Forum: Mikrocontroller und Digitale Elektronik Fragen zu SPI Geschwindigkeit


von Peter S. (cbscpe)


Lesenswert?

Ich habe in einem Projekt einen übertakteten Atmega1284P (22.1184MHz 
wegen Baud-Rate) durch einen AVR128DB48 ersetzt der mit 24MHz läuft.

Im ersten Projekt habe ich die SD-Card via 74CD4050 Als Level Converter 
angeschlossen. Zwischen dem Atmega1248P und dem 74CD4050 ist ein IDC 
Kabel von etwa 15cm Länge, der SPI Clock entspricht der halben CPU 
Frequenz, also ca. 11MHz. Es funktioniert einwandfrei.

Bei der Neuauflage habe ich jetzt einen AVR128DB48 genommen, weil dort 
sind die Pegelkonverter schon eingebaut. D.h. Port C kann man mit einer 
anderen Spannung als der Rest betreiben (MVIO Feature) werden. Auch habe 
ich nun den SD-Card Slot auf die gleiche Platine gelötet wie der 
AVR128DB48. Die Leiterbahnen dazwischen sind alle kürzer als 5cm und 
kreuzen sich nicht mit anderen Signalen. Aber trotzdem mehr als 4MHz SPI 
Clock schafft das Konstrukt nicht. Pullup an MISO, DAT1 und DAT2 ist 
vorhanden (2k2).

Hat mir jemand Tipps wie ich das Problem angehen soll? Oder fällt 
jemanden etwas ein was ich unbedingt beachten sollte?

von Erich (Gast)


Lesenswert?

Ein Scope anschliessen und nachsehen was vorgeht.
Bandbreite >= 100 MHz, jeden Tastkopf mit kurzer Klammer an Masse.
SPI Decodierung wäre nett.
Gruss

von Falk B. (falk)


Lesenswert?

Peter S. schrieb:
> Ich habe in einem Projekt einen übertakteten Atmega1284P (22.1184MHz
> wegen Baud-Rate) durch einen AVR128DB48 ersetzt der mit 24MHz läuft.
>
> Im ersten Projekt habe ich die SD-Card via 74CD4050 Als Level Converter
> angeschlossen.

MÖÖÖP! Es gibt keinen 74CD4050, bestenfalls 74HC4050.

> kreuzen sich nicht mit anderen Signalen. Aber trotzdem mehr als 4MHz SPI
> Clock schafft das Konstrukt nicht.

Was heißt das? Brennt dann dein IC ab oder gibt es Kommunikationsfehler? 
Oder kannst du nicht mehr als 4 MHz einstellen? Zeig mal dein Layout und 
Schaltplan.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Peter S. schrieb:
> Hat mir jemand Tipps wie ich das Problem angehen soll?
Mit dem Oszi messen und die Signalqualität direkt an den SD-Kartenpins 
und dann auch direkt an den Controllerpins auf Anstiegszeit, 
Überschwinger und Einkopplungen kontrollieren.

von Name: (Gast)


Lesenswert?

Peter S. schrieb:
> Hat mir jemand Tipps wie ich das Problem angehen soll? Oder fällt
> jemanden etwas ein was ich unbedingt beachten sollte?

Messen würde helfen ;-)

ich tippe mal auf Verzögerungen durch die ganzen Buffer und so weiter. 
Vermutlich irgendwelcher 70er-Jahre Schrott im DIL-Gehäuse? Das 
Übertakten ist natürlich auch kontraproduktiv. Das SPI-Peripheral des 
ATMEGA ist vermutlich nicht für so hohe Frequenzen gedacht und könnte 
auch zum Problem beitragen.

Generell gehen SD-Karten auch mit 20MHz problemlos. Ich habe das in 
mehreren Projekten mit STM32 und PIC32 verwendet, und hatte nie 
Probleme. Sogar auf dem Breadboard (PIC32MX250).

Ich wäre ja nie auf die Idee gekommen, einem Atmega eine SD-Karte 
aufzubürden. Es gibt da passendere Lösungen, wie Nor-Flashes mit SPI. 
Sowieso: Wenn man einen ATMEGA übertakten muss, dann ist wirklich ein 
schnellerer µC angebracht.

Bei einem 32-Bitter kann man gleich FATFS verwenen und Daten im 
.csv-Format loggen. Zu einem Bruchteil des Stromverbrauchs. Allein schon 
weil man nicht mit 5V herumbrät.

von Peter S. (cbscpe)


Lesenswert?

Da das Problem sehr sporadisch auftritt habe ich noch nicht ganz genau 
gesehen was dann passiert. Ich konnte es sozusagen noch nie in flagranti 
erwischen.

Dass es am SPI clock liegen könnte (das ist auch nur eine Vermutung) kam 
mir erst gestern in den Sinn als ich mit dem Debugger feststellte, dass 
er in der SPI read routine hängt warum auch immer. Daraufhin habe ich 
den Takt runter gesetzt und seit dem ist das Problem weg. Aber eben es 
erklärt nicht die Ursache.

Ja der Pegelkonverter hiesst 74HC4050. Ich werde wohl den Oszi 
anschliessen müssen (ewig nicht mehr gebraucht) und schaue mal ob mir da 
etwas auffällt, ich melde mich dann wieder.

von Falk B. (falk)


Lesenswert?

Name: schrieb:
> Messen würde helfen ;-)
>
> ich tippe mal auf Verzögerungen durch die ganzen Buffer und so weiter.
> Vermutlich irgendwelcher 70er-Jahre Schrott im DIL-Gehäuse?

Er hat gar keinen Buffer mehr! Mit Buffer ging es!

Das
> Übertakten ist natürlich auch kontraproduktiv. Das SPI-Peripheral des
> ATMEGA ist vermutlich nicht für so hohe Frequenzen gedacht und könnte
> auch zum Problem beitragen.

Blödsinn! Gerade das SPI ist da vollkommen unkritisch, ist ja nur eine 
Schieberegister. Übertakten macht eher dem Flash, EEPROM zu schaffen.

> Bei einem 32-Bitter kann man gleich FATFS verwenen und Daten im
> .csv-Format loggen.

Das kann auch ein ach so kleiner AVR! Been there, done that!

> Zu einem Bruchteil des Stromverbrauchs. Allein schon
> weil man nicht mit 5V herumbrät.

Auch AVRs laufen auf 3,3V. Und mit etwas Köpfchen und Sleep Mode ist 
auch ein AVR sehr sparsam, wenn es denn sein muss.

Trotzdem Danke für denen wertvollen Beitrag!

von HildeK (Gast)


Lesenswert?

Peter S. schrieb:
> Dass es am SPI clock liegen könnte

Ja, könnte. Hast du schon mal am Takt eine Serienterminierung versucht? 
Das erklärt aber nicht ganz, warum es mit einer langsameren Taktfrequenz 
geht.

Peter S. schrieb:
> Ich werde wohl den Oszi
> anschliessen müssen (ewig nicht mehr gebraucht) und schaue mal ob mir da
> etwas auffällt,

Das wäre wohl das allererste gewesen, was ich gemacht hätte, noch lange 
bevor ich hier gefragt hätte ... 😀

von Falk B. (falk)


Lesenswert?

Peter S. schrieb:
> Da das Problem sehr sporadisch auftritt habe ich noch nicht ganz genau
> gesehen was dann passiert. Ich konnte es sozusagen noch nie in flagranti
> erwischen.

Das deutet alles auf ein Signalqualitätsproblem am Takt hin. Dein neuer 
AVR ist nicht nur neuer, sondern auch deutlich schneller und giftiger 
als der gute, alte 74HC4050 Buffer. Die Flankensteilheit ist höher, die 
Anstiegszeit kleiner. Damit bekommst du, vermutlich auch wegen einiger 
Unsauberkeiten im Layout, Störungen der Taktflanke, welche die 
Kommunikation aus dem Tritt bringt.

Abhilfe schafft hier eine Serienterminierung des Takts, siehe 
Wellenwiderstand.

> er in der SPI read routine hängt warum auch immer. Daraufhin habe ich
> den Takt runter gesetzt und seit dem ist das Problem weg.

Nicht wirklich, es tritt nur seltener auf. Entscheidend ist die 
Flankensteilheit, nicht die Frequenz.

> Ja der Pegelkonverter hiesst 74HC4050. Ich werde wohl den Oszi
> anschliessen müssen (ewig nicht mehr gebraucht) und schaue mal ob mir da
> etwas auffällt, ich melde mich dann wieder.

https://www.mikrocontroller.net/articles/Oszilloskop#Tastk%C3%B6pfe_richtig_benutzen

von Name: (Gast)


Lesenswert?

Falk B. schrieb:
> Er hat gar keinen Buffer mehr! Mit Buffer ging es!

Haha, den braucht er aber. Weil die SD-Karte wird 5V-Signale nicht 
lieben.

von Falk B. (falk)


Lesenswert?

Name: schrieb:
> Haha, den braucht er aber. Weil die SD-Karte wird 5V-Signale nicht
> lieben.

Du solltest das mit dem sinnerfassenden Lesen nochmal üben.

"Bei der Neuauflage habe ich jetzt einen AVR128DB48 genommen, weil dort
sind die Pegelkonverter schon eingebaut. D.h. Port C kann man mit einer
anderen Spannung als der Rest betreiben (MVIO Feature) werden."

von Peter S. (cbscpe)


Lesenswert?

Name: schrieb:
> Falk B. schrieb:
>> Er hat gar keinen Buffer mehr! Mit Buffer ging es!
>
> Haha, den braucht er aber. Weil die SD-Karte wird 5V-Signale nicht
> lieben.

Ich wiederhole mich, darum habe ich das MVIO Feature des AVR128DB 
verwendet. Port C und die SD-Karte werden mit einem eigenen 
Spannungsregler mit 3V3 versorgt.

Der Rest braucht 5V weil er eine etwas in die Jahre gekommene Schaltung 
bedienen muss.

Alles ist SMD (ausser der alte Teil). Also kein DIL Schrott.

Das mit der Serienterminierung werde ich mal ausprobieren.

Der AVR128 ist moderner, aber darum muss er ja nicht giftiger sein. Aber 
ich könnte ja mal die Slew-Rate Limitations am Port C aktivieren.

Bezüglich Taktrate, im Datenblatt des AVR128 steht dass der SPI nur 
10MHz unterstützt, das hat mich immer etwas verwundert. Aber wer weiss 
vielleicht steckt da was dahinter.

von Stefan F. (Gast)


Lesenswert?

Name: schrieb:
> Vermutlich irgendwelcher 70er-Jahre Schrott im DIL-Gehäuse?

Der AVR128DB48 ist von August 2020!

von Name: (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Der AVR128DB48 ist von August 2020!

Genau lesen ist Trumpf. Damit waren sehr eindeutig die Buffer gemeint. 
Die, wie wir inzwischen wissen, nicht existieren.

Beißreflex eines AVR-Fanboys? Ich habe nicht geschrieben dass alle 
AVR-Nutzer dumm sind, sondern dass der AVR mir für die Anwendung 
(SD-Karte) etwas klein dimensioniert erscheinen will.
Das hat NICHT die gleiche Bedeutung ;-)

Was das Thema angeht:
Entweder wir haben einen Softwarefehler, oder einen Hardwarefehler.

Um das zu unterscheiden sollte man sich mal ganz allgemein die Signale 
ansehen. Stimmt der Pegel? Passen die Taktflanken ausreichend zu den 
Daten? Sind die Flanken sauber?

Bei den Margins die TTL-Signale haben, sollte man potentielle Probleme 
mit der Signalqualität einigermaßen einfach sehen können.
Idealerweise beurteilt man das nach objektiven Kriterien 
(Setup/hold-Zeiten bei send/receive, Flankensteilheit, Pegel), erfühlen 
oder auspendeln hilft weniger.

von Peter S. (cbscpe)


Lesenswert?

Danke für die Tipps, die Stossrichtung der Fehlersuche ist damit 
vorgegeben. D.h. zuerst LA vom Tisch räumen und den Oszi anschliessen 
und natürlich die Software durchleuchten (der Teil der sich mit dem SPI 
beschäftigt). Ich habe nicht erwartet, dass man mein Problem löst, dazu 
waren die Angaben zu wage. Es ging mir vor allem darum zu hören, was 
andere als nächsten Schritt machen würden. Ich dachte das hätte ich 
eigentlich so gefragt.

von Name: (Gast)


Lesenswert?

Was ich in solchen Fällen gern tue:
Wenn man den Fehler in Software erkennt, kann man sich einen GPIO setzen 
um das DSO zu triggern. Im Idealfall kann man vergleichen was der 
Debugger sieht und was am Oszi zu sehen ist, und sich physikalisch das 
kaputte Bit ansehen.

Bisher waren es bei mir IMMER Softwarefehler ;-)

von Veit D. (devil-elec)


Lesenswert?

Hallo,

bevor du aufwändig Serienwiderstände einbaust kannst du auf dem Port das 
Slewrate Feature aktivieren und ausprobieren.

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.