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


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


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


Поделиться публикацией

Похожие публикации

Комментарии 32

    +1
    Я правильно понял, что вы припаяли MicroSD прямо на плату?
      0
      да, правильно, феном
        0
        Кстати в каком режиме? Все карты нормально после этого работали?
          0
          Нет не все, но как оказалось для SD карт наиболее губителен не перегрев при пайке феном, когда карта не запитана, а повышенные температуры во время эксплуатации. Карты начинают «деградировать». Проявляться это может как существенное увеличение времени записи на карту одного блока вплоть до невозможности работы с ней. Здесь один хабравчанин проводил тесты скорости чтения-записи и тока потребления карт памяти. В свое время мной были получены схожие результаты, только опубликованные в статье картинки могли сильно измениться в худшую сторону после тестовых прогонов на высокой температуре. Лечится подбором разных типов карт, причем одни и те-же карты из разных партий могут вести себя по разному. Дешевые noname карты могут показать себя лучше, чем industrial SD card с расширенным температурным диапазоном.
            0
            А не было сравнения работы паяной карты и подключенной в разъем? Понятно что при высокой температуре проблем будет больше в любом случае, но сказывается ли как-то на работе карты пайка?
              0
              количественного анализа не было, но вполне допускаю, что пайка — не самое разумное решение.
      0
      Какую скорость считывания вы смогли реализовать на GL823? И почему перешли на usb3300?
        0
        скорость при использовании GL823 составляет ~150 Мбит/сек, на USB3300 не переходил, а согласно рекомендаций уважаемого grafalex и изучения статьи CDC+MSC USB Composite Device на STM32 HAL, портировал его код с STM32F103 на STM32F407 для реализации композитного CDC+MSC device
        0
        Если карта получается несъемная, может лучше использовать чип обычного параллельного флэша? Там и скорости хорошие и контроллер с ним работает аппаратно и никакой пляски с SDIO.
          0
          Планируется и такая реализация, но в отличии от SD card нужно:
          больше ног (для STM32F407 удобно пользовать FSMC, а на 64 пиновом корпусе F405 этого интерфейса уже нет), следить за выравниванием износа (wear-leveling) (в SD этим занимается контроллер карты). Хотя второе замечание для организации логгера с последовательной посекторной записью, вероятно не так актуально, многое зависит от задачи. Например при реализации вышеописанного устройства целостность хранимой информации не столь важна и в значительной мере компенсируется ее избыточностью.
            0
            Мб что-то типа 5025700893 от Молекса возьмете? Удобная штука, я для логгеров GPS юзаю.
              0
              Есть вариант устройства и с таким коннектором, но, как оказалось, наиболее слабым местом является не столько способ установки карты на плату, сколько сама SD карта в условиях эксплуатации при повышенных температурных, вибрационных и ударных нагрузках…
              0
              Не бойтесь BGA и QFN, с ними все получается намного компактнее. А про износ — логгеру не нужна полноценная файловая система, можно просто писать во флэш по-кругу и изнашиваться он будет равномерно. Да и ресурс там сейчас ого-го, еще надо постараться его до дыр затереть)
                0
                просто писать во флэш по-кругу
                Примерно так и реализовано. Что касается QFN, то такие корпуса используются, BGA — же не знаю как поведут себя при значительных вибрациях и периодических температурных расширениях. Только планировал пробовать в опытной эксплуатации.
                0
                Есть NAND c SPI(x1, x2, x4 интерфейсом), с которых можно считывать одновременно по 4 линиям SI. Скорость конечно не как у параллельной NAND, но близка к этому. Из плюсов меньший размер и меньшее количество задействованных ног.
                  +1
                  Выше уже quad-spi flash посоветовали, для него много ног не нужно, а скорость будет заметно больше.

                  ЗЫ: AN4760 Quad-SPI (QSPI) interface on STM32 microcontrollers
                    0
                    Спасибо за совет, есть в наличии N25Q512A (512Mb quad-spi flash), но я их пока не пробовал.
                0

                Учитывайте еще, что в зависимости от контроллера, запись на карту может осуществляться блоками приличного объема. Так что при записи фрагмента в килобайт на деле будет перезаписан блок мега 3 (немного далёк от текущих карт памяти). Так что запись 100 килобайт по порциям на физике будет перезапись 300 мег.


                Изучите этот вопрос, возможно копеечный чип промежуточного кэша на несколько мег сильно поможет

                  0
                  Блочно происходит стирание. На запись блоки меньше. Кэшировать можно прямо на контроллере, но проблема возникает с исчезновением данных при пропадании питания.
                  0
                  В статье немного сумбура, что в начале AVR, потом STM. И не понятно, как и зачем одно перетекает в другое.
                  В целом представлено нормальное решение. На просторах интернета натыкался на такое фото, видимо, логи там были подлиннее:

                  image

                    0
                    Хронологически так и происходило, сначала медленный восьмиразрядный AVR через SPI, потом более быстрый STM через SDIO и в не зависимости от типа и производительности контроллера и используемого интерфейса доступа к памяти — однозначно шустрый доступ к карте через GL823 со стороны компьютера. Именно это я и пытался донести.
                      0
                      Стесняюсь спросить, а SDIO по однобитному интерфейсу работает? А то там тоже есть варианты:

                      image
                        0
                        Когда говорят «подключить SD card через SPI» это и есть «SDIO по однобитному интерфейсу» (на картинке из CubeMX — SD 1 bit). Для 8-ми битных AVR контроллеров альтернативы не было, для STM32 можно использовать более производительный «SD 4 bits Wide bus»
                          0
                          для STM32 можно использовать более производительный «SD 4 bits Wide bus»

                          Да, я как раз интересовался, как оно с STM32 работало. На схеме вроде бы 4-битная шина нарисована, а по тексту непонятно было…
                            0
                            Работает только в путь, причем сам STM32 шустрее, чем скорости заявленные в стандартах SD, поэтому однобитный вариант для конкрентных (современных) карт можно подразогнать в 2-4-8 раз.
                              0
                              а по тексту непонятно было…
                              Вероятно я несколько косноязычен, издержки советского образования ;)
                              Да 4-битная шина работает, в составе куба масса примеров реализации в том числе и через DMA
                          0
                          Спасибо, теперь все встало на свои места.
                        0
                        У Вас adg774 перекосило (переходное отверстие не закрыто маской).
                          0
                          Я думал этот комментарий будет первым, но первым был про припаянную SD карту ;)
                            0
                            Да и про прямые углы стоило бы упомянуть :)
                              0
                              и про отмывку
                                0
                                со всем полностью согласен

                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                        Самое читаемое