Mit dieser Library können normale USB-Sticks am USB-OTG-Port vom Discovery-Modul betrieben werden. Per FATFS-Library (die USB-Version) kann dann mit Filefunktionen darauf zugegriffen werden.
Die Librarys sind 100% kompatibel zur STM32F407 Version, aus dem Grund
für Details zur FATFS-Lib : LINK
für Detail zur USB-MSC-Host-Lib : LINK
Hinweis : ich hab hier zwei USB-Sticks ausprobiert. Einmal ein 8GB-Stick von SanDisk. Mit diesem kommt es aber zu einem Fehler -> “DEVICE_NOT_SUPPORTED”. Mit dem zweiten Stick, einem 4GB Intenso kommt kein Fehler und das schreiben und lesen funktioniert ohne Probleme.
Es wird ein USB-Adapter mit Micro-USB-Stecker benötigt. (gibts bei EBay oder Amazon)
Hinweis : weil für USB eine Clock-Frq von 48MHz zwingend notwendig ist und diese Frq mit einer Sysclock von 180MHz nicht einstellbar ist, wurde für diese Library der Sysclock auf 168MHz runtergesetzt !!
Benutzte Pins :
1 2 3 4 5 | PB13 -> USB_OTG_VBUS PB12 -> USB_OTG_ID PB14 -> USB_OTG_DM PB15 -> USB_OTG_DP PC4 -> USB_VBUS_Enable |
Enumerationen :
1 2 3 4 5 6 7 8 9 | typedef enum { USB_MSC_HOST_NO_INIT =0, // USB-Schnittstelle noch nicht initialisiert USB_MSC_DEV_DETACHED, // kein Device angeschlossen USB_MSC_SPEED_ERROR, // USB-Speed wird nicht unterstützt USB_MSC_DEV_NOT_SUPPORTED, // Device wird nicht untersützt USB_MSC_DEV_WRITE_PROTECT, // Device ist schreibgeschützt USB_MSC_OVER_CURRENT, // Überstrom erkannt USB_MSC_DEV_CONNECTED // Device verbunden und bereit }USB_MSC_HOST_STATUS_t; |
Funktionen :
1 2 | void UB_USB_MSC_HOST_Init(void); // zum init des USB-Host USB_MSC_HOST_STATUS_t UB_USB_MSC_HOST_Do(void); // zum check vom Device-Status |
Beispiel :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | //-------------------------------------------------------------- // File : main.c // Datum : 08.11.2013 // Version : 1.0 // Autor : UB // EMail : mc-4u(@)t-online.de // Web : www.mikrocontroller-4u.de // CPU : STM32F429 // IDE : CooCox CoIDE 1.7.4 // GCC : 4.7 2012q4 // Module : CMSIS_BOOT, M4_CMSIS_CORE // Funktion : Demo der USB-MSC-Host-Library // Hinweis : Diese zwei Files muessen auf 8MHz stehen // "cmsis_boot/stm32f4xx.h" // "cmsis_boot/system_stm32f4xx.c" // In Configuration diese Define hinzufügen : // "STM32F429_439xx" , "__ASSEMBLY__" , "USE_STDPERIPH_DRIVER" //-------------------------------------------------------------- #include "main.h" #include "stm32_ub_led.h" #include "stm32_ub_usb_msc_host.h" int main(void) { FIL myFile; // Filehandler uint8_t write_ok=0; SystemInit(); // Quarz Einstellungen aktivieren // Init der LEDs UB_Led_Init(); // Init vom USB-OTG-Port als MSC-HOST // (zum lesen/schreiben auf einen USB-Stick) UB_USB_MSC_HOST_Init(); while(1) { // pollen vom USB-Status if(UB_USB_MSC_HOST_Do()==USB_MSC_DEV_CONNECTED) { // wenn USB-Stick erkannt wurde UB_Led_On(LED_GREEN); // wenn File noch nicht geschrieben wurde if(write_ok==0) { write_ok=1; UB_Led_On(LED_RED); // Media mounten if(UB_Fatfs_Mount(USB_0)==FATFS_OK) { // File zum schreiben im root neu anlegen if(UB_Fatfs_OpenFile(&myFile, "USB_File.txt", F_WR_CLEAR)==FATFS_OK) { // ein paar Textzeilen in das File schreiben UB_Fatfs_WriteString(&myFile,"Test der WriteString-Funktion (STM32F429)"); UB_Fatfs_WriteString(&myFile,"hier Zeile zwei"); UB_Fatfs_WriteString(&myFile,"ENDE"); // File schliessen UB_Fatfs_CloseFile(&myFile); } // Media unmounten UB_Fatfs_UnMount(USB_0); } UB_Led_Off(LED_RED); } } else { // wenn kein USB-Stick vorhanden UB_Led_Off(LED_GREEN); } } } |
Hier die Library zum Download :
Hier der komplette CooCox-Projektordner zum Download :
Ich verstehe nicht warum genau immer nur einmal geschrieben wird.
Ziehe ich den USB Stick ab und stecke ihn wieder ein, wird wieder ein Datensatz geschrieben.
int main(void)
{
FIL myFile; // Filehandler
float temp;
ErrorStatus check;
char buf[20];
uint8_t i;
SystemInit(); // Quarz Einstellungen aktivieren
// Init der LEDs
UB_Led_Init();
// Init vom USB-OTG-Port als MSC-HOST
// (zum lesen/schreiben auf einen USB-Stick)
UB_USB_MSC_HOST_Init();
while(1)
{
check=UB_DS18XX_Init();
if(UB_USB_MSC_HOST_Do()==USB_MSC_DEV_CONNECTED) { if(check==SUCCESS) {
Delay(500000);
temp=UB_DS1822B20_ReadTemp(“2828C8D205000026″);
UB_DS18XX_TempToStr(temp,buf);
UB_Led_On(LED_GREEN);
UB_Led_On(LED_RED);
if(UB_Fatfs_Mount(USB_0)==FATFS_OK) {
// File zum schreiben im root anfügen
if(UB_Fatfs_OpenFile(&myFile, “Eierlog.txt”, F_WR)==FATFS_OK) {
UB_Fatfs_WriteString(&myFile,buf);
UB_Fatfs_CloseFile(&myFile);
}
UB_Fatfs_UnMount(USB_0);
}
UB_Led_Off(LED_RED);
for (i = 0; i < 10; ++i) {
Delay(500000);
}
}
}
}
}
Es ist definitiv so, dass
if(UB_Fatfs_Mount(USB_0)==FATFS_OK) {
nicht mehr wahr ist bis der Stick entfernt und wieder angesteckt wurde.
Die Funktion “UB_USB_MSC_HOST_Do()” darf nicht durch eine Pause verlangsamt werden. Du musst das ganze anders schreiben (ohne die Pause). Benutze einfach einen “Wartecounter”…so in der ART
Danke, haut hin, war einfach da ich sowieso die RTC auch benutze.
While experimenting with ths Demo, I found this typo.
In file ub_lib\usb_msc_host_lolevel\usbh_usr.c line 57:
USB_MSC_HOST_STATUS=USB_MSC_DEV_DETACHED;
should be:
USB_MSC_HOST_STATUS=USB_MSC_DEV_CONNECTED;
When I am trying to use this demo with stm32f429-disco and 512MB Flash, if(UB_USB_MSC_HOST_Do()==USB_MSC_DEV_CONNECTED) do not satisfyed.
In debugger process stops here
case HOST_CTRL_XFER:
/* process control transfer state machine */
USBH_HandleControl(pdev, phost);
break;
In this USBH_HandleControl(pdev, phost) procedure, URB_Status = URB_IDLE, phost->Control.status = CTRL_SETUP_WAIT.
please try the compiled HEX-File from the path “stm32f429/debug/bin”
what IDE do you use? What changes do you made? The project under CoIDE is tested many times.
When I programm MCU with HEX it works.
I use Atollic TRUE Studio. I made only few corrections in #include parts to compile project.
do you use the right “cmsis” library : the one for the stm32f429 not for the stm32f407. Is your systemclock at 168MHz (not 180MHz) and the PLL for USB at 48MHz. Other values than 48MHz and USB is not working !
Thank you, now it works
The problem was a wrong system clock.
I am trying to change this demo for working with OTG Full Speed on custom board with STMF429IIT6. USB schematics of this board almost the same as in STMF429I-DISCO. I initialize GPIO pins according PCB and change all other parts of initialization to work with USB_FS. Unfortunately, I found that program stuck in this cycle:
if(HCD_IsDeviceConnected(&USB_OTG_Core) && (USB_MSC_HOST_STATUS==USB_MSC_DEV_CONNECTED))
{
do
{
status = USBH_MSC_Read10(&USB_OTG_Core, buff, sector, 512*count);
USBH_MSC_HandleBOTXfer(&USB_OTG_Core ,&USB_Host);
if(!HCD_IsDeviceConnected(&USB_OTG_Core))
{
status=USBH_MSC_FAIL;
}
}
while(status == USBH_MSC_BUSY );
}
In debugger USBH_MSC_BOTXferParam.CmdStateMachine = CMD_WAIT_STATUS; status = USBH_MSC_BUSY .
I tried different USB flash drives but this didn’t make any effect. USB drive LED constantly blinking when program is executing.
In other words, I can’t perform f_getfree in UB_Fatfs_Mount fuction
check your clock settings…USB clock must be 48MHz and enabled. and the lib is USB FullSpeed if you want USB High-Speed you need an external PHY !!
Hello Alexander,
I have the same configuration than you and encountered the same problem. Could you please tell me if you found a solution and what was the source of the problem ?
Best regards
Thomas
i have the same problems on stm32f429 and stm32f407 discovery boards, when i try to read more than 512 bytes or try to read some several times, USBH_MSC_Read10 gets in infinite loop. find solution, i think it’s not good, but work – call UB_USB_MSC_HOST_Do not infinite loop:
/*Init USB HOST*/
UB_USB_MSC_HOST_Init ( );
while ( UB_USB_MSC_HOST_Do ( ) != USB_MSC_DEV_CONNECTED );
/****
your code
****/
And i use FreeRTOS so have to change USB interapt to:
void USB_OTG_BSP_EnableInterrupt(USB_OTG_CORE_HANDLE *pdev)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable USB Interrupt */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
NVIC_InitStructure.NVIC_IRQChannel = OTG_FS_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
Many thanks for this library! Works fine for my Kingston 8GB.
With this library i can run an image from inside the USB-Sticks?
Using your graphics library, it would be possible?
there is a lib to load images (*img, *jpg. *bmp) from a fatfs system.
but only for f407-disco.
not sure if it works without modifications at the f429-disco
try it out and write again if you need help
http://mikrocontroller.bplaced.net/wordpress/?page_id=870
Hello,
I am using EWARM and I am finding a problem using this code in my program. I have 5 errors showing the same
Error[Li006]: duplicate definitions for “USB_MSC_HOST_STATUS”; in “xxxxx
Did anyone confront this problem?
Thanks
Shawn
try to move the line :
"USB_MSC_HOST_STATUS_t USB_MSC_HOST_STATUS;
from the file “stm32_ub_usb_msc_host.h”
to the file “stm32_ub_usb_msc_host.c”
Hallo,
das Thema ist zwar schon etwas älter, aber ich habe das Problem wie einige vor mir.
Ich habe das Projekt: Demo_F429_21 runtergeladen und wenn ich einen USB Stick einstecke. Leuchten beide LEDs, aber er hängt fest in:
Datei: stm32_ub_usbdisk.c
Funktion: int USB_disk_read(BYTE *buff, DWORD sector, BYTE count)
Er kommt nicht mehr aus der do-while Schleife heraus.
Gibt es dazu eine Lösung?
Danke schonmal
Thomas