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

в 13:05, , рубрики: microSD, sd, stm32, stm32F, USB 2.0, xmega, коммутатор, программирование микроконтроллеров, схемотехника

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

В одном из моих проектов возникла необходимость последовательной записи оцифрованных наборов данных с 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.

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

Линии от коммутаторов 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 со стороны компьютера во время считывания данных с устройства.

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

Автор: olegvkv

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js