Welchen Modus (CPOL, CPHA) sollte ein Programmierer eines AVR ATMEGA324PA verwenden?

Ich verwende einen Logikanalysator, um die MOSI-, MISO-, SCK- und RESET-Leitungen zu betrachten, während ein ATMEGA 324PA am Atmel AVR MKII-Programmierer vorbeigeflasht wird.

Die Uhr beginnt hoch, also denke ich, dass es CPOL = 1 sein muss.

Die Mitte der Datenbits fällt mit der ansteigenden Flanke von SCK zusammen.

    -+       +-----
MOSI |       |   
     +-------+   

    -+   +---+   +-
SCK  |   ^   |   ^
     +---+   +---+

Von https://upload.wikimedia.org/wikipedia/commons/6/6b/SPI_timing_diagram2.svg Ich denke, das bedeutet CPHA=1.

Gibt es eine Dokumentation, die bestätigt, dass CPOL=1 und CPHA=1 bei der Programmierung des ATMEGA324PA? (Ich habe das 600-seitige PDF durchsucht und nichts gefunden, was sich auf den SPI für ISP bezieht.)

Du meinst außer dem Datenblatt?
@Majenko Entschuldigung, entweder ich oder die Suchfunktion des PDF-Readers waren wackelig geworden.

Antworten (1)

Laut Datenblatt:

Beim Schreiben serieller Daten auf den Atmel ATmega164A/164PA/324A/324PA/644A/644PA/1284/1284P werden die Daten mit der steigenden Flanke von SCK getaktet. Beim Lesen von Daten vom ATmega164A/164PA/324A/324PA/644A/644PA/1284/1284P werden die Daten auf der fallenden Flanke von SCK getaktet. Siehe Abbildung 27-12 für Zeitdetails.

-- ATMega324PA Datenblatt Abschnitt 27.8.2

Und Abbildung 27-12 ist:

Geben Sie hier die Bildbeschreibung ein

Das sieht für mich wie CPOL = 0 / CPHA = 0 aus (SPI-Modus 0):

Für CPHA = 0 werden Daten an der steigenden Flanke des Takts erfasst (Low→High-Übergang) und Daten werden an einer fallenden Flanke (High→Low-Taktübergang) ausgegeben.

- Wikipedia

Modus 0 und Modus 3 scheinen austauschbar zu sein, da sie beide auf der steigenden Flanke eintakten und auf der fallenden Flanke der Uhr austakten. Der Unterschied tritt jedoch auf, wenn Sie mit einer Übertragung beginnen – bei Modus 0 beginnen Sie mit einer steigenden Flanke (Clock in) und erhalten dann eine fallende Flanke (Clock out), während Sie in Modus 3 mit einer fallenden Flanke (Clock out) beginnen, gefolgt von einer fallenden Flanke (Clock out). B. durch eine steigende Flanke (Eintakten). Obwohl Sie dieselben Daten in den Chip eintakten, stellen Sie möglicherweise fest, dass das Lesen der Daten um ein Bit versetzt wird, je nachdem, wie Sie das Lesen tatsächlich durchführen.

Es kann tatsächlich sein, dass der Programmierer, den Sie haben, wirklich im Modus 0 arbeitet, aber in Zeiten ohne Aktivität versetzt er die Takt- und Datenpins in einen hochohmigen Zustand mit Pullup-Widerständen, um die gemeinsame Nutzung des Busses zu ermöglichen. Das würde wie "leere Uhr hoch" aussehen, wenn dies nicht der Fall ist. Wenn die Programmierung beginnt, versetzt sie zuerst die Pins in den Ausgangsmodus und zieht den Takt niedrig, um die SPI-Sequenz mit einem LOW-Taktsignal (Modus 0) zu starten.

Danke für deine Antwort. Ihre Erklärung, dass der Leerlauftakt aufgrund einer hohen Impedanz hoch ist, scheint anhand der erfassten Wellenformen korrekt zu sein. Es sieht nach einem Problem in der Logikanalysator-Software aus. Es flippt aus, dass SCK hoch startet, und weigert sich, den SPI in Modus 0 zu analysieren. Die Dekodierung mit Modus 3 sieht so aus, als würde dies eine Verschiebung um ein Bit in der dekodierten Ausgabe verursachen, wie Sie erwähnt haben.
Mein Logikanalysator macht dasselbe - alle Pins haben schwache Pullups (es ist ein billiger 5-Dollar-Dongle von DX). Ich hatte Fälle, in denen ein System, das nicht funktionierte, plötzlich zu arbeiten begann, wenn Sie den Analysator aufgrund der Klimmzüge hinzufügen.