Перейти к содержанию
    

STM32 и USB Device Mass Storage

Коллеги, приветствую Вас!

У меня вопрос по реализации MSC, на STM32F2(F4), я скачал с сайта ST свежую версию

USB On-The-Go host and device library  STSW-STM32046 ver: 2.2.1. Для USB использую скорость FS. 

В качестве носителя использую microSD карты, 4,8,16,32 GB. Все довольно неплохо работает.

Скорость r,w пусть и не большая -около 0,8 MBps, но устраивает. 

Проблема с microSD картами объемом >4 GB. В системе W7(10), устройство определяется как картридер, верно показывает объем,

даже записывает, но уже с ошибками за пределами памяти 0xFFFFFFFF (>4 GB).

Собственно вопрос, есть ли "либы" на карты >4GB, или можно поправить текущую, хочется работать со всем объемом карты.

Спасибо!

MSC_001.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 8/29/2019 at 1:32 PM, Danis said:

Проблема с microSD картами объемом >4 GB.

Вероятно, проблема в драйвере SD карты, адресация для карт более 2ГБ в других единицах, в блоках. Но нужно больше инфы, самописный или чей SD драйвер? Что с железом?

Рядом есть тема, рекомендую, некоторые советы будут полезны и Вам:


 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 часа назад, Integro сказал:

Вероятно, проблема в драйвере SD карты, адресация для карт более 2ГБ в других единицах, в блоках. Но нужно больше инфы, самописный или чей SD драйвер? Что с железом?

Рядом есть тема, рекомендую, некоторые советы будут полезны и Вам:


 

Integro, спасибо за рекомендации. Я разобрался уже, отпишусь и возможно сэкономлю кому-то пару часов. 

Как уже писал, использую библиотеку ST  USB On-The-Go host and device library  STSW-STM32046 ver: 2.2.1. 

В ней готовая реализация USB MSC с применением SD карты, и в этой новой библиотеке SD > 4 GB определяются в ПК верно, ранее объем памяти обрезался до 4 GB. 

Вот мои правки файлов usbd_msc_scsi.c и usbd_storage_msd.c  для исправления ошибки:

uint64_t  SCSI_blk_addr;   // Правка, был тип uint32_t 

SD_Error SD_ReadMultiBlocks(uint8_t *readbuff, uint64_t ReadAddr, uint16_t BlockSize, uint32_t NumberOfBlocks);
SD_Error SD_WriteMultiBlocks(uint8_t *writebuff, uint64_t WriteAddr, uint16_t BlockSize, uint32_t NumberOfBlocks);


if (SD_ReadMultiBlocks(buf, (uint64_t)blk_addr * 512, 512, blk_len) != 0)  // правка - преобразование blk_addr к типу (uint64_t)
  {
    return -1;
  }

   if (SD_WriteMultiBlocks(buf, (uint64_t)blk_addr * 512, 512, blk_len) != 0) // правка - преобразование blk_addr к типу (uint64_t)
  { 
    return -1;
  }

Т.е. функции R/W MultiBlocks получают в качестве аргумента не № блока а адрес данных для операции R/W

и при умножении для старших блоков имеем выход за пределы типа uint32_t.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...