Problem mit der SPI-Kommunikation zwischen Arduino/Atmega328P und Raspberry Pi

Ich habe einen Atmega328P-Chip (der als Arduino verwendet wird), den ich über SPI mit einem Raspberry Pi verbinden möchte.

Ich hatte ursprünglich einen Atmega328P, der mit 3,3 V lief und einen eigenen internen 8-MHz-Kristall anstelle eines externen 16-MHz-Kristalls verwendete. Der Atmega wurde vom 3,3-V-Pin des Raspberry Pi mit Strom versorgt. Ich konnte MISO/MOSI/SCLK/CE0-Pins direkt zwischen den beiden Geräten verbinden und habe den Pi erfolgreich als SPI-Master und den Atmega als SPI-Slave verwendet.

Jetzt möchte ich einen Atmega328 mit 5 V verwenden, der von externem Gleichstrom (LM317 usw.) mit einem externen 16-MHz-Quarz gespeist wird. Offensichtlich können die 5-V-Atmega-Pins nicht mit den 3,3-V-Pi-Pins kommunizieren, daher habe ich einen bidirektionalen Logikpegelkonverter ( https://www.sparkfun.com/products/12009 ). Das ist mein aktueller Schaltplan:

Schema

Mein SPI-Code funktioniert nicht mehr und ich bin mir nicht ganz sicher warum. Ist dies der richtige Weg, um 5 V Atmega und 3,3 V Pi für die SPI-Kommunikation anzuschließen? Übersehe ich irgendwelche Verbindungen?

UPDATE : Am Ende habe ich I2C-Kommunikation ausprobiert und es hat sofort funktioniert, also denke ich, dass ich darauf umsteigen werde. Ich brauchte nur eine langsame Kommunikation zwischen Atmega und Pi, damit es meinen Bedürfnissen entspricht. Irgendwann muss ich einige der folgenden Vorschläge ausprobieren.

Diese Frage kann nur gelöst werden, indem eine Antwort akzeptiert wird. Geben Sie also entweder im Antwortformular an, dass Sie als Lösung zu I2C gewechselt sind, oder akzeptieren Sie die Antwort, in der die Geschwindigkeitsprobleme erläutert werden, die mit der Verwendung eines für I2C vorgesehenen Übersetzers für I2C verbunden sind, wenn Sie der Meinung sind, dass dies eine nützlichere Zusammenfassung der Situation ist.

Antworten (2)

Das Problem mit solchen Pegelwandlern ist, dass sie nur so schnell gehen können. Versuchen Sie, Ihre SPI-Geschwindigkeit zu verlangsamen.

Wenn Sie ein Oszilloskop haben, überprüfen Sie die Pegel der Signale, um sicherzustellen, dass sie hoch genug sind, insbesondere die Clock-Leitung, auf beiden Seiten.

Pegelwandler fügen dem Bus viel Kapazität hinzu. Ich stimme zu, es zu verlangsamen und die Pegel auf einem Oszilloskop zu überprüfen.
@Annie - in diesem Fall ist es nicht wirklich die Kapazität. Es ist so, dass diese Wandler nur durch Pull-Up-Widerstände, die standardmäßig 10K betragen, hochgefahren werden. Das Hinzufügen externer Pull-up-Widerstände mit kleinerem Wert würde die Geschwindigkeit erhöhen oder besser zu einem Chip gehen, der beide Polaritäten aktiv ansteuern kann. Ein bidirektionaler Konverter wird hier nicht benötigt, SPI-Leitungen sind im allgemeinen Gebrauch unidirektional.
Sie haben beide Recht. Die zusätzliche Kapazität in Kombination mit schwachen Pullups begrenzt die Geschwindigkeit. @ChrisStratton Guter Punkt zu externen Pullup-Widerständen, das könnte funktionieren.
RC-Geschwindigkeitsprobleme betreffen natürlich sowohl Widerstand als auch Kapazität. Aber während die Kapazität erhöht wird, bleibt sie immer noch im Picofarad. Im Gegensatz dazu erhöht die Verwendung eines dieser Treiber den Widerstandsanteil des Problems in Richtung der steigenden Flanke um viele Größenordnungen im Vergleich zu den chipeigenen Treibern. Die Richtung der fallenden Flanke sieht natürlich die Kapazität, aber sie erleidet nicht annähernd so viel zusätzlichen Widerstand, und eine Überprüfung mit einem Oszilloskop zeigt, dass das Problem die steigenden Flanken sind, nicht die fallenden.
@ChrisStratton Das macht Sinn. Ich muss zugeben, dass ich nicht weiß, was der Pull-up-Widerstand für einen Raspberry Pi oder ATMEGA328P ist. Viele Größenordnungen weniger? ...Vielleicht
Beim Ansteuern von Ausgängen treiben diese Chips sie normalerweise sowohl aktiv hoch als auch niedrig. Sie haben nicht wirklich einen "Pull-up"-Widerstand im üblichen Sinne des Begriffs, obwohl sie natürlich eine Quellenimpedanz haben. Im Gegensatz dazu fahren diese Wandler nur niedrig.
@ChrisStratton Ich war fälschlicherweise davon ausgegangen, dass diese Pins die ganze Zeit Open-Collector waren, nicht nur, wenn sie als GPIO verwendet wurden. Danke für die Bewertung.
Eigentlich ist es umgekehrt. Sie sind in erster Linie nur Hardware-basierter Open-Drain, wenn sie in einem speziellen Funktionsmodus wie I2C verwendet werden. Wenn ich mich erinnere, müssen beide in der Frage erwähnten Chips bei Verwendung als GPIOs ein Open-Drain-Verhalten haben, das in der Software emuliert wird, wodurch der Pin entweder zu einem niedrigen Ausgang oder zu einem Eingang wird. Im Gegensatz dazu haben viele typischere MCUs tatsächlich einen Open-Drain-GPIO-Modus.
@ChrisStratton Ein Blick in das Datenblatt des ATMEGA328P bestätigt genau das, was Sie sagen. Etwas Neues gelernt! Danke noch einmal.
Entschuldigung, ich bin ziemlich neu in all dem. Sollte ich anhand der obigen Kommentare versuchen, einige Widerstände hinzuzufügen oder einfach die Funktion pinMode () von Arduino zu verwenden? Ich werde versuchen, an diesem Wochenende meinen Arduino-Code zur Frage hinzuzufügen.
@darkadept Wir haben gerade Details zu den Hardwareaspekten der Pins besprochen. Sie könnten externe Pull-up-Widerstände hinzufügen, die eingebauten sind zu schwach, vorausgesetzt, Sie können sie sogar aktivieren, während Sie den Port für SPI verwenden. Ich würde immer noch empfehlen, Ihren SPI zu verlangsamen.
@ChrisStratton Ja, du hast Recht, der hohe Widerstand ist ein viel größerer Faktor.

Die Kondensatoren C1 und C2 um Ihren Kristall herum sind viel zu groß und stören wahrscheinlich Ihre Uhr. Überprüfen Sie das ATmega-Datenblatt, sie sollten ungefähr 22 pF betragen.