Учитывает ли SD-карта в режиме SPI выбор микросхемы/выбор ведомого устройства? Кажется, сброс в моем приложении

У меня есть приложение, в котором у меня есть микроконтроллер (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-карту?
Это большой вопрос. Спасибо, что спросили (и ответили).

Ответы (1)

Ладно, я понял это на самом деле. Я должен был погуглить немного глубже. Оказывается, 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-карта вышла из строя, поэтому она сбрасывалась. Отправка дополнительного байта, похоже, исправила это.

Это позволяет вам чередовать FPGA и карту, верно? Вы также обнаружили, что вы можете прервать передачу данных и возобновить ее? Судя по тому, что написано на elm-chan, похоже, что это невозможно, но мне было бы интересно узнать, подтвердили вы это или опровергли.
Да, он работает как положено для чередования между FPGA и SD, но вы не можете прервать передачу между вызовами FatFS. По крайней мере, я не смог заставить это работать. Это означает, что вы не можете (например) реагировать на прерывание во время записи и чтения файла с датчика, использующего общую шину SPI.