murmur 0 19 марта, 2021 Опубликовано 19 марта, 2021 (изменено) · Жалоба Вопрос №1 Нужно ли при смене диска на новый деинициализировать старый? То есть, как правильно, вот так f_mount(&USBHFatFS, (TCHAR const*)USBHPath, 0); f_mount(&SDFatFS, (TCHAR const*)SDPath, 0); или вот так? f_mount(&USBHFatFS, (TCHAR const*)USBHPath, 0); f_mount(NULL, (TCHAR const*)USBPath, 0); f_mount(&SDFatFS, (TCHAR const*)SDPath, 0); Вопрос №2. У меня на STM32H743, в сгенерированном калокубом проекте настроены USB MassStorage Class и SD интерфейс. Инициализирована FatFS, по умолчанию подключен USB диск. f_mount(&USBHFatFS, (TCHAR const*)USBHPath, 0); По таймеру вызываю функцию проверки статуса DSTATUS DS0,DS1; DS0=disk_status(0); DS1=disk_status(1); Извлечение и повторное подключение флешки ловятся на ура. Ну и с чтением после повторного подключения флешки все нормально. Извлечение SD карты тоже ловится, однако при повторном вставлении карты она уже не читается. Монтирование диска выдает ошибку FR_INVALID_OBJECT. До перезагрузки. Как бороться с этой бедой? Добавлю - если карта единожды извлечена, то потом, даже если ее вставить, SD_STATE=BSP_SD_GetCardState(); всегда выдает ошибку... Изменено 19 марта, 2021 пользователем murmur Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
murmur 0 19 марта, 2021 Опубликовано 19 марта, 2021 · Жалоба Вторую проблему решила принудительной переинициализацией SD. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
murmur 0 21 марта, 2021 Опубликовано 21 марта, 2021 · Жалоба Друзья, ну никак не получается if (f_mount(&USBHFatFS, (TCHAR const*)USBHPath, 1) == FR_OK) { } if (f_mount(&SDFatFS, (TCHAR const*)SDPath, 1) == FR_OK) {} CurrentPath="0:"; res = f_opendir(&dir, CurrentPath); files_found=0; res3 = f_readdir(&dir, 0); while(1) { res4 = f_readdir(&dir, &fileInfo); if (res4==FR_OK && fileInfo.fname[0]) { files_found++; } else break; } f_closedir(&dir); CurrentPath="1:"; res = f_opendir(&dir, CurrentPath); files_found2=0; res3 = f_readdir(&dir, 0); while(1) { res4 = f_readdir(&dir, &fileInfo); // ВОТ ЗДЕСЬ res4 равен FR_DISK_ERR if (res4==FR_OK && fileInfo.fname[0]) { files_found2++; } else break; } f_closedir(&dir); Монтирую оба диска - второй (USB) при таком коде не читается Если не понтировать SD диск, то все хорошо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 40 21 марта, 2021 Опубликовано 21 марта, 2021 · Жалоба 2 часа назад, murmur сказал: Монтирую оба диска - второй (USB) при таком коде не читается Инициализация диска нужна перед его использованием при старте программы или если диск был извлечен и заново установлен. На счет работы параллельно с 2мя дисками, логично предположить, что где-то должен быть селектор дисков, чтобы при вызове низкоуровневой функции diskread(diskwrite) осуществлялось обращение к функции того устр-ва, которое закреплено за соотв. диском. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
murmur 0 21 марта, 2021 Опубликовано 21 марта, 2021 · Жалоба 1 minute ago, mantech said: что где-то должен быть селектор дисков, Нет там селектора, просто указывается путь. 0: и 1: в начале пути - это и есть селекция. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 40 21 марта, 2021 Опубликовано 21 марта, 2021 · Жалоба 3 минуты назад, murmur сказал: Нет там селектора, просто указывается путь. 0: и 1: в начале пути Так в том и дело, что не работает, как diskread будет "узнавать", куда ей пойти на сд или усб?? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 45 21 марта, 2021 Опубликовано 21 марта, 2021 · Жалоба Проблема какая то надуманная. Исходники от FatFS на каждом углу валяются. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
murmur 0 21 марта, 2021 Опубликовано 21 марта, 2021 (изменено) · Жалоба 35 minutes ago, x893 said: Проблема какая то надуманная. Исходники от FatFS на каждом углу валяются. Дык исходники просмотрены, сделано по примерам 52 minutes ago, mantech said: ак diskread будет "узнавать", куда ей пойти на сд или усб?? Она знает об этом заранее oid MX_FATFS_Init(void) { /*## FatFS: Link the SD driver ###########################*/ retSD = FATFS_LinkDriver(&SD_Driver, SDPath); /*## FatFS: Link the USBH driver ###########################*/ retUSBH = FATFS_LinkDriver(&USBH_Driver, USBHPath); /* USER CODE BEGIN Init */ /* additional user code for init */ /* USER CODE END Init */ } Изменено 21 марта, 2021 пользователем murmur Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 45 21 марта, 2021 Опубликовано 21 марта, 2021 · Жалоба 2 hours ago, murmur said: Дык исходники просмотрены, сделано по примерам Значит плохо просмотрены. По шагам пройдитесь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
murmur 0 21 марта, 2021 Опубликовано 21 марта, 2021 · Жалоба 22 minutes ago, x893 said: Значит плохо просмотрены. По шагам пройдитесь. Посмотрите как сейчас. void SWITCH_to_USB() { CurrentPath="1:"; if (f_mount(&USBHFatFS, (TCHAR const*)USBHPath, 0) == FR_OK) { ReadDisk(); } } void SWITCH_to_SD() { CurrentPath="0:"; if (f_mount(&USBHFatFS, (TCHAR const*)SDPath, 0) == FR_OK) // ВОТ ЗДЕСЬ СДЕЛАНА ОШИБКА, ИЗ-ЗА КОТОРОЙ ТЕМ НЕ МЕНЕЕ, ВСЕ РАБОТАЕТ - вместо &SDFatfs указано &USBHFatFS { ReadDisk(); } } сделана ошибка, из-за которой почему-то все работает- вместо &SDFatfs указано &USBHFatFS Ошибка сделана в функции переключения на SD, но это влияет на работу USB. С однократным монтированием почему-то не выходит, при обращении к USB диску f_opendir отрабатывает нормально, но f_readdir возвращает FR_DISK_ERR нутри ReadDisk() вызывается f_opendir, в которую и подставляется CurrentPach Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 40 21 марта, 2021 Опубликовано 21 марта, 2021 (изменено) · Жалоба 16 минут назад, murmur сказал: Посмотрите как сейчас. Зачем все эти свичи? Что они дают? В случае, если работаете по очереди то с сд то с усб, наверно прокатит, тут нужно, чтобы селектор был в функциях чтения\записи и ioctl. тогда можно будет работать с одновременно замонтированными дисками, т.е. например копировать с одного на другой и не надо будет никаких SWITCH_to_ ... 18 минут назад, murmur сказал: вместо &SDFatfs указано &USBHFatFS Значит бардак, ибо все данные по ФС, включая параметры диска, буферов и т.п. перепутаны... Изменено 21 марта, 2021 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
murmur 0 21 марта, 2021 Опубликовано 21 марта, 2021 · Жалоба 29 minutes ago, mantech said: Зачем все эти свичи? Что они дают? Нажал иконку флешки - запустился один свич, в окошке вывелся список файлов на флешке. Нажал иконку карты - запустился другой свич, в окошке обновился список файлов. 30 minutes ago, mantech said: можно будет работать с одновременно замонтированными дисками, А мне одновременно работать не надо. Под одновременностью понимается возможность чтения/записи и того и другого в одной железке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 40 21 марта, 2021 Опубликовано 21 марта, 2021 · Жалоба 2 часа назад, murmur сказал: А мне одновременно работать не надо. Тогда вообще зачем этот зоопарк? 1) по событию установки сд - запускаем инит сд, монтируем ее и ставим флаг "сд готова" 2) по событию установки усб флеши - делаем то же, что в п.1 сбрасываем флаг сд готова и устанавливаем усб готово 3) в функциях read, write, ctl - ставим выбор, куда переадресовать вызов в сд, усб или ошибку(нет ни той ни другой) Все! не надо никаких дисков, 2х копий разделов ФАТ и т.д. зачем весь этот гемор? Диски нужны для одновременного монтирования нескольких устройств. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
murmur 0 21 марта, 2021 Опубликовано 21 марта, 2021 · Жалоба 8 minutes ago, mantech said: 1) по событию установки сд - запускаем инит сд, монтируем ее и ставим флаг "сд готова" 2) по событию установки усб флеши - делаем то же, что в п.1 сбрасываем флаг сд готова и устанавливаем усб готово Уважаемый, я стараюсь сделать дружественный для пользователя интерфейс. В окошке иконки двух носителей, хочется, чтобы отображалось состояние обоих, с изменением иконки. А состояния 3 - нет носителя, носитель есть и с ним не все в порядке, носитель есть и с ним все в порядке. у меня к Вам вопрос - а если пользователь надумает вставить USB флешку, не вынимая при этом SD карту, как тогда поведет себя ваш алгоритм? Вот хочу я видеть в окошке список файлов на SD карте, а в это время вставлять и вынимать USB флешку и наблюдать, как меняется иконка. Хочу чтобы как в компьютере выглядело, создавало впечатление проработанного и совершенного продукта. Пока что у меня это работает, но при условии, что я каждый раз при обращении к другому диску вызываю f_mount. 11 minutes ago, mantech said: 3) в функциях read, write, ctl - ставим выбор, куда переадресовать вызов в сд, усб или ошибку(нет ни той ни другой) Уважаемый, мой проект сгенерирован Кубом. В нем есть два отдельных файла - sd_diskio.c и usbh_diskio.c. Ничего не нужно переделывать и переадресовывать. Для каждого носителя написан свой код. Давайте так. За ваши советы по архитектуре спасибо, но я сделаю по своему. Мне лишь нужно понять, в чем ошибка. И, поверьте, причина ошибки не в том, что я делаю не так, как вы посоветовали. Хотелось продолжить повествование дальше, но, как мне кажется, на корень зла я все-таки вышла, попробую разобраться, потом отпишу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 45 21 марта, 2021 Опубликовано 21 марта, 2021 · Жалоба Выложите проект - глядишь кто-нибудь и посмотрит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться