近几日在帮客户移植USB MSD host的协议栈。发现一下子将100+K的代码从一颗M3移植到另外一颗M3,其实还真的不简单,主要是不同厂家的M3,外设区别太大了。辛苦将底层的硬件层描述完成之后,发现USB协议的写法相差过大。不得不对其进行了一些修改。言归正传,我们还是看一下EFM32的 MSD host的协议栈的框架吧。

1. 硬件原理图设计

参照reference manual中的USB章节内的HOST部分的原理框图即可。如下图所示:

只是这张图里面是用了一颗带电源管理的3V转5V的升压芯片,来作为管理VBUS的电源。如果板子上有5V,可以直接输入到电源管理芯片。

另外,就是要选择一颗基频为48MHz的晶振,用来给USB提供基准时钟源。

2.软件框架:

/* USB related data */
STATIC_UBUF(tmpBuf, 1024); // 定义一个给usb使用的缓冲区。 #define STATIC_UBUF( x, y ) EFM32_ALIGN( 4 ) static uint8_t x[((y)+3)&~3];

USBH_Init_TypeDef is = USBH_INIT_DEFAULT;

USBH_Init( &is ); //初始化USB协议栈

for (;;) 
{
  // Wait for ever on device attachment, 等待U盘插入

// The second parameter is timeout in seconds, 0 means for ever
  if ( USBH_WaitForDeviceConnectionB( tmpBuf, 0 ) == USB_STATUS_OK )  
  {

// Device is now connected and ready for enumeration ! //检测到U盘存在了

if (MSDH_Init(tmpBuf, sizeof(tmpBuf)))
    {
           /* Initialize filesystem */
           FileResult = f_mount( 0, &Fatfs );
           if (FileResult  == FR_OK)

{

//进行Fat文件操作

//FileResult  = f_open();

//FileResult  = f_read();

}

}

}

// Wait for disconnection
  while ( USBH_DeviceConnected() ){}

// Disable USB peripheral, power down USB port.
  USBH_Stop();
}

单看如上的框架其实是比较简单的,但是还需要注意如下几点:

1.可以配置宏定义DEBUG_USB_API和USB_USE_PRINTF 来决定是否打开USB调试开关。一般调试时是不需要打开的。而默认提供的usbconfig.h头文件中会有如下的定义:

#ifndef NDEBUG
/* Debug USB API functions (illegal input parameters etc.)  */
#define DEBUG_USB_API       /* Uncomment to turn on  */

#define USB_USE_PRINTF      /* Uncomment to enable   */
#endif

因此在IAR中预先定义NDEBUG,来关闭USB调试输出。

2. USB协议栈中,默认使用了Timer0来作为基准时钟。如果要改动的话,需要修改em_usbtimer.c。就在这个文件的开头部分。在这个文件中,也实现了相应的中断响应函数。

3.如果需要过流保护的话,还需要在usbconfig.h里面,而外定义过流侦测的GPIO口。

#define USB_VBUSOVRCUR_PORT       gpioPortA
#define USB_VBUSOVRCUR_PIN        14
#define USB_VBUSOVRCUR_POLARITY   USB_VBUSOVRCUR_POLARITY_LOW

如果没有过流保护功能,则需要将USB_VBUSOVRCUR_PORT定义成USB_VBUSOVRCUR_PORT_NONE。

4.中断处理

在USB协议栈中,普遍使用了EMlib中的关中断函数和开中断函数,INT_Disable() 和 INT_Enable()。而不是直接使用__disable_irq()和__enable_irq()。

所以在主函数中,也请注意。

以上是目前的心得,可能还存在理解上的错误。也欢迎大家指出。

