В одном из моих проектов возникла необходимость последовательной записи оцифрованных наборов данных с 3-х каналов АЦП. Результаты замеров нужно было сохранять со скоростью 6 КБайт/сек, при этом длительность цикла сбора данных могла составлять сутки и более. Таким образом общий объем информации, который необходимо было сохранять, составлял 500 МБайт и более. В качестве устройства хранения было решено выбрать SD карту.
Задача осложнялась тем, что конструктивные особенности создаваемого прибора не позволяли извлекать карту для считывания данных. Контроллер XMega128A4U, на котором в то время реализовывалась задача, не имел аппаратной поддержки SDIO, но позволял работать с картой через SPI интерфейс, пропускная способность которого вполне допускала писать с требуемой скоростью, но вот считывание в компьютер такого объема данных по цепочке SD карта через SPI -> контроллер -> USB-Com преобразователь было достаточно тоскливым и занимало немалое время.
После некоторых раздумий (и безуспешных попыток несколько подразогнать вышеуказанную связку) было принято решение использовать хардварный SD Card Reader Controller, в качестве которого и был выбран чип GL823 поддерживающий USB 2.0. Теперь было необходимо обеспечить раздельный доступ к SD карте со стороны контроллера по SPI во время сбора данных и со стороны компьютера через SDIO, посредством GL823 во время высокоскоростного считывания. Такое разделение было реализовано с использованием двух 4-х канальных мультиплексоров 2x1.
Линии от коммутаторов U2, U3 с префиксом «STM» соединены с контроллером, линии с префиксом «SD» — с SD картой. Для управления схемой используются сигналы SD2MCU, переключающий SD карту между MCU и GL823 и GL823_PWR, коммутирующий через мосфет питание GL823.
Изначально я рассматривал такой подход как некий «костыль», но, к моему немалому удивлению, он оказался вполне себе работоспособным и подтвердился практикой успешной эксплуатации прибора в течении нескольких лет.
Более того, в следующих разработках на основе STM32F407 у которого есть и поддержка SDIO для доступа к карте, и возможность поднятия USB 2.0 HS MSD (правда через параллельный ULPI интерфейс), рассматривается возможность использования решения на базе GL823 с коммутацией шины.
Используя связку STM32F407 с внешним PHY USB3300, удалось достигнуть скорости считывания карты ~41 Мбит/сек, тогда как при использовании хардварного картридера скорость достигает ~150 Мбит/сек при прочих равных условиях. Замеры производились путем считывания файла размером 128 Мбайт с SD карты, отформатированной в FAT32. У обоих подходов есть свои нюансы использования, но, как мне кажется, оба имеют «право на жизнь». Что касается нюансов: в моем случае, при следующей итерации разработки данного прибора, аппаратную часть было необходимо разместить на плате шириной 26 мм.
Разводка ПП для LQFP100 корпуса STM32F407 в этом случае несколько затруднительна, а вот его «младший собрат» STM32F405 в корпусе LQFP64 очень даже размещался. Но, у STM32F405 отсутствует ULPI, следовательно USB 2.0 HS для него недоступен, а реализация MSD FS сильно проигрывает в скорости считывания данных с карты. Используя-же вышеописанное решение, можно получить достаточную скорость доступа к SD со стороны компьютера во время считывания данных с устройства.
Буду рад, если мой опыт окажется для кого-то полезным.
Комментарии (29)
Reason89
14.02.2019 18:53Какую скорость считывания вы смогли реализовать на GL823? И почему перешли на usb3300?
olegvkv Автор
14.02.2019 20:12скорость при использовании GL823 составляет ~150 Мбит/сек, на USB3300 не переходил, а согласно рекомендаций уважаемого grafalex и изучения статьи CDC+MSC USB Composite Device на STM32 HAL, портировал его код с STM32F103 на STM32F407 для реализации композитного CDC+MSC device
Fox_Alex
14.02.2019 20:29Если карта получается несъемная, может лучше использовать чип обычного параллельного флэша? Там и скорости хорошие и контроллер с ним работает аппаратно и никакой пляски с SDIO.
olegvkv Автор
14.02.2019 20:49Планируется и такая реализация, но в отличии от SD card нужно:
больше ног (для STM32F407 удобно пользовать FSMC, а на 64 пиновом корпусе F405 этого интерфейса уже нет), следить за выравниванием износа (wear-leveling) (в SD этим занимается контроллер карты). Хотя второе замечание для организации логгера с последовательной посекторной записью, вероятно не так актуально, многое зависит от задачи. Например при реализации вышеописанного устройства целостность хранимой информации не столь важна и в значительной мере компенсируется ее избыточностью.daggert
15.02.2019 01:16Мб что-то типа 5025700893 от Молекса возьмете? Удобная штука, я для логгеров GPS юзаю.
olegvkv Автор
15.02.2019 06:39Есть вариант устройства и с таким коннектором, но, как оказалось, наиболее слабым местом является не столько способ установки карты на плату, сколько сама SD карта в условиях эксплуатации при повышенных температурных, вибрационных и ударных нагрузках…
Fox_Alex
15.02.2019 01:26Не бойтесь BGA и QFN, с ними все получается намного компактнее. А про износ — логгеру не нужна полноценная файловая система, можно просто писать во флэш по-кругу и изнашиваться он будет равномерно. Да и ресурс там сейчас ого-го, еще надо постараться его до дыр затереть)
olegvkv Автор
15.02.2019 06:47просто писать во флэш по-кругу
Примерно так и реализовано. Что касается QFN, то такие корпуса используются, BGA — же не знаю как поведут себя при значительных вибрациях и периодических температурных расширениях. Только планировал пробовать в опытной эксплуатации.
Reason89
15.02.2019 08:58Есть NAND c SPI(x1, x2, x4 интерфейсом), с которых можно считывать одновременно по 4 линиям SI. Скорость конечно не как у параллельной NAND, но близка к этому. Из плюсов меньший размер и меньшее количество задействованных ног.
rstepanov
15.02.2019 11:38+1Выше уже quad-spi flash посоветовали, для него много ног не нужно, а скорость будет заметно больше.
ЗЫ: AN4760 Quad-SPI (QSPI) interface on STM32 microcontrollersolegvkv Автор
15.02.2019 12:03Спасибо за совет, есть в наличии N25Q512A (512Mb quad-spi flash), но я их пока не пробовал.
remzalp
15.02.2019 08:51Учитывайте еще, что в зависимости от контроллера, запись на карту может осуществляться блоками приличного объема. Так что при записи фрагмента в килобайт на деле будет перезаписан блок мега 3 (немного далёк от текущих карт памяти). Так что запись 100 килобайт по порциям на физике будет перезапись 300 мег.
Изучите этот вопрос, возможно копеечный чип промежуточного кэша на несколько мег сильно поможет
Androniy
15.02.2019 14:38Блочно происходит стирание. На запись блоки меньше. Кэшировать можно прямо на контроллере, но проблема возникает с исчезновением данных при пропадании питания.
IgorPie
15.02.2019 14:07В статье немного сумбура, что в начале AVR, потом STM. И не понятно, как и зачем одно перетекает в другое.
В целом представлено нормальное решение. На просторах интернета натыкался на такое фото, видимо, логи там были подлиннее:
olegvkv Автор
15.02.2019 14:56Хронологически так и происходило, сначала медленный восьмиразрядный AVR через SPI, потом более быстрый STM через SDIO и в не зависимости от типа и производительности контроллера и используемого интерфейса доступа к памяти — однозначно шустрый доступ к карте через GL823 со стороны компьютера. Именно это я и пытался донести.
rstepanov
15.02.2019 15:30Стесняюсь спросить, а SDIO по однобитному интерфейсу работает? А то там тоже есть варианты:
olegvkv Автор
15.02.2019 19:07Когда говорят «подключить SD card через SPI» это и есть «SDIO по однобитному интерфейсу» (на картинке из CubeMX — SD 1 bit). Для 8-ми битных AVR контроллеров альтернативы не было, для STM32 можно использовать более производительный «SD 4 bits Wide bus»
rstepanov
15.02.2019 19:13для STM32 можно использовать более производительный «SD 4 bits Wide bus»
Да, я как раз интересовался, как оно с STM32 работало. На схеме вроде бы 4-битная шина нарисована, а по тексту непонятно было…IgorPie
15.02.2019 19:35Работает только в путь, причем сам STM32 шустрее, чем скорости заявленные в стандартах SD, поэтому однобитный вариант для конкрентных (современных) карт можно подразогнать в 2-4-8 раз.
olegvkv Автор
15.02.2019 20:16а по тексту непонятно было…
Вероятно я несколько косноязычен, издержки советского образования ;)
Да 4-битная шина работает, в составе куба масса примеров реализации в том числе и через DMA
scg
Я правильно понял, что вы припаяли MicroSD прямо на плату?
olegvkv Автор
да, правильно, феном
Fox_Alex
Кстати в каком режиме? Все карты нормально после этого работали?
olegvkv Автор
Нет не все, но как оказалось для SD карт наиболее губителен не перегрев при пайке феном, когда карта не запитана, а повышенные температуры во время эксплуатации. Карты начинают «деградировать». Проявляться это может как существенное увеличение времени записи на карту одного блока вплоть до невозможности работы с ней. Здесь один хабравчанин проводил тесты скорости чтения-записи и тока потребления карт памяти. В свое время мной были получены схожие результаты, только опубликованные в статье картинки могли сильно измениться в худшую сторону после тестовых прогонов на высокой температуре. Лечится подбором разных типов карт, причем одни и те-же карты из разных партий могут вести себя по разному. Дешевые noname карты могут показать себя лучше, чем industrial SD card с расширенным температурным диапазоном.
Fox_Alex
А не было сравнения работы паяной карты и подключенной в разъем? Понятно что при высокой температуре проблем будет больше в любом случае, но сказывается ли как-то на работе карты пайка?
olegvkv Автор
количественного анализа не было, но вполне допускаю, что пайка — не самое разумное решение.