Eu tenho um aplicativo em que tenho um microcontrolador (NXP LPC1343 ) conectado a um FPGA via SPI de 16 bits. Há também um cartão SD que usa a mesma porta SPI (MISO / MOSI), mas com um pino CS / SS diferente (ambos estão ativos baixos, conforme a especificação SPI). Uma das coisas que preciso fazer é gravar dados do FPGA em um arquivo no cartão SD usando o FAT32 , e esse é o trabalho do microcontrolador. O microcontrolador está executando o FatFS , que eu trabalhei de maneira confiável por si só.
Como o microcontrolador possui apenas uma pequena quantidade de RAM, apenas uma pequena quantidade de dados pode ser armazenada em buffer de uma só vez. Portanto, o micro precisa ler um buffer do FPGA, alterar o modo SPI para 8 bits e gravar esses dados no FATFS. Lembre-se de que, para configurar o cartão SD para o modo SPI, um comando deve ser enviado enquanto o barramento SPI estiver em execução a 400 kHz e uma certa quantidade de espera deve ocorrer. Portanto, eu gostaria de ter que executar a inicialização apenas uma vez.
No entanto, a realização de transações no FPGA, mesmo mantendo CS alto no cartão SD, parece colocar o cartão SD em um estado estranho, de modo que ele precisa passar pela inicialização novamente. É claro que isso é indesejável, pois a inicialização pode demorar vários milissegundos, para gravar apenas 4 kB ou mais de dados (novamente limitado pela pequena capacidade de RAM do meu micro). Como preciso escrever vários megabytes o mais rápido possível, isso reduz o desempenho de cerca de 500 kB / s para menos de 100 kB / s.
Estou ciente de que os cartões SD não são tecnicamente totalmente compatíveis com SPI, mas como esse problema pode ser corrigido?
Respostas:
Ok, eu descobri isso na verdade. Eu deveria ter pesquisado um pouco mais profundamente. Acontece que os cartões SD não agem exatamente como dispositivos SPI ao compartilhar um barramento, de acordo com Como usar o MMC / SDC :
O cartão SD e o FPGA provavelmente estavam tentando conduzir o DO e o cartão SD foram perdidos, por isso foi redefinido. Enviar um byte extra parece ter corrigido.
fonte