- PVSM.RU - https://www.pvsm.ru -

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

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

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

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

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

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

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

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

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

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

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

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

Автор: olegvkv

Источник [4]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/stm32/308828

Ссылки в тексте:

[1] XMega128A4U: http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-8387-8-and16-bit-AVR-Microcontroller-XMEGA-A4U_Datasheet.pdf

[2] GL823: https://datasheet.lcsc.com/szlcsc/Genesys-Logic-GL823_C48653.pdf

[3] STM32F407: https://www.st.com/content/ccc/resource/technical/document/reference_manual/3d/6d/5a/66/b4/99/40/d4/DM00031020.pdf/files/DM00031020.pdf/jcr:content/translations/en.DM00031020.pdf

[4] Источник: https://habr.com/ru/post/440308/?utm_source=habrahabr&utm_medium=rss&utm_campaign=440308