USB Composite Library -> Sdreader Пример SDHC Windows 7

Мадиас
Чт 16 августа 2018 12:10
Привет,
Кто -то успешно использовал пример библиотеки «USB Composite» «Sdreader» с SDFATEX (также пробованным SDFAT) и картами SDHC (например, 32 ГБ) под Windows?
Я попробовал две карты: стандартный 2 ГБ и 32 ГБ SDHC (обе карты, отформатированные с официальным инструментом SD):
Обе карты хорошо работают со всеми примерами тестирования (например, эталона), так что это не карта/читатель или проблема с подключением.
Под OSX обе карты доступны и правильны, но медленная (другая проблема)
Под Windows 7 (та же машина -> MacBook Pro 2009) Распознана только 2 ГБ карта (и намного быстрее, чем на OSX), но 32 ГБ не верно (только 848 МБ) и крики Windows для переформатирования (но не может этого сделать)
Я также попытался снизить/повысить скорость SPI.
Это - более или менее - стандартный пример код: я думаю, что должно быть что -то более настроенное для его использования с помощью Windows и карт SDHC? #define audbuffsize 180 float rfbuf[audbuffsize];

Мадиас
Чт 16 августа 2018 г., 13:05
Хорошо, может быть, это также проблема с форматом:
SD Formatter использует FAT16 для карт <= 2 ГБ и FAT32 для больших, так что мой
2 ГБ карта = FAT16
32 ГБ карта = FAT32
Подключение 32 ГБ непосредственно к Windows 7 он показан правильным.

Арпрос
Чт 16 августа 2018 14:43
Глядя на код массового хранения, он рассматривает данные с использованием смещений Byte Uint32 (а не в секторе) и, следовательно, не может работать для более 4 ГБ. Это было в коде, который я адаптировал для использования с библиотекой, но это стоит изменить.

Мадиас
Чт 16 августа 2018 г. 15:33
Спасибо, ты нашел смысл!
Я изменился в USBMassStorage.H и USBMassStorage.CPP
# # Command file: jlink_upload - Linux Version # # Author: Nick KASPEROVIC - 20171016 (Version 0.0 - Draft) # # Original: Provided by Roger Clark / GitHub - 20161009 - Microsoft Version # ----------------------------------------------------------------------------- # # Modified: Nick KASPEROVIC (VK3TY) for use on Linux systems - 20161016 # ----------------------------------------------------------------------------- # Check for a (mandatory) parameter as our local variable. if [ "$#" -ne 1 ]; then echo "*** ERROR: Missing a parameter/s during call." exit fi echo "*** "echo off # Set a temporary file (with path) to a temporary variable. tmpBinFilePath="$1" echo "*** TRACE: \$tmpBinFilePath="$tmpBinFilePath echo " " # Create a JLink Commander script file with the tmp bin that the Arduino IDE creates echo loadbin $tmpBinFilePath , 0x1c000 > $tmpBinFilePath.jlink echo r >> $tmpBinFilePath.jlink echo q >> $tmpBinFilePath.jlink # Linux name given to original Windows based program JLink.exe. JLinkExe -device STM32F103C8 -if SWD -speed auto -CommanderScript $tmpBinFilePath.jlink

Мадиас
Чт 16 августа 2018 г. 15:46
Только недостаток - это скорость записи: копирование папки MP3 из Windows @ 146KB/S (самая высокая скорость SPI, SDFATEX, DMA включен, порт 1 (стандарт) SPI (стандарт)), но на OSX он медленнее.
Редактировать на моем домашнем компьюте...

Арпрос
Пт 17 августа 2018 г. 1:04
Интересно, лучше ли выполнить адресацию uint64 байта или использовать номера секторов. Преимущество UINT64 заключается в том, что числа секторов UINT32 будут иметь предел 2 ТБ.

** РЕДАКТИРОВАТЬ **: Невозможно. В любом случае, внедренные команды SCSI имеют предел 2 ТБ.

Арпрос
Пт 17 августа 2018 г., 2:09
Вам нужно будет изменить кучу больше вещей, если вы хотите прочитать за пределами первых 4 ГБ данных, хотя.

