Danis 0 29 августа, 2019 Опубликовано 29 августа, 2019 · Жалоба Коллеги, приветствую Вас! У меня вопрос по реализации 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, или можно поправить текущую, хочется работать со всем объемом карты. Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 2 сентября, 2019 Опубликовано 2 сентября, 2019 · Жалоба On 8/29/2019 at 1:32 PM, Danis said: Проблема с microSD картами объемом >4 GB. Вероятно, проблема в драйвере SD карты, адресация для карт более 2ГБ в других единицах, в блоках. Но нужно больше инфы, самописный или чей SD драйвер? Что с железом? Рядом есть тема, рекомендую, некоторые советы будут полезны и Вам: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Danis 0 3 сентября, 2019 Опубликовано 3 сентября, 2019 · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться