打印
[DemoCode下载]

[USBH][M451]如何读写U盘的资料

[复制链接]
3899|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tcchiu1|  楼主 | 2015-1-19 14:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tcchiu1 于 2015-1-19 14:50 编辑

U盘的价格越来越便宜。如果存取的资料量大,就可以直接使用USB host,对U盘控制。

新唐在Cortex-M系统中,只有M4系列有支持USB host。以M451而言,提供的范列,是直接修改FatFs官网程序。

刚开始在学习时,对一般人而言,太复杂。没有辨法比较快速上手。於是乎改写一下程序流程,单纯读写资料。程序路径如下。

\M451SeriesBSP_CMSIS_v3.00.005\SampleCode\Customer\USBH_UMAS_Simple

USBH_ProcessHubEvents()是非常重要函数,系统必须透过它,才可以判断USB设备是否连接。

它有一个限制,只能放在主程序里。

呼叫USBH_ProcessHubEvents(),如果回传值不为0,表示有USB设备连接或者脱离。

进一步就可以利用disk_status(0),这个设备是否为U盘。


        /*USBH_ProcessHubEvents() must be executed at main loop*/
        if(USBH_ProcessHubEvents())//Check USB device status Change for plug-in and unplug
        {
            if(disk_status(0))//Check mass storage device status
                put_rc(f_mount(0, NULL));//unplug
            else         
                put_rc(f_mount(0, &FatFs[0]));//plug-in
        }

一旦分辨到U盘,即可使用以下函数,读写U盘里的资料。
f_open()
f_close()
f_write()
f_read()





M451SeriesBSP_CMSIS_v3.00.005_USBH_UMAS.zip

1.3 MB

沙发
gaoyang9992006| | 2015-1-20 14:34 | 只看该作者
这个有用,需要用到USB的知识。

使用特权

评论回复
板凳
gxliu08| | 2015-1-20 20:08 | 只看该作者
这个可以,正好在做这方面课题。

使用特权

评论回复
地板
gaoyang9992006| | 2015-1-20 22:58 | 只看该作者
/*-----------------------------------------------------------------------*/
/* Low level disk I/O module skeleton for FatFs     (C)ChaN, 2013        */
/*-----------------------------------------------------------------------*/
/* If a working storage control module is available, it should be        */
/* attached to the FatFs via a glue function rather than modifying it.   */
/* This is an example of glue functions to attach various existing      */
/* storage control module to the FatFs module with a defined API.        */
/*-----------------------------------------------------------------------*/

#include <stdio.h>
#include <string.h>
#include "M451Series.h"
#include "diskio.h"     /* FatFs lower layer API */
#include "usbh_core.h"
#include "usbh_umas.h"

#define SUPPORT_USBH
//#define SUPPORT_SDIO


/* Definitions of physical drive number for each media */
#define DRV_USBH    0
#define DRV_SD      1
#define DRV_FMC     2


/*-----------------------------------------------------------------------*/
/* Initialize a Drive                                                    */
/*-----------------------------------------------------------------------*/

DSTATUS disk_initialize(
    BYTE pdrv               /* Physical drive number (0..) */
)
{
    switch(pdrv)
    {

#ifdef SUPPORT_USBH
        case DRV_USBH :
            USBH_ProcessHubEvents();
            // translate the result code here
            return RES_OK;
#endif

        case DRV_SD :
            return RES_PARERR;
    }

    return RES_PARERR;
}


/*-----------------------------------------------------------------------*/
/* Get Disk Status                                                       */
/*-----------------------------------------------------------------------*/

DSTATUS disk_status(
    BYTE pdrv       /* Physical drive number (0..) */
)
{
    switch(pdrv)
    {

#ifdef SUPPORT_USBH
        case DRV_USBH :
            return usbh_umas_disk_status();
#endif

        case DRV_SD :
            break;
    }
    return STA_NOINIT;
}



/*-----------------------------------------------------------------------*/
/* Read Sector(s)                                                        */
/*-----------------------------------------------------------------------*/

DRESULT disk_read(
    BYTE pdrv,      /* Physical drive number (0..) */
    BYTE *buff,     /* Data buffer to store read data */
    DWORD sector,   /* Sector address (LBA) */
    BYTE count      /* Number of sectors to read (1..128) */
)
{
    switch(pdrv)
    {

#ifdef SUPPORT_USBH
        case DRV_USBH :
            return usbh_umas_read(buff, sector, count);
#endif

        case DRV_SD :
            break;

    }
    return RES_PARERR;
}



