Хабрахабр

[Из песочницы] Разделяй и властвуй, или медленно пишем — быстро читаем

Результаты замеров нужно было сохранять со скоростью 6 КБайт/сек, при этом длительность цикла сбора данных могла составлять сутки и более. В одном из моих проектов возникла необходимость последовательной записи оцифрованных наборов данных с 3-х каналов АЦП. В качестве устройства хранения было решено выбрать SD карту. Таким образом общий объем информации, который необходимо было сохранять, составлял 500 МБайт и более.

Контроллер XMega128A4U, на котором в то время реализовывалась задача, не имел аппаратной поддержки SDIO, но позволял работать с картой через SPI интерфейс, пропускная способность которого вполне допускала писать с требуемой скоростью, но вот считывание в компьютер такого объема данных по цепочке SD карта через SPI -> контроллер -> USB-Com преобразователь было достаточно тоскливым и занимало немалое время. Задача осложнялась тем, что конструктивные особенности создаваемого прибора не позволяли извлекать карту для считывания данных.

0. После некоторых раздумий (и безуспешных попыток несколько подразогнать вышеуказанную связку) было принято решение использовать хардварный SD Card Reader Controller, в качестве которого и был выбран чип GL823 поддерживающий USB 2. Такое разделение было реализовано с использованием двух 4-х канальных   мультиплексоров 2x1. Теперь было необходимо обеспечить раздельный доступ к SD карте со стороны контроллера по SPI во время сбора данных и со стороны компьютера через SDIO, посредством GL823 во время высокоскоростного считывания.

Для управления схемой используются сигналы SD2MCU, переключающий SD карту между MCU и GL823 и GL823_PWR, коммутирующий через мосфет питание GL823. Линии от коммутаторов U2, U3 с префиксом «STM» соединены с контроллером, линии с префиксом «SD» — с SD картой.

Изначально я рассматривал такой подход как некий «костыль», но, к моему немалому удивлению, он оказался вполне себе работоспособным и подтвердился практикой успешной эксплуатации прибора в течении нескольких лет.

0 HS MSD (правда через параллельный ULPI интерфейс), рассматривается возможность использования решения на базе GL823 с коммутацией шины. Более того, в следующих разработках на основе STM32F407 у которого есть и поддержка SDIO для доступа к карте, и возможность поднятия USB 2.

Замеры производились путем считывания файла размером 128 Мбайт с SD карты, отформатированной в FAT32. Используя связку STM32F407 с внешним PHY USB3300, удалось достигнуть скорости считывания карты ~41 Мбит/сек, тогда как при использовании хардварного картридера скорость достигает ~150 Мбит/сек при прочих равных условиях. Что касается нюансов: в моем случае, при следующей итерации разработки данного прибора, аппаратную часть было необходимо разместить на плате шириной 26 мм. У обоих подходов есть свои нюансы использования, но, как мне кажется, оба имеют «право на жизнь».

Но, у STM32F405 отсутствует ULPI, следовательно USB 2. Разводка ПП для LQFP100 корпуса STM32F407 в этом случае несколько затруднительна, а вот его «младший собрат» STM32F405 в корпусе LQFP64 очень даже размещался. Используя-же вышеописанное решение, можно получить достаточную скорость доступа к SD со стороны компьютера во время считывания данных с устройства. 0 HS для него недоступен, а реализация MSD FS сильно проигрывает в скорости считывания данных с карты.

Буду рад, если мой опыт окажется для кого-то полезным.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть