Tengo una aplicación donde tengo un microcontrolador (NXP LPC1343 ) que está conectado a un FPGA a través de SPI de 16 bits. También hay una tarjeta SD que usa el mismo puerto SPI (MISO / MOSI) pero con un pin CS / SS diferente (ambos están activos bajo, según la especificación SPI). Una de las cosas que necesito hacer es escribir datos del FPGA en un archivo en la tarjeta SD usando FAT32 , y este es el trabajo del microcontrolador. El microcontrolador está ejecutando FatFS , que he podido trabajar de manera confiable por sí mismo.
Debido a que el microcontrolador solo tiene una pequeña cantidad de RAM, solo se puede almacenar una pequeña cantidad de datos a la vez. Por lo tanto, el micro tiene que leer un búfer del FPGA, cambiar el modo SPI a 8 bits y luego escribir esos datos en el FATFS. Recuerde que para configurar la tarjeta SD para el modo SPI, se debe enviar un comando mientras el bus SPI se ejecuta a 400 kHz, y debe producirse una cierta cantidad de espera. Por lo tanto, me gustaría tener que realizar la inicialización solo una vez.
Sin embargo, realizar transacciones en el FPGA incluso mientras se mantiene CS en la tarjeta SD parece poner la tarjeta SD en un estado extraño, de modo que necesita pasar por la inicialización nuevamente. Esto, por supuesto, no es deseable, ya que la inicialización puede tomar varios milisegundos, para escribir solo 4 kB o más de datos (nuevamente limitado por la pequeña capacidad de RAM de mi micro). Como necesito escribir varios megabytes lo más rápido posible, esto reduce el rendimiento de aproximadamente 500 kB / s a menos de 100 kB / s.
Soy consciente de que las tarjetas SD no son técnicamente totalmente compatibles con SPI, pero ¿cómo se puede solucionar este problema?
Respuestas:
De acuerdo, lo descubrí en realidad. Debería haber buscado en Google un poco más profundo. Resulta que las tarjetas SD no actúan exactamente como los dispositivos SPI cuando comparten un bus de acuerdo con Cómo usar MMC / SDC :
La tarjeta SD y el FPGA probablemente intentaban manejar DO y la tarjeta SD se perdió, por lo que se reinició. Enviar un byte extra parece haberlo solucionado.
fuente