Мадиас
Пт 17 августа 2018 г., 7:56 утра
Хорошо, я вижу:
Я взял около 12 ГБ на SD -карте и после того, как 1/3 подпапки не показано правильно.
Я думаю, что более 2 ТБ не очень полезно для встроенных устройств (потому что отсутствие ОЗУ), но <4 ГБ - это слишком меньше для практических вещей (хранение/воспроизведение музыки, видео, регистратор данных)

AG123
Пт 17 августа 2018 г., 17:20
4 ГБ на самом деле не очень маленький, но потом на STM32F103CB мы (только) получили 20K SRAM
Тем не менее, я думаю, что это все еще достойная попытка «преодолеть» барьер 4 ГБ, но это может стоить дороже этого 20 -километрового SRAM
:ржу не могу:

Мадиас
Пт 17 августа 2018 г., 18:23
Я думаю, что это важный шаг, вызванный SD -картами, которые вы можете купить: карты менее 4 ГБ будут быстро исчезнуть с рынка (ожидайте особых потребностей, и они станут более дорогими).
Я не думаю, что это будет стоить действительно дороже, но я не эксперт.
Я исследую всю библиотеку и зависимости, мне неясно (особенно для всех зависимостей)
Тем временем я получил:
  • USBMassStorage.час
    USBMassStorage.CPP
    usb_mass_mal.час
    usb_mass_mal.в
    usb_mass.H (?)
    usb_mass.С (?)
    USB_SCSI.H (?)
    USB_SCSI.С (?)
    Все *массовые примеры

AG123
Пт 17 августа 2018 г., 20:59
Ну, я не слишком уверен, может ли это быть отчасти связано с некоторыми деталями реализации
Из любопытства я посмотрю на ссылку на команду SCSI
https: // www.Seagate.com/files/staticfil ... 93068H.PDF
со страницы содержимого он начинается с p.89 Читать (6), читать (10), читать (12) и прочитать (16)
Читайте (6) Используйте только 16 бит для адреса LBA, это дает не более 32 мег, следовательно, мы вряд ли будем использовать это
Читайте (10) Используйте 32 бит LBA, но длина передачи 16 бит, я предполагаю, что это должно быть адекватным
Если я работаю 2^32 * 512, который дает 2 ТБ, длину переноса 16 бит, я предполагал, что максимальная длина передачи 32 мег для этой транзакции.
Я не слишком уверен, имеет ли это какие -либо последствия, но я предполагаю, что это все еще будет работать, если чтения будут 1 или несколько секторов данных.
Прочитайте (12) Используйте 32 бита LBA и длину передачи 32 бит
В то время как чтение (16) Используйте 64 бита LBA и длину передачи 32 бит

Хранение USB-массы в основном SCSI над USB, и эта статья показывает интересную зависимость от чтения (10)
https: // блоги.MSDN.Microsoft.com/usbcor ... ompliance/
который, скорее всего, используется USB-массовым хранилищем в Windows, а также в другой ОС (E.глин. Linux)
Другая часть, которая несколько более непрозрачна, - это команды для чтения из / записи на SD -карту
ближе всего из карт MMC, остальные вряд ли можно найти в Интернете
http: // elm-chan.org/docs/mmc/mmc_e.HTML

Эта проблема может быть «трудно отлаживать», так как может показаться, что с 32 битами LBA мы сможем обратиться к любому из этих 2 -ТБ блоков (512 байт -секторов) на SD -карте. Я не слишком уверен, что может привести к тому, что настольная ОС считает, что SD -карта только 4 ГБ большой

О да, мы не говорим о SD-FAT здесь правильно? Обязательно разделить два. Хранение USB-массы не использует большую часть SD-FAT, за исключением, возможно, частей, которые читают/записывают секторы непосредственно на SD-карту.

(Я думаю, что, как говорит Апусс, я еще не выкопал коды, это адресация памяти, а не адресация сектора, которая вызвала ограничения. 2^23 * 512 = 4 ГБ, я думаю, что использование адресации сектора может сохранить некоторую память по сравнению с использованием int64, если он будет передаваться и дублируется в структурах, поскольку Int64 занимает 8 байтов для этого, а не 4. Но если используются коды SD-Fat, это может означать необходимость пересматривать части SD-Fat для SD-доступа)

Мадиас
Пт 17 августа 2018 г., 22:22
SDFAT (EX) все делайте правильно, даже с картами более 4 ГБ (я проверил папки и файлы через последовательный).
Я думаю, что строительство всего в секторах сломает SD -карты Fat16 или?

