¿Qué modo (CPOL, CPHA) debe usar un programador de un AVR ATMEGA324PA?

Estoy usando un analizador lógico para mirar las líneas MOSI, MISO, SCK y RESET mientras un ATMEGA 324PA está siendo flasheado por el programador Atmel AVR MKII.

El reloj comienza alto, por lo que me hace pensar que debe ser CPOL = 1.

El centro de bits de datos coincide con el borde ascendente de SCK.

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

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

De https://upload.wikimedia.org/wikipedia/commons/6/6b/SPI_timing_diagram2.svg Creo que esto significa CPHA=1.

¿Existe alguna documentación que confirme que CPOL=1 y CPHA=1 al programar el ATMEGA324PA? (Busqué en el PDF de 600 páginas y no encontré nada relacionado con el SPI para ISP).

¿Quieres decir que no sea la hoja de datos?
@Majenko Lo siento, yo o la función de búsqueda del lector de PDF se tambaleó.

Respuestas (1)

Según la hoja de datos:

Al escribir datos en serie en Atmel ATmega164A/164PA/324A/324PA/644A/644PA/1284/1284P, los datos se registran en el flanco ascendente de SCK. Al leer datos de ATmega164A/164PA/324A/324PA/644A/644PA/1284/1284P, los datos se registran en el flanco descendente de SCK. Consulte la Figura 27-12 para conocer los detalles de tiempo.

-- ATMega324PA Hoja de datos sección 27.8.2

Y la Figura 27-12 es:

ingrese la descripción de la imagen aquí

Eso me parece CPOL = 0 / CPHA = 0 (Modo SPI 0):

Para CPHA=0, los datos se capturan en el flanco ascendente del reloj (transición baja→alta) y los datos se envían en un flanco descendente (transición de reloj alto→bajo).

--Wikipedia _

Parece que el modo 0 y el modo 3 deberían ser intercambiables porque ambos terminan registrando el flanco ascendente y el cronometraje de salida en el flanco descendente del reloj. Sin embargo, la diferencia surge cuando comienza a hacer una transferencia: con el Modo 0, comienza con un flanco ascendente (reloj de entrada) y luego obtiene un flanco descendente (reloj de salida), mientras que en el Modo 3 comienza con un flanco descendente (reloj de salida) seguido por un flanco ascendente (reloj de entrada). Entonces, aunque obtiene los mismos datos registrados en el chip, es posible que la lectura de los datos se compense en un bit dependiendo de cómo realmente haga la lectura.

De hecho, puede ser que el programador que tiene realmente esté trabajando en el Modo 0, pero durante los momentos de actividad cero coloca el reloj y los pines de datos en un estado de alta impedancia con resistencias pull-up para permitir el uso compartido del bus. Eso parecería "reloj inactivo alto" cuando no lo es. Cuando comienza la programación, primero coloca los pines en modo de salida y baja el reloj para iniciar la secuencia SPI con una señal de reloj BAJA (Modo 0).

Gracias por tu respuesta. Su explicación de que el reloj inactivo está alto debido a la alta impedancia parece correcta, a partir de las formas de onda capturadas. Parece un problema en el software del analizador lógico. Le asusta que SCK comience alto y se niega a analizar el SPI en el modo 0. Parece que la decodificación con el modo 3 podría estar causando un cambio de un bit en la salida decodificada, como mencionó.
Mi analizador lógico hace lo mismo: todos los pines tienen pullups débiles (es un dongle barato de $5 de DX). He tenido instancias en las que un sistema que no funcionaba de repente comienza a funcionar cuando agrega el analizador debido a los pullups.