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:
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.
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.
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.
Chris Stratton