Арпрос
Сб 18 августа 2018 г. 12:10
Я изменил код массового хранения на работу с точки зрения секторов, тем самым в теории до 2 ТБ до 2 ТБ. Я на самом деле не протестировал ничего большего - пожалуйста, сделайте.

Обратные вызовы для чтения и записи должны быть изменены, так как теперь они находятся в терминах секторов. Смотрите примеры пересмотренной массы и SDReader. Я также изменил порядок аргументов в обратных вызовах, чтобы компилятор предупредил вас, если вы собираете старый код с новой библиотекой.

Мадиас
Сб 18 августа 2018 г., 7:30 утра
Спасибо, Arpruss!
Протестировал это с двумя картами:
2 ГБ SD (FAT16)
32 ГБ SDHC (FAT32, с файлами более 12 ГБ)
Теперь обе карты работают!
Windows 10: Как ни странно, 2 ГБ распознается немедленно, 32 ГБ через несколько секунд с предупреждением, что карта должна быть проверена. Но это работает без проблем.
Написание скорости SDHC Около 177 КБ/с - Как я читал на других форумах, это «нормальная» скорость (читать посты на нескольких форумах (Keil, Hal, Cube...)) с использованием SPI. SDIO должен повысить его до 2.5x. (Не протестирован, только у моей платы STM32F407 есть паянный читатель SDIO SD-карты)
Скорость чтения SDHC мерцает от 200 до 560 КБ/с. (Так среднее составляет около 400 кбит/с, не так уж и плохо)

AG123
Сб 18 августа 2018 г. 8:36 утра
Я думаю, что другое узкое место на самом деле работает с USB 2.0 полная скорость запчасти USB 2.0 Полная скорость в теории дает 10 Мбит / с, что дает что -то ближе к 1 Мбит / с больше всего.

Мадиас
Сб 18 августа 2018 г. 16:13
Я думаю, что работать на большей скорости - это настоящий эксперт.
Некоторые оффтопические: я пытаюсь отключить и включить USB -массовое хранилище, чтобы Windows (или любая другая ОС) распознавали карты переключения, выполняя «USBComposite.end () "работает, как и ожидалось. Карта исчезнет, ​​но usbcomposite.begin (); не появится новая карта (но та же карта!) снова. Единственный способ, которым я узнал, это сброс на основе кода. _> nvic_sys_reset ();
Может быть, это вызвано библиотекой SDFAT, потому что нет ничего похожего на «SD.End () "или Windows нуждается в дальнейшем коде.


Вот рабочий код для изменения SD -карт через кнопку, я снял серийный класс USB, потому что мне это не нужно. SEGGER J-Link Commander V6.10e (Compiled Oct 14 2016 21:01:30) Could not open J-Link shared library. Exiting now.

AG123
Сб 18 августа 2018 г., 19:21
Мне показалось бы, что изменение съемного носителя обычно осуществляется со стороны хоста ОС

Есть что -то довольно «древнее», которое считается UFI или дискета
http: // www.USB.org/разработчики/Docs/devc ... -UFI10.PDF

чаще, хост должен «выбросить» или «разоблачить» устройство

USB имеет что-то под названием USB-Reset, я.эн. Одиночный конец ноль (я.эн. Потяните обе линии D+ D-D-
http: // www.USBMADESIMPLE.сопутствующий.Великобритания/UMS_3.htm
Это должно заставить сторону хоста переоценить перечисление. Но это также означало бы, что устройство также должно сбросить
Это может быть обходной путь для смены СМИ, но я не уверен, доступны ли лучшие методы

Мадиас
Сб 18 августа 2018 г., 19:26
AG123: несколько секунд слишком поздно :)
Я отредактировал свой пост с рабочим кодом! $ JLinkExe SEGGER J-Link Commander V6.10d (Compiled Oct 6 2016 22:13:04) DLL version V6.10d, compiled Oct 6 2016 22:12:56 Connecting to J-Link via USB...O.K. Firmware: J-Link ARM-OB STM32 compiled Aug 22 2012 19:52:04 Hardware version: V7.00 S/N: 20160703 License(s): RDI,FlashDL,FlashBP,JFlash,GDBFull VTref = 3.300V

"бит" SPI PINS STM32F1