atlantis86 Napisano Styczeń 27, 2021 Udostępnij Napisano Styczeń 27, 2021 (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 Styczeń 27, 2021 przez atlantis86 Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!