打印
[牛人杂谈]

新唐M451-USB 简介

[复制链接]
4451|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lijiankun|  楼主 | 2015-2-26 09:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
USB的一些概念性知识:
1. 对于USB的操作一般分为USB Host(USB主机);USB Device(USB设备);USB On-The-Go(USB双向通信)
2. USB的数据传送单元:USB是按pakcet进行传送的,也就是说它传送的最小单位是pakcet。而像RS232是按字节传送的。以pakcet为单位传送数据,好处在于可以灵活的定义数据的传送格式,传送方式,从而可以适应各种各样的串行设备。
3. USB的传输类型:
        控制传输:用于设备的控制。
        批量传输:常用于U盘数据拷贝,打印数据传输,扫描仪数据接收等。
        中断传输:典型应用包括键盘,鼠标,游戏控制器等,必须无延时传输的设备。
        等时传输:用于多媒体数据的实时传输。
4. USB总线最大可提供5V,500mA电流,并支持节约能源的挂机和唤醒模式。 USB协议是主从协议,在所有通信里,只有一个主控器,其他都是从设备,最多能接127个从设备,因为协议默认只保留了7bit,作为设备地址。
5. USB协议定义的设备的六种状态:上电状态(powered);默认状态(default);地址状态(address);配置状态(configured);连接状态(attached);挂起状态(suspend)
6.USB的四种不同的中断事件:唤醒功能;设备插拔事件;USB事件;BUS事件

因为我主要用的是USB Host这方面的功能,这里就以USB Host的代码作为例子简单的说一下USB的用法。对了,这里要特别注意的一点是USB接口的时钟必须是48M的,如果使用其它频率可能会出错的。
int32_t main(void)
{
    unsigned int u32ByteCount;
    unsigned int u32PageNumber;
    unsigned int u32ProgramFlashAddress = 0;
    unsigned int u32VerifyFlashAddress = 0;
    unsigned int MidDid;

    FATFS *fs;              /* 指向文件系统的指针 */
    FRESULT res;

    DIR dir;                /* Directory object */
    UINT s1, s2, cnt;

    char a[8] = "abcdefg";
    /* Lock protected registers */
    if(SYS->REGLCTL == 1) // In end of main function, program issued CPU reset and write-protection
                                       // will be disabled.
    SYS_LockReg();     

    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Init System, IP clock and multi-function I/O */
    SYS_Init();
    /* Lock protected registers */
    SYS_LockReg();

    /* Init UART0 for printf */
    UART0_Init();
               
    printf("\n\n");
   
    printf("\n OTG->PHYCTL = 0x%x\n", OTG->PHYCTL);
    printf("\n OTG->STS = 0x%x\n", OTG->STATUS);
    printf("\n OTG->CTL = 0x%x\n", OTG->CTL);

    USBH_Open();  //打开USB host控制器功能

    USBH_MassInit();  //USB host 初始化

    Delay(0x500000);
    USBH_ProcessHubEvents();   //中断的检测
   
               
    printf("rc=%d\n", (WORD)disk_initialize(0));   //disk_initialize()磁盘初始化

    f_mount(0, &FatFs[0]);     //配置文件系统
    for(;;)
    {

        if(USBH_ProcessHubEvents())     //判断是否有U盘等设备接入USB host
        {
            put_rc(f_mount(0, &FatFs[0]));  
        }

        printf(_T(">"));
        res = f_open(&file1,(TCHAR*)"TEST2.TXT",FA_READ);  //以读的形式打开文件
        if(res)
       {
           printf("error");
       }
       else
      {
          res = f_read(&file1,(void *)Buff,8,&s2);   //读取文件
         if(res != FR_OK)
        {
            put_rc(res);
        }else
         {
              printf("\n Data size:%d\n",s2);//Print how many read data
          }
        f_close(&file1);//Close "Test.txt" file    //关闭文件
        break;
         }

res = f_open(&file1, (TCHAR*)"Test7.TXT", FA_CREATE_NEW|FA_WRITE);  //以新建或写的形式打开
                                                                   //文件(文件存在则以写
                                                                   //的形式打开,不存在则新建
                                                                   //一个)
     if(res)
     {
         printf("error");
      }
     else
     {
         res = f_write(&file1, (void*)a, 8, &s2);     //向文件中写数据
         if(res != FR_OK)
         {//Fail
           put_rc(res);//Print fail message
          }else
           {//Pass
               printf("\n Data size:%d\n",s2);//Print how many read data  
            }
          f_close(&file1);//Close "Test.txt" file     //关闭文件
         }
      }                                       
}
其实作为USB host对于U盘的操作,只需要设置好时钟,最好初始化,配置好文件系统就可以了,在这方面新唐M451的官方例程已经做得很好了,都是现成的函数,只需要调用就行了,一般出错也不会是这里的问题。 接下来就可以用f_open();  f_close();  f_read();  f_write();函数对文件进行读写了。说句实话,新唐还是做得不错的,对于开发人员并不需要了解太多USB底层协议的一些东西。
在调试时碰到的一些问题,调试时最爱出现的问题就是文件打不开,这时候可能由于两种原因,第一个文件配置没有配置好;第二个有可能是USB host不支持你连接的U盘或其他USB从设备,这时可换一个设备重试一下。
沙发
mintspring| | 2015-2-26 10:28 | 只看该作者
楼主的头文件哪儿去了,要知道这个库函数在哪儿啊。

