У меня есть приложение, в котором у меня есть микроконтроллер (NXP LPC1343 ), который подключен к FPGA через 16-битный SPI. Существует также SD-карта, использующая тот же порт SPI (MISO/MOSI), но с другим контактом CS/SS (оба активны при низком уровне, согласно спецификации SPI). Одна из вещей, которые мне нужно сделать, это записать данные из FPGA в файл на SD-карте с использованием FAT32 , и это работа микроконтроллера. На микроконтроллере работает FatFS , и я убедился, что он работает сам по себе.
Поскольку микроконтроллер имеет небольшой объем ОЗУ, за один раз можно буферизовать только небольшой объем данных. Следовательно, микроконтроллер должен прочитать буфер из FPGA, изменить режим SPI на 8-битный, а затем записать эти данные в FATFS. Напомним, что для настройки SD-карты для режима SPI необходимо отправить команду, когда шина SPI работает на частоте 400 кГц, и должно произойти определенное время ожидания. Поэтому я хотел бы выполнить инициализацию только один раз.
Однако выполнение транзакций на FPGA даже при удерживании высокого уровня CS на SD-карте, по-видимому, переводит SD-карту в странное состояние, из-за которого ей нужно снова пройти инициализацию. Это, конечно, нежелательно, поскольку инициализация может занять несколько миллисекунд, чтобы записать всего 4 КБ или около того данных (опять же ограничено небольшим объемом оперативной памяти моего микро). Поскольку мне нужно записать несколько мегабайт как можно быстрее, это снижает производительность примерно с 500 кБ/с до менее чем 100 кБ/с.
Я знаю, что SD-карты технически не полностью совместимы с SPI, но как решить эту проблему?
Ладно, я понял это на самом деле. Я должен был погуглить немного глубже. Оказывается, SD-карты не действуют точно так же, как устройства SPI при совместном использовании шины в соответствии с How to Use MMC/SDC :
В шине SPI каждое ведомое устройство выбирается с отдельными сигналами CS, и к шине SPI можно подключить несколько устройств. Универсальное ведомое устройство SPI управляет/отпускает свой сигнал DO с помощью сигнала CS асинхронно для совместного использования шины SPI.
Однако MMC/SDC управляет/отпускает сигнал DO при синхронизации с SCLK. Это означает, что существует вероятность конфликта шины с MMC/SDC и любыми другими ведомыми устройствами SPI, подключенными к шине SPI. На правом изображении показана синхронизация возбуждения/освобождения MMC/SDC (сигнал DO подтягивается до 1/2 В пост. тока , чтобы увидеть состояние шины). Следовательно, чтобы заставить MMC/SDC выпустить сигнал DO, ведущее устройство должно отправить байт после того, как сигнал CS будет снят.
SD-карта и FPGA, вероятно, пытались управлять DO, и SD-карта вышла из строя, поэтому она сбрасывалась. Отправка дополнительного байта, похоже, исправила это.
Марко
пометки