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

Два вопроса по FatFS - смена диска и проверка состояния диска.

Вопрос №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(); всегда выдает ошибку...

Изменено пользователем murmur

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


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

Друзья, ну никак не получается

	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 диск, то все хорошо. 

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


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

2 часа назад, murmur сказал:

Монтирую оба диска - второй (USB) при таком коде не читается

Инициализация диска нужна перед его использованием при старте программы или если диск был извлечен и заново установлен. 

На счет работы параллельно с 2мя дисками, логично предположить, что где-то должен быть селектор дисков, чтобы при вызове низкоуровневой функции diskread(diskwrite) осуществлялось обращение к функции того устр-ва, которое закреплено за соотв. диском.

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


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

1 minute ago, mantech said:

что где-то должен быть селектор дисков,

Нет там селектора, просто указывается путь. 0: и 1: в начале пути  - это и есть селекция.

 

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


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

3 минуты назад, murmur сказал:

Нет там селектора, просто указывается путь. 0: и 1: в начале пути

Так в том и дело, что не работает, как diskread будет "узнавать", куда ей пойти на сд или усб??

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


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

Проблема какая то надуманная.

Исходники от FatFS на каждом углу валяются.

 

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


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

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 */
}

 

Изменено пользователем murmur

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


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

2 hours ago, murmur said:

Дык исходники просмотрены, сделано по примерам

Значит плохо просмотрены. По шагам пройдитесь.

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


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

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

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


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

16 минут назад, murmur сказал:

Посмотрите как сейчас.

Зачем все эти свичи? Что они дают? В случае, если работаете по очереди то с сд то с усб, наверно прокатит, тут нужно, чтобы селектор был в функциях чтения\записи и ioctl. тогда можно будет работать с одновременно замонтированными дисками, т.е. например копировать с одного на другой и не надо будет никаких

SWITCH_to_

...

18 минут назад, murmur сказал:

вместо &SDFatfs указано &USBHFatFS

Значит бардак, ибо все данные по ФС, включая параметры диска, буферов и т.п. перепутаны...

Изменено пользователем mantech

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


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

29 minutes ago, mantech said:

Зачем все эти свичи? Что они дают?

Нажал иконку флешки - запустился один свич, в окошке вывелся список файлов на флешке.

Нажал иконку карты - запустился другой свич, в окошке обновился список файлов.

30 minutes ago, mantech said:

можно будет работать с одновременно замонтированными дисками,

А мне одновременно работать не надо.

Под одновременностью понимается возможность чтения/записи и того  и другого в одной железке.

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


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

2 часа назад, murmur сказал:

А мне одновременно работать не надо.

Тогда вообще зачем этот зоопарк? 

1) по событию установки сд - запускаем инит сд, монтируем ее и ставим флаг "сд готова"

2) по событию установки усб флеши - делаем то же, что в п.1 сбрасываем флаг сд готова и устанавливаем усб готово

3) в функциях read, write, ctl - ставим выбор, куда переадресовать вызов в сд, усб или ошибку(нет ни той ни другой)

Все! не надо никаких дисков, 2х копий разделов ФАТ и т.д. зачем весь этот гемор? Диски нужны для одновременного монтирования нескольких устройств.

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


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

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.  Ничего не нужно переделывать и переадресовывать. Для каждого носителя написан свой код.

 

Давайте так. За ваши советы по архитектуре спасибо, но я сделаю по своему. Мне лишь нужно понять, в чем ошибка. И, поверьте, причина ошибки не в том, что я делаю не так, как вы посоветовали.

 

Хотелось продолжить повествование дальше, но, как мне кажется, на корень зла я все-таки вышла, попробую разобраться, потом отпишу.

 

 

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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