Skocz do zawartości

STM32CubeMX/HAL + FatFS - jednoczesna obsługa kilku napędów


Pomocna odpowiedź

Napisano (edytowany)

W swoich projektach na PIC32 często korzystałem z kilku "napędów" jednocześnie. Często był to m.in. PenDrive, karta USB (przez SPI) oraz niewielka pamięć FLASH (również na SPI). Wtedy ręcznie pisałem funkcje w diskio.c, informując bibliotekę w jaki sposób dostać się do sektorów na poszczególnych urządzeniach. Każdemu urządzeniu ręcznie nadawało się jakiś numer, a potem w funkcji odwoływało się do konkretnego urządzenia w zależności od tego, jaki numer został przekazany przez parametr prdv.

Przykładowo:

/* Definitions of physical drive number for each drive */
#define SPI_FLASH		0	/* Example: Map SPI flash memory to physical drive 0 */
#define USB             1	/* Example: Map USB MSD to physical drive 1 */
#define MMC             2	/* Example: Map MMC/SD card to physical drive 2 */
  
DSTATUS disk_initialize (
	BYTE pdrv				/* Physical drive nmuber to identify the drive */
)
{
    MEDIA_INFORMATION *USBresult;

	switch (pdrv) {
        case SPI_FLASH :
            SPIFlashInit();
            return 0;

        case USB :
            USBresult = USBHostMSDSCSIMediaInitialize();
            if (USBresult->errorCode != MEDIA_NO_ERROR) USBStatus &= ~STA_NOINIT;
            return USBStatus;
            
        case MMC:
            if (SDStatus & STA_NODISK) return STA_NOINIT; //No card in the socket
            if (sd_init() == 0) SDStatus &= ~STA_NOINIT;
            return SDStatus;            
	}
	return STA_NOINIT;
}

Teraz przerzucam się na STM32 i uruchamiam jeden z moich pierwszych bardziej złożonych projektów na tej platformie (prostych wprawek nie liczę). Udało mi się uruchomić PenDrive, co praktycznie nie wymagało ode mnie żadnego wysiłku. Wystarczyło wyklikać kilka opcji, a potem po prostu zamontować system plików i od tego momentu mogę odwoływać się do nośnika USB jako urządzenia "0:\".

Teraz jednak chciałem dodać kolejne dwa urządzenia: kartę SD i pamięć FLASH. Obydwie są podłączone przez SPI, a więc konfiguracji nie da się wyklikać - trzeba samemu napisać/dodać i skonfigurować strownik. Do komunikacji z kartą SD postanowiłem wykorzystać ten kod znaleziony na GitHubie.

Teraz jednak utknąłem. Z tego co widzę, kod odpowiedzialny za niskopoziomową obsługę urządzeń w FatFS jest podzielony na dwa różne zastawy plików:

  • diskio.h i diskio.c - te są generowane automatycznie i zawierają kod odpowiedzialny za obsługę pamięci USB. Tam zapewne trafiłby też kod dotyczący karty podłączonej przez SDIO, gdybym takiej używał w projekcie.
  • user_diskio.h oraz user_diskio.c - tam znajdują się funkcje, do których treść musi dodać użytkownik. Pojawiają się one po kliknięciu opcji "user defined" w konfiguracji FatFS w STM32CubeMX.

Problem polega na tym, że nie wiem jaka jest relacja między tymi dwoma plikami. Z tego co widzę,numer "0" został automatycznie nadany pamięci USB. A gdzie mam zdefiniować numery, które chciałbym przypisać SD i SPI_FLASH? Bo przecież muszę te numery sprawdzać w funkcjach z pliku user_diskio.c, aby odwoływać się do właściwego urządzenia.

Niestety kod z podanego wyżej przykłady na GitHubie nie jest przydatny, bo jego autor po prostu założył, że jest tylko jeden nośnik (karta SD) i zrezygnował ze sprawdzania numeru przekazywanego przez pdrv.

Edytowano przez atlantis86

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...