21-USB_MSC_HOST-Library (STM32F429)

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 :

fatfs_usb_f429_v100

usb_msc_host_f429_v100

Hier der komplette CooCox-Projektordner zum Download :

Demo_F429_21


20 Antworten auf 21-USB_MSC_HOST-Library (STM32F429)

  1. Joerg B sagt:

    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);
    }

    }
    }
    }
    }

  2. Joerg B sagt:

    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.

    • admin_ub sagt:

      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

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      
      uint32_t cnt1=0;
       
      while(1) {
        UB_USB_MSC_HOST_DO();
        cnt1++;
        if(cnt1&gt;500000) {
         // pause ist um
          cnt1=0;
          UB_DS1822B20_ReadTemp();
          (...)
        }
      }

  3. Joerg B sagt:

    Danke, haut hin, war einfach da ich sowieso die RTC auch benutze.

  4. Lurch sagt:

    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;

  5. Alexander N sagt:

    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.

    • admin_ub sagt:

      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.

      • Alexander N sagt:

        When I programm MCU with HEX it works.

        I use Atollic TRUE Studio. I made only few corrections in #include parts to compile project.

        • admin_ub sagt:

          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 !

          • Alexander N sagt:

            Thank you, now it works :)
            The problem was a wrong system clock.

  6. Alexander N sagt:

    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.

    • Alexander N sagt:

      In other words, I can’t perform f_getfree in UB_Fatfs_Mount fuction

      • admin_ub sagt:

        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 !!

    • Thomas m sagt:

      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

  7. Afik89 sagt:

    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);
    }

  8. Jc sagt:

    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?

    • admin_ub sagt:

      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

  9. Shawn sagt:

    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

    • admin_ub sagt:

      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”

  10. Thomas T sagt:

    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


Wie hat Dir dieser Artikel gefallen?

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (Noch keine Bewertungen)
Loading...

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.