EFM32片内外设--USB MSD host framework相关推荐

  1. EFM32片内外设--GPIO EM4唤醒

    EFM32的EM3虽然功耗很低,0.6uA,但是在一些场合仍然显得浪费,特别是那种一次性消费的电池供电产品,客户的想法仍然是越低越好,最好是不耗电.所以,很多时候,就只能让MCU进入EM4状态. 当E ...

  2. EFM32片内外设--VCMP 基本操作

    VCMP基本操作例程,是从Application Note中抠出来的. #include "stdio.h" #include "efm32.h" #inclu ...

  3. EFM32片内外设--ADC之多通道采样+Timer+PRS触发+DMA

    在Application note中,ADC已经有了很多的例子,唯独缺少一个多通道定时触发进行扫描的例程.从理论上讲,将ADC配置为多通道ADC转换,配合DMA进行数据传输,而且使用Timer+PRS ...

  4. linux xhci源码,第四十六篇:Linux中的USB XHCI HOST TRANSFER RING的相关数据结构 (1)

    记录相关数据结构之前,先上一张图,这样就基本一目了然了 USB XHCI HOST有三种RING 分别为COMMAND, EVENT 与TRANSFER 这里所说的是TRANSFER RING 一个R ...

  5. Intel(R) 6 Series/C200 Series Chipset Family USB Enhanced Host Controller 1c2d

    Intel(R) 6 Series/C200 Series Chipset Family USB Enhanced Host Controller -1c2d Intel(R) 6 Series/C2 ...

  6. 片内外设、片上外设和片外外设的区别

    片内外设就是片上外设,同一种意思不同说法而已. 片内外设和片外外设的区别: 片内.外设是两个概念,片内指做成芯片的集成电路内部,简称片内,片外同理显而易见:外设是外部设备的简称,是指集成电路芯片外部的 ...

  7. 手机常用的快充QC2.0/3.0协议,你都了解吗?设备(比如支持快充的手机)通过USB数据通讯口D+/D-输出电压信号给充电器,充电器内置USB输入解码芯片,然后充电器会输出目标电压。

    手机常用的快充QC2.0/3.0协议,你都了解吗? 零是起源 资料共享- 公众号:零是起源 15 人赞同了该文章 何谓快充QC2.0/3.0协议? 1.QC2.0协议 QC2.0就是Quick Cha ...

  8. USB OTG(Host) 、 USB ADB(Device)、DWC3 Charge

    USB ADB: Corresponding to USB Device Mode USB OTG: Corresponding to USB Host Mode USB EAP: Correspon ...

  9. Linux usb 3. Host 详解

    文章目录 1. 简介 2. Usb Core 驱动设备模型 2.1 Usb Device Layer 2.1.1 device (struct usb_device) 2.1.2 driver (st ...

最新文章

  1. python常见函数
  2. torch.ge,torch.gt,torch.le
  3. 贷款利率最高多少合法?
  4. Silverlight RIA Services基础专题
  5. mongodb默认的用户名密码_MongoDB 设置账号和密码
  6. 『TCP/IP详解——卷一:协议』读书笔记——03
  7. springmvc教程--注解开发基础详解
  8. 干货 | 产品经理要了解的技术类知识
  9. poj 1195(二维树状数组)
  10. caffe 初学参考链接
  11. Java 集合 List Arrays.asList
  12. LeetCode 131. 分割回文串(回溯)
  13. RPC框架的实现原理,及RPC架构组件详解
  14. eclipse java环境配置_Eclipse怎么配置运行环境?
  15. clodop配置SSL证书 WEB打印机服务
  16. 树莓派4安装minecraft java 1.12.2
  17. COJ 0359 xjr考考你数据结构(根号2)线段树区间增加
  18. YDOOK: ANSYS Maxwell 19 教程20:Maxwell 2D Surface Approximation 网格划分
  19. 从转载阿里开源项目 Egg.js 技术文档引发的“版权纠纷”,看宽松的 MIT 许可该如何用?
  20. discuz php单页,Discuz! X2 自定义单页面最简单方法

热门文章

  1. 英语之境(chapter two)
  2. java private最简单的解释
  3. 思想者:漫谈大学生的四个LEARN
  4. 考研英语单词-近义词分类-Fifth Day
  5. 《沉思录卷十》幸福就是按照本性生活
  6. CCD与CMOS摄像头哪个好
  7. 2.SpringBoot整合Mybatis(一对一)
  8. 双剑合璧:springboot打包将vue引入
  9. san mysql,高性能MySQL :应该用SAN吗?
  10. Asp.net中开发使用ActiveX控件