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

9

У меня есть приложение, где у меня есть микроконтроллер (NXP LPC1343 ), который подключен к FPGA через 16-битный SPI. Существует также SD-карта, использующая тот же порт SPI (MISO / MOSI), но с другим выводом CS / SS (оба активны на низком уровне согласно спецификации SPI). Одна из вещей, которые мне нужно сделать, это записать данные из FPGA в файл на SD-карте с помощью FAT32 , и это задача микроконтроллера. Микроконтроллер работает под управлением FatFS , и я сам получил надежную работу.

Поскольку микроконтроллер имеет только небольшой объем оперативной памяти, только небольшой объем данных может быть буферизован за один раз. Следовательно, micro должен прочитать буфер из FPGA, изменить режим SPI на 8-битный, а затем записать эти данные в FATFS. Напомним, что для настройки SD-карты на режим SPI необходимо отправить команду, когда шина SPI работает на частоте 400 кГц, и должно произойти определенное время ожидания. Поэтому я хотел бы выполнить инициализацию только один раз.

Однако выполнение транзакций на FPGA даже при высоком уровне CS на SD-карте, кажется, переводит SD-карту в странное состояние, так что она должна снова пройти инициализацию. Это, конечно, нежелательно, так как инициализация может занять несколько миллисекунд, чтобы записать всего 4 КБ или около того данных (опять же, ограничено малым объемом оперативной памяти моего микро). Поскольку мне нужно как можно быстрее записать несколько мегабайт, это снижает производительность примерно с 500 кБ / с до менее 100 кБ / с.

Я знаю, что SD-карты технически не полностью совместимы с SPI, но как решить эту проблему?

Zuofu
источник
Это должно соблюдать это, насколько я знаю. Может быть, попробовать другую SD-карту?
Марко
Это большой вопрос. Спасибо за вопрос (и ответ).
markrages

Ответы:

7

Хорошо, я понял это на самом деле. Я должен был погуглить немного глубже. Оказывается, что SD-карты не работают точно так же, как устройства SPI при совместном использовании шины в соответствии с разделом Как использовать MMC / SDC :

В шине SPI каждое подчиненное устройство выбирается с помощью отдельных сигналов CS, и к шине SPI можно подключить несколько устройств. Общее подчиненное устройство SPI управляет / освобождает свой сигнал DO асинхронным сигналом CS для совместного использования шины SPI.

Однако MMC / SDC запускает / выпускает сигнал DO при синхронизации с SCLK. Это означает, что существует вероятность конфликта шины с MMC / SDC и любыми другими ведомыми устройствами SPI, которые подключены к шине SPI. На правом изображении показана синхронизация привода / разблокировки MMC / SDC (сигнал DO подается на 1/2 В cc, чтобы увидеть состояние шины). Поэтому, чтобы сделать сигнал разблокировки MMC / SDC DO, ведущее устройство должно отправить байт после сброса сигнала CS.

SD-карта и FPGA, вероятно, оба пытались управлять DO, и SD-карта потеряла, поэтому она перезагружалась. Отправка дополнительного байта, кажется, исправила это.

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