...y algunas cosas más. Estoy trabajando en el libro de Geoffrey Brown Discovering the STM32 Microcontroller y hasta ahora ha sido bastante fluido. Me encontré con un ejercicio en el que el lector puede intentar leer/escribir en una EEPROM sobre SPI. He tenido la interfaz SPI funcionando en bucle invertido, aunque anoche, cuando la estaba probando, noté que en el analizador lógico estaba viendo que el NSS presionaba alto antes de que se completara el mensaje. Luego, por la mañana, sin cambios, todo vuelve a funcionar bien. DE ACUERDO.
Configuré todo para leer/escribir la ROM (Micro 25LC256) pero la señal que veo en el analizador no es la que esperaba. Veo que el NSS presiona alto de vez en cuando en medio de la comunicación. Además, el reloj se ve inconsistente y los datos se ven mal, y el analizador me está dando muchos errores.
Pensé, está bien, quitaré el NSS por completo ya que la ROM es lo único conectado de todos modos, luego permanecerá bajo y puedo verificarlo. Pero aún así el reloj se ve mal... Recién estoy comenzando con esto, pero no tengo nada que ajuste la frecuencia del reloj, así que no estoy seguro de cómo está cambiando eso. El código se puede encontrar aquí , y creo que es bastante simple. la mayor parte de la lógica importante parece
// Drop select level low then send the write enable flag
GPIO_WriteBit(EEPROM_PORT, EEPROM_CS, 0);
spiReadWrite(EEPROM_SPI, res, cmd, 2, EEPROM_SPEED);
GPIO_WriteBit(EEPROM_PORT, EEPROM_CS, 1);
Delay(1); // Debugging aid, Wait 1 ms to make analyzer easier to read
Tengo todas las velocidades bajas (SPI CLK/MOSI/MISO son 72 / 64 = 1.125
< 10Mhz
= 25LC256 de velocidad máxima y el GPIO que estoy usando para NSS es de 2 MHz), y puse un retraso entre 1ms
operaciones solo para que sea más fácil de leer en el analizador, no parece afectar la salida.
Aquí hay una captura de los datos del analizador con el NSS forzado bajo (desenchufado):
Al acercarme a los primeros pulsos, veo que el ancho del reloj está por todas partes, no me parece CPOL/CPHA = 0/0, y no parece que esté enviando el valor de habilitación de escritura WREN = 0x06 = 0b0000 0110
...
...y no parece mejorar...
Y una última que muestra el NSS empujando alto sin motivo
¿Cómo puedo depurar desde aquí? ¿Hay algo obvio que estoy pasando por alto? ¿Es común tener problemas de sincronización tan malos? ¡Gracias!
Una parte que es bastante obvia:
No deje la selección de chip desconectada o baja todo el tiempo. En la mayoría de los dispositivos esclavos, la selección de chip es una parte esencial de la máquina de estado del esclavo. En las EEPROM, por ejemplo, la escritura en las celdas reales a menudo se realiza después de que la selección del chip sea alta.
Ahora las capturas de su analizador lógico se ven muy torcidas. Mi conjetura es que tiene algo de ruido en sus líneas (acoplamiento de las otras líneas, bucles de tierra) por lo que en realidad no está viendo lo que realmente está sucediendo allí. También recibí informes de colegas de que el analizador lógico en sí estaba inyectando una buena cantidad de ruido.
No ha mencionado si realmente miró lo que le dice el software: ¿obtiene el búfer de lectura igual a lo que ha escrito? Eso es lo principal que debería preocuparte, si ese no es el caso, puedes comenzar a mirar el bus, pero antes de eso, trataría de ver qué puedo obtener en el depurador.
Si su analizador admite el modo analógico, podría valer la pena mirar las señales analógicas para ver si algunos de los bordes causan un ruido significativo en las otras líneas. O usar un osciloscopio, por supuesto.
Arce
brahans
TrivialCaso
< 2MHz
señal.TrivialCaso
0x06
cuál es el valor de activación de escritura), pero ni siquiera está llegando tan lejos. En cuanto al pasador de espera, lo revisaré dos veces por la mañana, pero todo está bastante conectado en su propia placa de prueba, por lo que estoy bastante seguro de que está bien conectado.