AVR SPI el registro de cambios no está sincronizado

2

Estoy intentando generar una salida paralela escribiendo datos en serie en un registro de desplazamiento ( SN74HC595 ) a través de SPI en un ATMega328 (SPI master) que se ejecuta a 20MHz y SPI a 10MHz. El esquema mínimo para reproducir mi problema se encuentra a continuación (VCC = 5V).

Elcódigogeneralasformasdeondacorrectascomosevenenunosciloscopio,peroelSN74HC595nopareceestarsincronizado,ointerpretalosdatosdemaneradiferenteacomoloespero.HeobservadoquelasalidaenserieQH'essiempreunalógica1,ytambiénlosonlassalidasenparaleloQAaQH.

HereducidoelproblemaalsiguientecódigomínimoqueconfiguraSPIenmodomaestro,MSB-firstySCK=\$f_{osc}/2\$:

#include<avr/io.h>volatileuint8_tcounter=0;intmain(void){DDRB=(1<<PINB3)|(1<<PINB5)|(1<<PINB1);SPCR=(1<<SPE)|(1<<MSTR);SPSR=(1<<SPI2X);while(1){PORTB&=~(1<<PINB1);//pullSSlowSPDR=counter++;while(!(SPSR&(1<<SPIF))){;//Busywait}PORTB|=1<<PINB1;//pullSShigh}}

EstogeneralasformasdeondaSRCLK(amarillo),SER(cian)yRCLK(magenta).Elosciloscopiodecodificacorrectamentelosdatoscomounasecuenciadebytesascendentes,porloquelatransmisiónSPIparecefuncionarcorrectamente.

Másdetallesdelatransmisióndeunsolobytesemuestranenlasiguientecapturadepantalla.TengaencuentaqueelperíododerelojdeSRCLKesde100ns,quecoincideconlafrecuenciaderelojSPIde10MHz.TambiéntengaencuentaqueRCLK(nosemuestraaquí)semantienebajodurante200nsentreescriturassucesivasyaltopara1600nsencadaescritura.

Lo he intentado:

  • Incremento del desacoplamiento
  • Velocidad de reloj reducida: tanto el reloj del sistema como el reloj SPI
  • Intercambiando otro SN74HC595
  • Inversión de pull-ups / downs en los pines bajos activos OE y SRCLR en caso de que haya confundido los dos pines

Parece que no estoy excediendo los requisitos de tiempo del SN74HC595 y el comportamiento es el mismo si el fusible CKDIV8 está programado en 1. El fusible SPIEN también está configurado en 1.

¿Cuáles son algunas de las posibles razones de este comportamiento?

Nota interesante: si hago bit bang en la misma interfaz, el registro de desplazamiento funciona como se esperaba, aunque el rendimiento obviamente no es excelente.

    
pregunta bhillam

1 respuesta

3

SRCLK y RCLK están invertidos.

No se muestra en el esquema, pero los dos pines se han invertido en mi prototipo, a pesar de las innumerables comprobaciones de las conexiones correctas. Es curioso que solo hayas descubierto estas cosas después de que hayas pedido ayuda.

    
respondido por el bhillam

Lea otras preguntas en las etiquetas