Skocz do zawartości

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


Pomocna odpowiedź

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
Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.