¿Una tarjeta SD en modo SPI respeta la selección de chip / selección de esclavo? Parece estar reiniciando en mi aplicación

9

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 en nivel bajo, según la especificación SPI). Una de las cosas que debo 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 llegado a trabajar de forma 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, debe enviarse un comando mientras el bus SPI se está ejecutando a 400 kHz, y debe haber 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 el CS alto en la tarjeta SD parece poner a la tarjeta SD en un estado extraño, por lo que debe pasar por la inicialización nuevamente. Por supuesto, esto no es deseable, ya que la inicialización puede tardar varios milisegundos, para escribir solo 4 kB o menos 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 unos 500 kB / s a menos de 100 kB / s.

Soy consciente de que las tarjetas SD no son técnicamente compatibles con SPI, pero ¿cómo se puede solucionar este problema?

    
pregunta Zuofu

1 respuesta

7

De acuerdo, lo descubrí en realidad. Debería haber buscado en Google un poco más profundo. Resulta que las tarjetas SD no funcionan exactamente como los dispositivos SPI cuando comparten un bus de acuerdo con Cómo usar MMC / SDC :

  

En el bus SPI, cada dispositivo esclavo se selecciona con señales CS separadas, y se pueden conectar varios dispositivos a un bus SPI. El dispositivo esclavo SPI genérico controla / libera su señal de OD mediante una señal CS de forma asíncrona para compartir un bus SPI.

     

Sin embargo, las unidades MMC / SDC / liberan la señal DO al sincronizarse con el SCLK. Esto significa que existe la posibilidad de conflicto de bus con MMC / SDC y cualquier otro esclavo SPI que esté conectado a un bus SPI. La imagen de la derecha muestra el tiempo de activación / liberación de la MMC / SDC (la señal de OD se lleva a 1/2 V cc para ver el estado del bus). Por lo tanto, para que MMC / SDC libere una señal de OD, el dispositivo maestro debe enviar un byte después de que se haya desactivado la señal CS.

La tarjeta SD y la FPGA probablemente intentaron manejar el OD y la tarjeta SD se perdió, por lo que se reinició. El envío de un byte extra parece haberlo arreglado.

    
respondido por el Zuofu

Lea otras preguntas en las etiquetas