/*-----------------------------------------------------------------------*/
/* Write Sector(s)                                                       */
/*-----------------------------------------------------------------------*/

#if _USE_WRITE
DRESULT disk_write(
    BYTE pdrv,          /* Physical drive number (0..) */
    const BYTE *buff,   /* Data to be written */
    DWORD sector,       /* Sector address (LBA) */
    BYTE count          /* Number of sectors to write (1..128) */
)
{
    switch(pdrv)
    {

#ifdef SUPPORT_USBH
        case DRV_USBH :
            return usbh_umas_write((uint8_t *)buff, sector, count);
#endif

        case DRV_SD :
            break;
    }
    return RES_PARERR;
}
#endif


/*-----------------------------------------------------------------------*/
/* Miscellaneous Functions                                               */
/*-----------------------------------------------------------------------*/

#if _USE_IOCTL
DRESULT disk_ioctl(
    BYTE pdrv,      /* Physical drive number (0..) */
    BYTE cmd,       /* Control code */
    void *buff      /* Buffer to send/receive control data */
)
{
    switch(pdrv)
    {

#ifdef SUPPORT_USBH
        case DRV_USBH :
            return usbh_umas_ioctl(cmd, buff);
#endif

        case DRV_SD :
            break;

    }
    return RES_PARERR;
}
#endif

使用特权

评论回复
5
gaoyang9992006| | 2015-1-20 22:59 | 只看该作者
/**************************************************************************//**
* @file     main.c
* @version  V1.00
* $Revision: 20 $
* $Date: 14/10/28 6:11p $
* @brief
*           Show how to implement a USB Host with a file system to read/write a file on USB Mass Storage.
*
* @note
* Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
*****************************************************************************/
#include <stdio.h>
#include <string.h>
#include "M451Series.h"
#include "diskio.h"
#include "ff.h"
#include "usbh_core.h"
#include "usbh_umas.h"

#define PLLCTL_SETTING      0x422e
#define PLL_CLOCK           96000000

FATFS FatFs[_VOLUMES];      /* File system object for logical drive */

#ifdef __ICCARM__
#pragma data_alignment=32
BYTE Buff[4096] ;       /* Working buffer */
#endif

#ifdef __ARMCC_VERSION
__align(32) BYTE Buff[4096] ;       /* Working buffer */
#endif

char GetChar(void);
void Delay(uint32_t delayCnt)
{
    while(delayCnt--)
    {
        __NOP();
        __NOP();
    }
}

void put_rc(FRESULT rc)
{
    const TCHAR *p =
        _T("OK\0DISK_ERR\0INT_ERR\0NOT_READY\0NO_FILE\0NO_PATH\0INVALID_NAME\0")
        _T("DENIED\0EXIST\0INVALID_OBJECT\0WRITE_PROTECTED\0INVALID_DRIVE\0")
        _T("NOT_ENABLED\0NO_FILE_SYSTEM\0MKFS_ABORTED\0TIMEOUT\0LOCKED\0")
        _T("NOT_ENOUGH_CORE\0TOO_MANY_OPEN_FILES\0");
    //FRESULT i;
    uint32_t i;
    for(i = 0; (i != (UINT)rc) && *p; i++)
    {
        while(*p++) ;
    }
    printf(_T("rc=%u FR_%s\n"), (UINT)rc, p);
}

/*---------------------------------------------------------*/
/* User Provided RTC Function for FatFs module             */
/*---------------------------------------------------------*/
/* This is a real time clock service to be called from     */
/* FatFs module. Any valid time must be returned even if   */
/* the system does not support an RTC.                     */
/* This function is not required in read-only cfg.         */

unsigned long get_fattime(void)
{
    unsigned long tmr;

    tmr = 0x00000;

    return tmr;
}


