Как записать на SD-карту с помощью SPI с DMA, доступным для PSoC 5LP (32-битный Cortex- M3) чип?

В настоящее время у меня работает пара DMA и SPI tx / rx, но для другой цели, поэтому, если фактическая передача не является проблемой, я просто не знаю, как взаимодействовать с SD-картой.

техническое описание PSoC 5LP находится здесь.

Базовая информация:

Я использую DMA в простом режиме, и цепочка DMA TD настроена для: 8-битной ширины, 4-байтовых пакетов автоматически завершает полный TD (требуется только начальный запрос HW). По завершении цикла возврат к началу исходного TD и ожидание запроса HW

Мастер SPI инициализируется в графическом интерфейсе, я установил его с использованием тактовой частоты 16 МГц, 8-битные передачи tx / rx с 4-байтовым буфером tx / rx. прерывания устанавливаются на Rx FIFO full, к ним подключен Rx DMA.

Указатели для SDcard SPI rx / tx - это SPIM_RX_PTR и SPIM_TX_PTR соответственно. DMA передает к ним и от них. Массивы, которые я передаю, - это SDcardout и SDcardin.

0
scarlso9 29 Дек 2015 в 19:19

2 ответа

Лучший ответ

Связь по SPI предоставит вам доступ к карте только на самом низком уровне команд / блоков; вам понадобится файловая система. SD-карты предварительно отформатированы как FAT32, поэтому файловая система FAT обеспечивает максимальную сопоставимость, а не самую высокую надежность (например, возможно повреждение, если запись прервана из-за потери питания или сброса). Он также имеет то преимущество, что он относительно прост в реализации и требует мало ресурсов.

Доступно несколько коммерческих и открытых библиотек файловых систем FAT. Предлагаю вам взглянуть на ELM FatFs или ELM Petit FatFs имеют разрешительные лицензии и хорошо документированы. В каждом случае вам просто нужно реализовать заглушки дискового ввода-вывода, чтобы сопоставить их с вашим драйвером SPI. На сайте есть множество примеров, документации и примечаний по применению, которые могут вам помочь. Вы можете начать с примера реализации SPI SD для другой цели и адаптировать его к вашему драйверу (или, возможно, адаптировать ваш драйвер). Другие библиотеки файловой системы FAT во многом схожи с этой и требуют реализации уровня ввода-вывода.

Уровень diskio в ELM FatFs не зависит от носителя, поэтому вам действительно нужен дополнительный уровень MMC / SD между ним и драйвером SPI. Маловероятно, что вы найдете пример для своей конкретной цели, но можно работать с примерами для других целей, поскольку MMC / SD через SPI сам по себе не является целевым, зависимости от оборудования возникают только на уровне SPI и реализации GPIO. для сигналов обнаружения карты и защиты от записи (дополнительно). здесь, проект для PSoC, есть несколько примеров для различных целей ARM. поддержка здесь (очевидно, на момент написания статьи эта работа еще не завершена).

4
Clifford 30 Дек 2015 в 09:48

Я проделал работу именно над этой проблемой.

Я обнаружил, что существующий модуль SPI, поставляемый с библиотекой компонентов PSoC 5, не идеально подходит для массовых передач на / с SD-карты. Насколько я мог судить, необходимо было очищать флаги модуля SPI в программном обеспечении при каждой передаче байта, что делало DMA гораздо менее полезным. Я думаю, что одним из решений является использование двух TD (дескрипторов передачи) - один для выполнения передачи данных, а второй для очистки флага RX после завершения первого TD - в любом случае, это не по теме.

Я также обнаружил, что компонент emFile, поставляемый в библиотеке компонентов, ограничен в своих возможностях. Я не видел никакого способа подключить DMA, и даже если бы я мог, его тактовая частота оказалась очень низкой. Вдобавок к этому emFile требует выбора FAT16 или FAT32 во время компиляции, ограничивая ваш дизайн только той или иной файловой системой.

Поскольку мне не нравилась идея более сложной настройки DMA, я решил разработать собственное аппаратное обеспечение SPI-компонентов в редакторе UDB. Проект, содержащий компонент, можно найти по адресу: https://github.com/PolyVinalDistillate/NSDSPI

Он включает в себя упомянутую выше превосходную библиотеку FatFS (спасибо ChaN), которая заботится о картах, отформатированных в FAT12, FAT16 и FAT32. Как уже говорилось, без уровня файловой системы вы будете иметь доступ только к блокам необработанных данных по 512 байт каждый. С FatFS вы получаете аналоги fopen (), fclose () и т. Д.

Если вы посмотрите на мой компонент в PSoC Creator, вы увидите, что он фактически состоит из двух компонентов: один - это специализированный компонент UDB, реализующий основную логику SPI, другой - это схема, соединяющая мой компонент UDB с DMA и некоторую логику управления. Этот второй компонент также имеет файлы API, содержащие мой программный код, и это компонент, который нужно добавить в вашу схему TopDesign.

FatFS включена как предварительно скомпилированная библиотека, а LowLevelFilesys.h в папке API обеспечивает доступ ко всем функциям файла.

Этот компонент был разработан с учетом массового чтения, и API для чтения выполняет следующие функции:

  • Устанавливает DMA TD необходимой длины данных и сообщает моему компоненту SPI, сколько байтов будет передано.
  • Запускает передачу, в результате чего мой компонент SPI автоматически отправляет 0xFF (нет необходимости записывать 0xFF в SPI для каждого полученного байта), при этом каждый полученный байт копируется в буфер приема через DMA.

Запись на карту выполняется более типичным способом: DMA просто отправляет данные в модуль SPI после подготовки SD-карты для него.

Если вы запустите мой проект в своей системе PSoC, он выполнит тест чтения / записи на SD-карте, поместив файл со спецификациями:

Testing Speed
Writing 16000 bytes to file, non-DMA
Took 94 ms
Rate 1361 kbps

Reading 16000 bytes to file, non-DMA
Took 50 ms
Verifying... All Good! :D
Rate 2560 kbps

Writing 16000 bytes to file, DMA
Took 17 ms
Rate 7529 kbps

Reading 16000 bytes to file, DMA
Took 12 ms
Verifying... All Good! :D
Rate 10666 kbps

Некоторые SD-карты дают лучшие результаты, некоторые - хуже. Я считаю, что это связано с самой SD-картой (например, класс, использование, возраст технологий и т. Д.).

0
Nick 20 Мар 2016 в 19:47