Divida e conquiste ou escreva devagar - leia rapidamente


Em um dos meus projetos, havia a necessidade de gravação sequencial de conjuntos de dados digitalizados de 3 canais do ADC. Os resultados da medição precisavam ser armazenados a uma velocidade de 6 KB / s, enquanto a duração do ciclo de coleta de dados poderia ser de um dia ou mais. Assim, a quantidade total de informações que precisavam ser armazenadas era de 500 MB ou mais. Como dispositivo de armazenamento, foi decidido escolher um cartão SD.


A tarefa foi complicada pelo fato de os recursos de design do dispositivo criado não permitirem extrair um cartão para a leitura de dados. O controlador XMega128A4U , no qual a tarefa estava sendo implementada naquele momento, não contava com suporte de hardware SDIO, mas permitia trabalhar com o cartão via interface SPI, cuja largura de banda era possível escrever na velocidade necessária, mas lendo uma quantidade de dados no computador através da cadeia de cartões SD via SPI -> controlador -> conversor USB-Com foi bastante sombrio e levou um tempo considerável.


Após algumas considerações (e tentativas malsucedidas de fazer um overclock do pacote acima), decidiu-se usar um controlador de leitor de cartão SD de hardware, para o qual foi escolhido o chip GL823 com suporte a USB 2.0. Agora era necessário fornecer acesso separado ao cartão SD do controlador via SPI durante a coleta de dados e do computador via SDIO, via GL823 durante a leitura em alta velocidade. Essa separação foi implementada usando dois multiplexadores 2x1 de 4 canais.



As linhas dos comutadores U2, U3 com o prefixo STM são conectadas ao controlador, as linhas com o prefixo SD são conectadas ao cartão SD. Para controlar o circuito, são utilizados sinais SD2MCU, alternando o cartão SD entre o MCU e GL823 e GL823_PWR, alternando a potência do GL823 através do mosfet .


Inicialmente, considerei essa abordagem como uma espécie de "muleta", mas, para minha surpresa considerável, ela mostrou-se bastante funcional para mim e foi confirmada pela prática de operar o dispositivo com sucesso por vários anos.


Além disso, nos seguintes desenvolvimentos baseados no STM32F407 , que possui suporte SDIO para acessar o cartão, e a possibilidade de aumentar o USB 2.0 HS MSD (através de uma interface paralela ULPI), é considerada a possibilidade de usar uma solução GL823 baseada em barramento .


Usando um pacote STM32F407 com um PHY USB3300 externo, foi possível obter uma velocidade de leitura de cartão de ~ 41 Mbit / s, enquanto ao usar um leitor de cartão de hardware, a velocidade atinge ~ 150 Mbit / s, todas as outras coisas sendo iguais. As medições foram feitas através da leitura de um arquivo de 128 MB a partir de um cartão SD formatado em FAT32. Ambas as abordagens têm suas próprias nuances de uso, mas, parece-me, ambas têm um "direito à vida". Quanto às nuances: no meu caso, na próxima iteração do desenvolvimento deste dispositivo, o hardware precisava ser colocado em uma placa de 26 mm de largura.


O layout da PCB para o LQFP100 do gabinete STM32F407 nesse caso é um pouco difícil, mas seu "irmão mais novo" STM32F405 no gabinete LQFP64 foi localizado. Mas o STM32F405 não possui ULPI, portanto, o USB 2.0 HS não está disponível e a implementação do MSD FS perde muito na velocidade de leitura de dados do cartão. Usando a mesma solução descrita acima, você pode obter uma velocidade suficiente de acesso ao SD no computador enquanto lê os dados do dispositivo.


Ficaria feliz se minha experiência fosse útil para alguém.


Source: https://habr.com/ru/post/pt440308/


All Articles