void SYS_Init(void)
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init System Clock                                                                                       */
    /*---------------------------------------------------------------------------------------------------------*/

    /* Enable External XTAL (4~24 MHz) */
    CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk);

    /* Waiting for 12MHz clock ready */
    CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);

    /* Switch HCLK clock source to XTAL */
    CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HXT, CLK_CLKDIV0_HCLK(1));

    /* Set PLL to power down mode and PLL_STB bit in CLKSTATUS register will be cleared by hardware.*/
    CLK->PLLCTL |= CLK_PLLCTL_PD_Msk;

    /* Set PLL frequency */
    CLK->PLLCTL = PLLCTL_SETTING;

    /* Waiting for clock ready */
    CLK_WaitClockReady(CLK_STATUS_PLLSTB_Msk);

    /* Switch HCLK clock source to PLL */
    CLK->CLKSEL0 &= (~CLK_CLKSEL0_HCLKSEL_Msk);
    CLK->CLKSEL0 |= CLK_CLKSEL0_HCLKSEL_PLL;

    /* Enable IP clock */
    CLK_EnableModuleClock(UART0_MODULE);


    /* Select IP clock source */
    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UARTSEL_HXT, CLK_CLKDIV0_UART(1));

    /* Update System Core Clock */
    /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
    SystemCoreClockUpdate();
    PllClock        = PLL_CLOCK;            // PLL
    SystemCoreClock = PLL_CLOCK / 2;              // HCLK
    CyclesPerUs     = SystemCoreClock / 1000000;  // For SYS_SysTickDelay()
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init I/O Multi-function                                                                                 */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Set GPD multi-function pins for UART0 RXD and TXD */
    SYS->GPD_MFPL &= ~(SYS_GPD_MFPL_PD0MFP_Msk | SYS_GPD_MFPL_PD1MFP_Msk);
    SYS->GPD_MFPL |= (SYS_GPD_MFPL_PD0MFP_UART0_RXD | SYS_GPD_MFPL_PD1MFP_UART0_TXD);

    /*---------------------------------------------------------------------------------------------------------*/
    /* Init USB Host clock                                                                                     */
    /*---------------------------------------------------------------------------------------------------------*/
    // Configure OTG function as Host-Only
    SYS->USBPHY = 0x101;

#ifdef AUTO_POWER_CONTROL
    /* Below settings is use power switch IC to enable/disable USB Host power.
       Set PC.4 is VBUS_EN function pin and PC.3 VBUS_ST function pin             */
    //SYS->GPC_MFPL &= ~(SYS_GPC_MFPL_PC4MFP_Msk | SYS_GPC_MFPL_PC3MFP_Msk);
    //SYS->GPC_MFPL |=  (SYS_GPC_MFPL_PC3MFP_USB_VBUS_ST | SYS_GPC_MFPL_PC4MFP_USB_VBUS_EN);

    /* Below settings is use power switch IC to enable/disable USB Host power.
       Set PA.2 is VBUS_EN function pin and PA.3 VBUS_ST function pin             */
    SYS->GPA_MFPL &= ~(SYS_GPA_MFPL_PA2MFP_Msk | SYS_GPA_MFPL_PA3MFP_Msk);
    SYS->GPA_MFPL |= (SYS_GPA_MFPL_PA3MFP_USB_VBUS_ST | SYS_GPA_MFPL_PA2MFP_USB_VBUS_EN);

    CLK->APBCLK0 |= CLK_APBCLK0_OTGCKEN_Msk;   //Enable OTG_EN clock
#else
    /* Below settings is use GPIO to enable/disable USB Host power.
       Set PC.4 output high to enable USB power                               */

    SYS->GPC_MFPL &= ~SYS_GPC_MFPL_PC4MFP_Msk;
    PC->MODE = (PC->MODE & ~GPIO_MODE_MODE4_Msk) | (0x1 << GPIO_MODE_MODE4_Pos);
    PC->DOUT |= 0x10;
#endif

    // USB clock divided by 2
    CLK->CLKDIV0 = (CLK->CLKDIV0 & ~CLK_CLKDIV0_USBDIV_Msk) | (1 << CLK_CLKDIV0_USBDIV_Pos);

    // Enable USB Host
    CLK->AHBCLK |= CLK_AHBCLK_USBHCKEN_Msk;
}


void UART0_Init(void)
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init UART                                                                                               */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Reset UART IP */
    SYS->IPRST1 |=  SYS_IPRST1_UART0RST_Msk;
    SYS->IPRST1 &= ~SYS_IPRST1_UART0RST_Msk;

    /* Configure UART0 and set UART0 Baudrate */
    UART0->BAUD = UART_BAUD_MODE2 | UART_BAUD_MODE2_DIVIDER(__HXT, 115200);
    UART0->LINE = UART_WORD_LEN_8 | UART_PARITY_NONE | UART_STOP_BIT_1;
}