使用特权

评论回复
板凳
mintspring| | 2015-2-26 10:29 | 只看该作者
本帖最后由 mintspring 于 2015-2-26 10:30 编辑

要知道这个库函数在哪儿啊。还有什么库函数,来个名字,什么版本

使用特权

评论回复
地板
598330983| | 2015-2-26 10:36 | 只看该作者
如何试用文件系统啊?要知道里面放的文件

使用特权

评论回复
5
lijiankun|  楼主 | 2015-2-26 11:21 | 只看该作者
mintspring 发表于 2015-2-26 10:29
要知道这个库函数在哪儿啊。还有什么库函数,来个名字,什么版本

#include <stdio.h>
#include <string.h>
#include "M451Series.h"
#include "diskio.h"
#include "ff.h"
#include "usbh_core.h"
#include "usbh_umas.h"
#include "NuEdu-Basic01.h"

#define PLLCTL_SETTING      0x422e
#define PLL_CLOCK           96000000

f_open();  f_close();  f_read(); f_write();f_mount()这几个函数在ff.h里;USBH_Open()在usbh_core.h里;
USBH_MassInit()在“\M451BSP\M451SeriesBSP_CMSIS_v3.00.003\Library\UsbHostLib\SOURCE\MassStor\UmasDriver.c”路径里,它并没有在main函数的头文件中体现,而是把.c文件直接添加到工程中了;  USBH_ProcessHubEvents()在"\M451BSP\M451SeriesBSP_CMSIS_v3.00.003\Library\UsbHostLib\SOURCE\Core\usbh_hub.c"它一样也是直接把.c文件加进来了。
        至于这个路径,你把新唐M451官方给的例程一安装就有了。

使用特权

评论回复
6
lijiankun|  楼主 | 2015-2-26 11:29 | 只看该作者
598330983 发表于 2015-2-26 10:36
如何试用文件系统啊?要知道里面放的文件

这个对文件系统的配置的函数是新唐官方写好的,也就是说它已经配置好了,不需要我们再配置。按照新唐官方的配置(新唐官方的例程中在M451这块板子上有一个USBH_UMAS例程)就可以对U盘里的.txt文件进行直接操作,详细的你可以看一下它里面的代码实现

使用特权

评论回复
7
lijiankun|  楼主 | 2015-2-26 11:29 | 只看该作者
598330983 发表于 2015-2-26 10:36
如何试用文件系统啊?要知道里面放的文件

