Problema de comunicación flash en serie Microchip SST26VF064B - ID JEDEC incorrecto
Estoy tratando de probar la comunicación SPI con el flash serial Microchip SST26VF064B, y encontré un problema al leer el ID JEDEC del chip. Según la hoja de datos, los primeros tres bytes deben ser 0xBF, 0x26, 0x41 / 0x42. Obtengo datos completamente diferentes: 0x7C, 0x20, 0x7F. El chip parece responder a la lectura del comando JEDEC ID 0x9F, pero siempre envía los mismos datos inesperados.

Probé el controlador SPI provisto con SDK para SOC con el que estoy trabajando, y también SPI de golpe simple: el resultado es el mismo, así que creo que la comunicación SPI funciona bien. Me estoy quedando sin ideas sobre qué probar a continuación ... ¿Hay alguna razón por la que pueda obtener estos datos en lugar de la identificación esperada?

Respuestas
Parece que este era un problema complejo parcialmente relacionado con el reloj y también la falta de resistencia en serie en la línea MISO. Los problemas finalmente desaparecieron después de agregar una resistencia de 100 ohmios en MISO y configurar la línea nRF52840 SOC SCLK en "unidad alta", para hacer que los bordes del reloj suban / bajen más rápido.
Sospecho que mis problemas están relacionados con el hecho de que actualmente estoy trabajando en una placa con cables de puente bastante largos (10-15 cm). Como con todos los proyectos, intento probar todos los componentes desconocidos antes de integrarlos en un circuito / PCB. Por supuesto, el tablero puede presentar y presentará sus propios problemas, y esto probablemente esté sucediendo aquí, pero aún así, he trabajado con pocos chips SPI diferentes y nunca antes había encontrado un comportamiento tan errático de las señales en el bus.
- Primer problema: el esclavo está emitiendo algo en MISO, pero los datos de salida son inesperados / incorrectos. He incluido pantallas de osciloscopio en la pregunta original, y en la segunda, expandida, se pueden ver pequeños picos en MISO. He examinado estos picos, y parece que ocurren siempre en las caídas del borde del reloj, cuando el esclavo debería cambiar el siguiente bit hacia afuera:
Amarillo - CS, Azul - Reloj, Morado - MISO (MOSI no aparece en estas pantallas)

En la pantalla superior superior, se puede ver que el esclavo detecta la caída del borde del reloj y MISO está comenzando a subir (aparentemente un bit en el byte leído equivale a 1), pero luego, cuando el borde del reloj cae aún más lento, el esclavo se confunde de alguna manera y cierra MISO incluso antes de que alcance el nivel lógico H adecuado (al menos eso es lo que entiendo de lo que está sucediendo aquí). En segundo lugar, la pantalla inferior es para comparar, cuando la función de "unidad alta" de nRF52840 SOC está habilitada en el pin SCLK - el borde del reloj cae más rápido y MISO actúa correctamente con esta configuración - el chip está generando datos esperados.
- Segundo problema: la señal MISO está bien cuando se prueba que no está conectada. Después de conectarse al maestro, la señal MISO se distorsiona hasta el punto en que el maestro no puede leerla o no hay ninguna señal MISO.
A continuación se muestra el comportamiento adecuado (con resistencia de 100 ohmios en MISO, unidad alta habilitada en SCLK): este es un chip flash diferente al de la pregunta original, lo cambié a Micron MT25QL128ABA, pero se comportó exactamente igual. Probado con maestro conectado a MISO. Amarillo - CS, Azul - Reloj, Morado - MISO. MOSI no aparece en estas pantallas.

A continuación se muestra el comportamiento sin resistencia, sin señal MISO en absoluto. Probado con maestro conectado a MISO. Amarillo - CS, Azul - Reloj, Morado - MISO. MOSI no aparece en estas pantallas.

He encontrado numerosos hilos en foros nórdicos, que describen problemas MISO similares: https://devzone.nordicsemi.com/f/nordic-q-a/47335/problem-using-digital-io-as-miso https://devzone.nordicsemi.com/f/nordic-q-a/47968/spi-doesn-t-work-in-nrf52810-while-emulating-nrf52810-in-nrf52832dk-was-successful/190230#190230
No estoy seguro de si se trata de un error o una mala configuración del pin SOC utilizado para MISO, o si está relacionado con cables de bus SPI largos en mi circuito de prueba. Por lo que he leído, las resistencias se pueden usar en el bus SPI para igualar la impedancia del receptor y el transmisor cuando los cables / pistas son largos (¿pero son 10 cm lo suficientemente largos como para causar tales problemas?). El hecho es que esa resistencia de valor relativamente pequeño en MISO ayuda aquí. Me gustaría saber exactamente por qué sucede eso, pero sin duda carezco de un conocimiento sólido de bajo nivel. Incorporaré una resistencia en MISO en un PCB, pero primero lo probaré con el valor 0R, para ver si mejores condiciones en el PCB (trazas más cortas) harán que esto funcione sin resistencia adicional.