static FIL file1;        /* File objects */

/*----------------------------------------------------------------------------
  MAIN function
*----------------------------------------------------------------------------*/
int32_t main(void)
{
    FRESULT res;
    UINT s2, cnt;
    uint32_t i;

    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Init System, IP clock and multi-function I/O */
    SYS_Init(); //In the end of SYS_Init() will issue SYS_LockReg() to lock protected register. If user want to write protected register, please issue SYS_UnlockReg() to unlock protected register.

    /* Lock protected registers */
    SYS_LockReg();

    /* Init UART0 for printf */
    UART0_Init();
   
    /* Init USB host and prepare a root hub*/
    USBH_Open();

    /* Set USB host to support USB mass storage device*/
    USBH_MassInit();

    /*Delay for power stable*/
    Delay(0x500000);

    printf("+-----------------------------------------------+\n");
    printf("|                                               |\n");
    printf("|  M451 USB Host Mass Storage sample program    |\n");
    printf("|                                               |\n");
    printf("+-----------------------------------------------+\n");

    printf("OTG->PHYCTL = 0x%x\n", OTG->PHYCTL);
    printf("OTG->STS = 0x%x\n", OTG->STATUS);
    printf("OTG->CTL = 0x%x\n", OTG->CTL);        

    while(1)
    {
        
        /*USBH_ProcessHubEvents() must be executed at main loop*/
        if(USBH_ProcessHubEvents())//Check USB device status Change for plug-in and unplug
        {
            if(disk_status(0))//Check mass storage device status
                put_rc(f_mount(0, NULL));//unplug
            else         
                put_rc(f_mount(0, &FatFs[0]));//plug-in
        }

        if(disk_status(0) == 0)//Check connection of USB mass storage
        {//USB mass storage is still connected to USB host
            putchar('\n');
            res = f_open(&file1, (TCHAR*)"Test.txt", FA_OPEN_EXISTING | FA_READ);// Open "Test.txt" file for read operation
            if(res)//Check the result of FatFs function
            {//Fail --> Maybe connection fail or Not find "Text.txt" file
               
                put_rc(res);//Print fail message
               
                res = f_open(&file1, (TCHAR*)"Test.txt", FA_CREATE_ALWAYS | FA_WRITE);// Open "Test.txt" file for write operation
                if(res)
                {//Fail
                    put_rc(res);//Print fail message
                }else
                {//Pass
                    cnt = 512;//Set data lenght                    
                    for(i=0;i<cnt;i++)
                        Buff = i;//Prepare data for write

                    res = f_write(&file1, Buff, cnt, &s2);//Write data into file.   
                    if(res != FR_OK)
                    {//Fail
                        put_rc(res);//Print fail message
                    }                    
                    f_close(&file1);//Close "Test.txt" file
                    printf("Data lenght:%d\n",s2);//Print how many wrote data
                }
            }else
            {//Pass
                cnt = 512;//Set data lenght     
                res = f_read(&file1, Buff, cnt, &s2);//Read data from file.
                if(res != FR_OK)
                {//Fail
                    put_rc(res);//Print fail message
                }else
                {//Pass
                    printf("Data size:%d\n",s2);//Print how many read data
                    for(i=0;i<s2;i++)
                    {
                        if((i%8) == 0 )
                            printf("\n");                          
                        printf("0x%2x ",Buff);//Print read data                                            
                    }         
                }
                f_close(&file1);//Close "Test.txt" file  
                printf("\nData lenght:%d\n",s2);//Print how many wrote data   
                printf("Test finish.\n");//Print how many wrote data
                GetChar();
            }
        }                    
    }
}


/*** (C) COPYRIGHT 2013 Nuvoton Technology Corp. ***/

使用特权

评论回复
6
gaoyang9992006| | 2015-1-20 22:59 | 只看该作者
/**************************************************************************//**
* @file     main.c
* @version  V1.00
* $Revision: 20 $
* $Date: 14/10/28 6:11p $
* @brief
*           Show how to implement a USB Host with a file system to read/write a file on USB Mass Storage.
*
* @note
* Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
*****************************************************************************/
#include <stdio.h>
#include <string.h>
#include "M451Series.h"
#include "diskio.h"
#include "ff.h"
#include "usbh_core.h"
#include "usbh_umas.h"

