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


  1. scg
    14.02.2019 17:43

    Я правильно понял, что вы припаяли MicroSD прямо на плату?


    1. olegvkv Автор
      14.02.2019 19:50

      да, правильно, феном


      1. Fox_Alex
        15.02.2019 19:01

        Кстати в каком режиме? Все карты нормально после этого работали?


        1. olegvkv Автор
          15.02.2019 20:00

          Нет не все, но как оказалось для SD карт наиболее губителен не перегрев при пайке феном, когда карта не запитана, а повышенные температуры во время эксплуатации. Карты начинают «деградировать». Проявляться это может как существенное увеличение времени записи на карту одного блока вплоть до невозможности работы с ней. Здесь один хабравчанин проводил тесты скорости чтения-записи и тока потребления карт памяти. В свое время мной были получены схожие результаты, только опубликованные в статье картинки могли сильно измениться в худшую сторону после тестовых прогонов на высокой температуре. Лечится подбором разных типов карт, причем одни и те-же карты из разных партий могут вести себя по разному. Дешевые noname карты могут показать себя лучше, чем industrial SD card с расширенным температурным диапазоном.


          1. Fox_Alex
            15.02.2019 20:24

            А не было сравнения работы паяной карты и подключенной в разъем? Понятно что при высокой температуре проблем будет больше в любом случае, но сказывается ли как-то на работе карты пайка?


            1. olegvkv Автор
              15.02.2019 20:30

              количественного анализа не было, но вполне допускаю, что пайка — не самое разумное решение.


  1. Reason89
    14.02.2019 18:53

    Какую скорость считывания вы смогли реализовать на GL823? И почему перешли на usb3300?


    1. olegvkv Автор
      14.02.2019 20:12

      скорость при использовании GL823 составляет ~150 Мбит/сек, на USB3300 не переходил, а согласно рекомендаций уважаемого grafalex и изучения статьи CDC+MSC USB Composite Device на STM32 HAL, портировал его код с STM32F103 на STM32F407 для реализации композитного CDC+MSC device


  1. Fox_Alex
    14.02.2019 20:29

    Если карта получается несъемная, может лучше использовать чип обычного параллельного флэша? Там и скорости хорошие и контроллер с ним работает аппаратно и никакой пляски с SDIO.


    1. olegvkv Автор
      14.02.2019 20:49

      Планируется и такая реализация, но в отличии от SD card нужно:
      больше ног (для STM32F407 удобно пользовать FSMC, а на 64 пиновом корпусе F405 этого интерфейса уже нет), следить за выравниванием износа (wear-leveling) (в SD этим занимается контроллер карты). Хотя второе замечание для организации логгера с последовательной посекторной записью, вероятно не так актуально, многое зависит от задачи. Например при реализации вышеописанного устройства целостность хранимой информации не столь важна и в значительной мере компенсируется ее избыточностью.


      1. daggert
        15.02.2019 01:16

        Мб что-то типа 5025700893 от Молекса возьмете? Удобная штука, я для логгеров GPS юзаю.


        1. olegvkv Автор
          15.02.2019 06:39

          Есть вариант устройства и с таким коннектором, но, как оказалось, наиболее слабым местом является не столько способ установки карты на плату, сколько сама SD карта в условиях эксплуатации при повышенных температурных, вибрационных и ударных нагрузках…


      1. Fox_Alex
        15.02.2019 01:26

        Не бойтесь BGA и QFN, с ними все получается намного компактнее. А про износ — логгеру не нужна полноценная файловая система, можно просто писать во флэш по-кругу и изнашиваться он будет равномерно. Да и ресурс там сейчас ого-го, еще надо постараться его до дыр затереть)


        1. olegvkv Автор
          15.02.2019 06:47

          просто писать во флэш по-кругу
          Примерно так и реализовано. Что касается QFN, то такие корпуса используются, BGA — же не знаю как поведут себя при значительных вибрациях и периодических температурных расширениях. Только планировал пробовать в опытной эксплуатации.


      1. Reason89
        15.02.2019 08:58

        Есть NAND c SPI(x1, x2, x4 интерфейсом), с которых можно считывать одновременно по 4 линиям SI. Скорость конечно не как у параллельной NAND, но близка к этому. Из плюсов меньший размер и меньшее количество задействованных ног.


      1. rstepanov
        15.02.2019 11:38
        +1

        Выше уже quad-spi flash посоветовали, для него много ног не нужно, а скорость будет заметно больше.

        ЗЫ: AN4760 Quad-SPI (QSPI) interface on STM32 microcontrollers


        1. olegvkv Автор
          15.02.2019 12:03

          Спасибо за совет, есть в наличии N25Q512A (512Mb quad-spi flash), но я их пока не пробовал.


  1. remzalp
    15.02.2019 08:51

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


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


    1. Androniy
      15.02.2019 14:38

      Блочно происходит стирание. На запись блоки меньше. Кэшировать можно прямо на контроллере, но проблема возникает с исчезновением данных при пропадании питания.


  1. IgorPie
    15.02.2019 14:07

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

    image


    1. olegvkv Автор
      15.02.2019 14:56

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


      1. rstepanov
        15.02.2019 15:30

        Стесняюсь спросить, а SDIO по однобитному интерфейсу работает? А то там тоже есть варианты:

        image


        1. olegvkv Автор
          15.02.2019 19:07

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


          1. rstepanov
            15.02.2019 19:13

            для STM32 можно использовать более производительный «SD 4 bits Wide bus»

            Да, я как раз интересовался, как оно с STM32 работало. На схеме вроде бы 4-битная шина нарисована, а по тексту непонятно было…


            1. IgorPie
              15.02.2019 19:35

              Работает только в путь, причем сам STM32 шустрее, чем скорости заявленные в стандартах SD, поэтому однобитный вариант для конкрентных (современных) карт можно подразогнать в 2-4-8 раз.


            1. olegvkv Автор
              15.02.2019 20:16

              а по тексту непонятно было…
              Вероятно я несколько косноязычен, издержки советского образования ;)
              Да 4-битная шина работает, в составе куба масса примеров реализации в том числе и через DMA


      1. IgorPie
        15.02.2019 19:41

        Спасибо, теперь все встало на свои места.


  1. sinrab
    16.02.2019 23:04

    У Вас adg774 перекосило (переходное отверстие не закрыто маской).


    1. olegvkv Автор
      17.02.2019 05:21

      Я думал этот комментарий будет первым, но первым был про припаянную SD карту ;)