这个对文件系统的配置的函数是新唐官方写好的,也就是说它已经配置好了,不需要我们再配置。按照新唐官方的配置(新唐官方的例程中在M451这块板子上有一个USBH_UMAS例程)就可以对U盘里的.txt文件进行直接操作,详细的你可以看一下它里面的代码实现

使用特权

评论回复
8
598330983| | 2015-2-26 12:12 | 只看该作者
lijiankun 发表于 2015-2-26 11:29
这个对文件系统的配置的函数是新唐官方写好的,也就是说它已经配置好了,不需要我们再配置。按照新唐官方 ...

噢,好的,谢谢,我去下载个看看,研究一下。

使用特权

评论回复
9
598330983| | 2015-2-26 12:13 | 只看该作者
lijiankun 发表于 2015-2-26 11:29
这个对文件系统的配置的函数是新唐官方写好的,也就是说它已经配置好了,不需要我们再配置。按照新唐官方 ...

另外想问一下,这个写入到U盘后,可以在电脑上看到文件吗,

使用特权

评论回复
10
mintspring| | 2015-2-26 12:19 | 只看该作者
lijiankun 发表于 2015-2-26 11:21
#include
#include
#include "M451Series.h"

谢谢楼主,辛苦了,我刚安装上,一会儿看看。

使用特权

评论回复
11
lijiankun|  楼主 | 2015-2-26 13:09 | 只看该作者
598330983 发表于 2015-2-26 12:13
另外想问一下,这个写入到U盘后,可以在电脑上看到文件吗,

可以呀,你以字符串的形式写进去,写成功后,然后把U盘从开发板上拔下来插到电脑上,按文件名找到你刚进行写操作的文件,里面就是你写入的数据了。这是最简单的查看是否写成功的方法。

使用特权

评论回复
12
lijiankun|  楼主 | 2015-2-26 13:13 | 只看该作者
598330983 发表于 2015-2-26 12:13
另外想问一下,这个写入到U盘后,可以在电脑上看到文件吗,

你如果像用新唐M451对U盘进行读写,还需要一根T型口转USB母口的转接线,因为M451开发板上的USB口是USB的B型口,而U盘是USB的A型口

使用特权

评论回复
13
598330983| | 2015-2-26 13:51 | 只看该作者
lijiankun 发表于 2015-2-26 13:13
你如果像用新唐M451对U盘进行读写,还需要一根T型口转USB母口的转接线,因为M451开发板上的USB口是USB的B ...

恩,我有那个转接线,自己做的。拆了个USB头

使用特权

评论回复
14
ccw1986| | 2015-3-25 20:57 | 只看该作者
谢谢楼主的分享
不过这样贴代码肯定没几个人看

使用特权

评论回复
15
lijiankun|  楼主 | 2015-3-26 22:41 | 只看该作者
ccw1986 发表于 2015-3-25 20:57
谢谢楼主的分享
不过这样贴代码肯定没几个人看

我是个新手,以后会努力改进的,谢谢你的指教

使用特权

评论回复
16
boltnut| | 2015-11-14 01:31 | 只看该作者
請問如何修改PID/VID,以便進行客製化 ? PID/VID修改後, Windows 7 驅動程式如何製作 ?

使用特权

评论回复
17
quray1985| | 2015-11-15 20:29 | 只看该作者
USB的四种不同的中断事件:唤醒功能;设备插拔事件;USB事件;BUS事件
确实是这四种啊,学习了

使用特权

评论回复
18
huangcunxiake| | 2015-11-16 20:30 | 只看该作者
USB协议定义的设备的六种状态:上电状态(powered);默认状态(default);地址状态(address);配置状态(configured);连接状态(attached);挂起状态(suspend)

使用特权

评论回复
19
小猫爱吃鱼| | 2015-11-17 17:02 | 只看该作者
USB总线最大可提供5V,500mA电流,并支持节约能源的挂机和唤醒模式。

使用特权

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

本版积分规则

17

主题

94

帖子

3

粉丝