#define PLLCTL_SETTING      0x422e
#define PLL_CLOCK           96000000

FATFS FatFs[_VOLUMES];      /* File system object for logical drive */

#ifdef __ICCARM__
#pragma data_alignment=32
BYTE Buff[4096] ;       /* Working buffer */
#endif

#ifdef __ARMCC_VERSION
__align(32) BYTE Buff[4096] ;       /* Working buffer */
#endif

char GetChar(void);
void Delay(uint32_t delayCnt)
{
    while(delayCnt--)
    {
        __NOP();
        __NOP();
    }
}

void put_rc(FRESULT rc)
{
    const TCHAR *p =
        _T("OK\0DISK_ERR\0INT_ERR\0NOT_READY\0NO_FILE\0NO_PATH\0INVALID_NAME\0")
        _T("DENIED\0EXIST\0INVALID_OBJECT\0WRITE_PROTECTED\0INVALID_DRIVE\0")
        _T("NOT_ENABLED\0NO_FILE_SYSTEM\0MKFS_ABORTED\0TIMEOUT\0LOCKED\0")
        _T("NOT_ENOUGH_CORE\0TOO_MANY_OPEN_FILES\0");
    //FRESULT i;
    uint32_t i;
    for(i = 0; (i != (UINT)rc) && *p; i++)
    {
        while(*p++) ;
    }
    printf(_T("rc=%u FR_%s\n"), (UINT)rc, p);
}

/*---------------------------------------------------------*/
/* User Provided RTC Function for FatFs module             */
/*---------------------------------------------------------*/
/* This is a real time clock service to be called from     */
/* FatFs module. Any valid time must be returned even if   */
/* the system does not support an RTC.                     */
/* This function is not required in read-only cfg.         */

unsigned long get_fattime(void)
{
    unsigned long tmr;

    tmr = 0x00000;

    return tmr;
}


void SYS_Init(void)
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init System Clock                                                                                       */
    /*---------------------------------------------------------------------------------------------------------*/

    /* Enable External XTAL (4~24 MHz) */
    CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk);

    /* Waiting for 12MHz clock ready */
    CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);

    /* Switch HCLK clock source to XTAL */
    CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HXT, CLK_CLKDIV0_HCLK(1));

    /* Set PLL to power down mode and PLL_STB bit in CLKSTATUS register will be cleared by hardware.*/
    CLK->PLLCTL |= CLK_PLLCTL_PD_Msk;

    /* Set PLL frequency */
    CLK->PLLCTL = PLLCTL_SETTING;

    /* Waiting for clock ready */
    CLK_WaitClockReady(CLK_STATUS_PLLSTB_Msk);

    /* Switch HCLK clock source to PLL */
    CLK->CLKSEL0 &= (~CLK_CLKSEL0_HCLKSEL_Msk);
    CLK->CLKSEL0 |= CLK_CLKSEL0_HCLKSEL_PLL;

    /* Enable IP clock */
    CLK_EnableModuleClock(UART0_MODULE);


    /* Select IP clock source */
    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UARTSEL_HXT, CLK_CLKDIV0_UART(1));

    /* Update System Core Clock */
    /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
    SystemCoreClockUpdate();
    PllClock        = PLL_CLOCK;            // PLL
    SystemCoreClock = PLL_CLOCK / 2;              // HCLK
    CyclesPerUs     = SystemCoreClock / 1000000;  // For SYS_SysTickDelay()
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init I/O Multi-function                                                                                 */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Set GPD multi-function pins for UART0 RXD and TXD */
    SYS->GPD_MFPL &= ~(SYS_GPD_MFPL_PD0MFP_Msk | SYS_GPD_MFPL_PD1MFP_Msk);
    SYS->GPD_MFPL |= (SYS_GPD_MFPL_PD0MFP_UART0_RXD | SYS_GPD_MFPL_PD1MFP_UART0_TXD);

    /*---------------------------------------------------------------------------------------------------------*/
    /* Init USB Host clock                                                                                     */
    /*---------------------------------------------------------------------------------------------------------*/
    // Configure OTG function as Host-Only
    SYS->USBPHY = 0x101;

