He escrito un controlador SPI para tarjetas SD (en micropython). No había nada disponible para mi hardware específico (un PyC.io LoPy SoC), así que empecé estudiando una larga lista de controladores, escritos en python y C, y la variedad de enfoques era asombrosa. Muchos tenían códigos inútiles / innecesarios, códigos "erróneos" o códigos que pueden funcionar en algunas tarjetas pero no en otras. No hace falta decir que la variedad de diferentes tarjetas SD y su adhesión a la norma no hacen que esto sea una tarea fácil.
En cualquier caso, de la docena de tarjetas SD (todas microSD) que tengo para probar (varias marcas, velocidades y tamaños), todas excepto dos funcionan perfectamente. Ambas son marcas, velocidades y tamaños diferentes, pero se comportan (mal) exactamente de la misma manera. Ambos se inicializan correctamente, devolviendo todos los datos "meta" esperados, pero cuando se hacen los primeros datos leídos, fallan y fallan constantemente.
En el modo SPI, la lectura de un "sector" se inicia enviando un CMD17 de la manera normal (el mismo código en mi controlador que envía todos los demás comandos), luego leyendo un byte a la vez, esperando un "token" que marca el inicio de los datos (en este caso, el token es 0xFE). Para todas mis tarjetas de trabajo, siempre obtengo 0xFE como segundo byte (el primer byte casi siempre es 0x7F, pero se supone que es irrelevante, la especificación SD solo se preocupa por el primer 0xFE). Pero en las dos tarjetas que fallan, siempre obtengo 0x3F seguido de 0xFF. El código falla, porque nunca se vio 0xFE. Pero lo interesante aquí es que 0x3F / 0xFF es 0x7F / 0xFE desplazado en un bit. Por eso siento que esto es un problema de hardware.
He leído casi todo lo que puedo conseguir en relación con SD sobre SPI. He mirado las señales con un alcance (nada inusual para reportar). Mi circuito está alimentado por un suministro de banco de alta calidad y tiene una capacidad de volumen y desacoplamiento suficiente, y tiene cables muy cortos. También he probado las dos tarjetas que fallan en la ranura para tarjetas SD de mi PC, y funcionan como se esperaba. Sin embargo, el problema que describo es 100% consistente.
¿Entonces la pregunta es qué mirar a continuación? He estado en esto por días, y estoy sin ideas en este momento.