#ifdef AUTO_POWER_CONTROL
    /* Below settings is use power switch IC to enable/disable USB Host power.
       Set PC.4 is VBUS_EN function pin and PC.3 VBUS_ST function pin             */
    //SYS->GPC_MFPL &= ~(SYS_GPC_MFPL_PC4MFP_Msk | SYS_GPC_MFPL_PC3MFP_Msk);
    //SYS->GPC_MFPL |=  (SYS_GPC_MFPL_PC3MFP_USB_VBUS_ST | SYS_GPC_MFPL_PC4MFP_USB_VBUS_EN);

    /* Below settings is use power switch IC to enable/disable USB Host power.
       Set PA.2 is VBUS_EN function pin and PA.3 VBUS_ST function pin             */
    SYS->GPA_MFPL &= ~(SYS_GPA_MFPL_PA2MFP_Msk | SYS_GPA_MFPL_PA3MFP_Msk);
    SYS->GPA_MFPL |= (SYS_GPA_MFPL_PA3MFP_USB_VBUS_ST | SYS_GPA_MFPL_PA2MFP_USB_VBUS_EN);

    CLK->APBCLK0 |= CLK_APBCLK0_OTGCKEN_Msk;   //Enable OTG_EN clock
#else
    /* Below settings is use GPIO to enable/disable USB Host power.
       Set PC.4 output high to enable USB power                               */

    SYS->GPC_MFPL &= ~SYS_GPC_MFPL_PC4MFP_Msk;
    PC->MODE = (PC->MODE & ~GPIO_MODE_MODE4_Msk) | (0x1 << GPIO_MODE_MODE4_Pos);
    PC->DOUT |= 0x10;
#endif

    // USB clock divided by 2
    CLK->CLKDIV0 = (CLK->CLKDIV0 & ~CLK_CLKDIV0_USBDIV_Msk) | (1 << CLK_CLKDIV0_USBDIV_Pos);

    // Enable USB Host
    CLK->AHBCLK |= CLK_AHBCLK_USBHCKEN_Msk;
}


void UART0_Init(void)
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init UART                                                                                               */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Reset UART IP */
    SYS->IPRST1 |=  SYS_IPRST1_UART0RST_Msk;
    SYS->IPRST1 &= ~SYS_IPRST1_UART0RST_Msk;

    /* Configure UART0 and set UART0 Baudrate */
    UART0->BAUD = UART_BAUD_MODE2 | UART_BAUD_MODE2_DIVIDER(__HXT, 115200);
    UART0->LINE = UART_WORD_LEN_8 | UART_PARITY_NONE | UART_STOP_BIT_1;
}

static FIL file1;        /* File objects */

/*----------------------------------------------------------------------------
  MAIN function
*----------------------------------------------------------------------------*/
int32_t main(void)
{
    FRESULT res;
    UINT s2, cnt;
    uint32_t i;

    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Init System, IP clock and multi-function I/O */
    SYS_Init(); //In the end of SYS_Init() will issue SYS_LockReg() to lock protected register. If user want to write protected register, please issue SYS_UnlockReg() to unlock protected register.

    /* Lock protected registers */
    SYS_LockReg();

    /* Init UART0 for printf */
    UART0_Init();
   
    /* Init USB host and prepare a root hub*/
    USBH_Open();

    /* Set USB host to support USB mass storage device*/
    USBH_MassInit();

    /*Delay for power stable*/
    Delay(0x500000);

    printf("+-----------------------------------------------+\n");
    printf("|                                               |\n");
    printf("|  M451 USB Host Mass Storage sample program    |\n");
    printf("|                                               |\n");
    printf("+-----------------------------------------------+\n");

    printf("OTG->PHYCTL = 0x%x\n", OTG->PHYCTL);
    printf("OTG->STS = 0x%x\n", OTG->STATUS);
    printf("OTG->CTL = 0x%x\n", OTG->CTL);        

    while(1)
    {
        
        /*USBH_ProcessHubEvents() must be executed at main loop*/
        if(USBH_ProcessHubEvents())//Check USB device status Change for plug-in and unplug
        {
            if(disk_status(0))//Check mass storage device status
                put_rc(f_mount(0, NULL));//unplug
            else         
                put_rc(f_mount(0, &FatFs[0]));//plug-in
        }

        if(disk_status(0) == 0)//Check connection of USB mass storage
        {//USB mass storage is still connected to USB host
            putchar('\n');
            res = f_open(&file1, (TCHAR*)"Test.txt", FA_OPEN_EXISTING | FA_READ);// Open "Test.txt" file for read operation
            if(res)//Check the result of FatFs function
            {//Fail --> Maybe connection fail or Not find "Text.txt" file
               
                put_rc(res);//Print fail message
               
                res = f_open(&file1, (TCHAR*)"Test.txt", FA_CREATE_ALWAYS | FA_WRITE);// Open "Test.txt" file for write operation
                if(res)
                {//Fail
                    put_rc(res);//Print fail message
                }else
                {//Pass
                    cnt = 512;//Set data lenght                    
                    for(i=0;i<cnt;i++)
                        Buff = i;//Prepare data for write

                    res = f_write(&file1, Buff, cnt, &s2);//Write data into file.   
                    if(res != FR_OK)
                    {//Fail
                        put_rc(res);//Print fail message
                    }                    
                    f_close(&file1);//Close "Test.txt" file
                    printf("Data lenght:%d\n",s2);//Print how many wrote data
                }
            }else
            {//Pass
                cnt = 512;//Set data lenght     
                res = f_read(&file1, Buff, cnt, &s2);//Read data from file.
                if(res != FR_OK)
                {//Fail
                    put_rc(res);//Print fail message
                }else
                {//Pass
                    printf("Data size:%d\n",s2);//Print how many read data
                    for(i=0;i<s2;i++)
                    {
                        if((i%8) == 0 )
                            printf("\n");                          
                        printf("0x%2x ",Buff);//Print read data                                            
                    }         
                }
                f_close(&file1);//Close "Test.txt" file  
                printf("\nData lenght:%d\n",s2);//Print how many wrote data   
                printf("Test finish.\n");//Print how many wrote data
                GetChar();
            }
        }                    
    }
}


/*** (C) COPYRIGHT 2013 Nuvoton Technology Corp. ***/

使用特权

评论回复
7
zxf0168| | 2015-1-21 09:58 | 只看该作者
那次他们做的那个读U盘的程序才是最好的

使用特权

评论回复
8
nicolas.sail| | 2015-1-21 16:08 | 只看该作者

使用特权

评论回复
9
匆匆那年| | 2015-1-22 08:53 | 只看该作者
新唐基本都已经写好了,据说这套USB程序还通过什么电子验证。只要把FATFS的config文件配置一下就能用了

使用特权

评论回复
10
mintspring| | 2015-1-27 00:07 | 只看该作者
要通过usb控制器这个外设来操作

使用特权

评论回复
11
一般首席| | 2015-1-28 13:42 | 只看该作者
好东西

使用特权

评论回复
12
quray1985| | 2015-1-29 20:00 | 只看该作者
以前用过南京沁恒的cha375,那时候U盘容量还很小,现在不知道fat的系统能支持到多大的u盘了

使用特权

评论回复
13
lijiankun| | 2015-2-10 10:20 | 只看该作者
这个程序对U盘的大小有要求吗?我验证的时候USBH_ProcessHubEvents()这个函数的返回值一直是0呀。 我用的8G的U盘。 我是个新手,还望多多指教

使用特权

评论回复
14
lijiankun| | 2015-2-10 16:36 | 只看该作者
好了,问题解决了,就是我U盘的问题,换了个其他u盘就好了

使用特权

评论回复
15
ccw1986| | 2015-3-27 08:20 | 只看该作者
这个是非常有用的资料
记得刚开始读写USB盘时,我只能读写512M以下容量的

使用特权

评论回复
16
wangkerwin| | 2015-11-9 17:50 | 只看该作者
請問M451 的USB OTG可以支持多大的U盤呢

使用特权

评论回复
17
西门扫雪| | 2015-11-10 20:26 | 只看该作者
这个USB挺好玩的啊,能做什么用呢,速度能上多少

使用特权

评论回复
18
643757107| | 2015-11-10 22:44 | 只看该作者
一旦分辨到U盘,即可使用以下函数,读写U盘里的资料。
f_open()
f_close()
f_write()
f_read()

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

73

帖子

3

粉丝