EFM32片内外设--USB MSD host framework
近几日在帮客户移植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相关推荐
- EFM32片内外设--GPIO EM4唤醒
EFM32的EM3虽然功耗很低,0.6uA,但是在一些场合仍然显得浪费,特别是那种一次性消费的电池供电产品,客户的想法仍然是越低越好,最好是不耗电.所以,很多时候,就只能让MCU进入EM4状态. 当E ...
- EFM32片内外设--VCMP 基本操作
VCMP基本操作例程,是从Application Note中抠出来的. #include "stdio.h" #include "efm32.h" #inclu ...
- EFM32片内外设--ADC之多通道采样+Timer+PRS触发+DMA
在Application note中,ADC已经有了很多的例子,唯独缺少一个多通道定时触发进行扫描的例程.从理论上讲,将ADC配置为多通道ADC转换,配合DMA进行数据传输,而且使用Timer+PRS ...
- linux xhci源码,第四十六篇:Linux中的USB XHCI HOST TRANSFER RING的相关数据结构 (1)
记录相关数据结构之前,先上一张图,这样就基本一目了然了 USB XHCI HOST有三种RING 分别为COMMAND, EVENT 与TRANSFER 这里所说的是TRANSFER RING 一个R ...
- 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 ...
- 片内外设、片上外设和片外外设的区别
片内外设就是片上外设,同一种意思不同说法而已. 片内外设和片外外设的区别: 片内.外设是两个概念,片内指做成芯片的集成电路内部,简称片内,片外同理显而易见:外设是外部设备的简称,是指集成电路芯片外部的 ...
- 手机常用的快充QC2.0/3.0协议,你都了解吗?设备(比如支持快充的手机)通过USB数据通讯口D+/D-输出电压信号给充电器,充电器内置USB输入解码芯片,然后充电器会输出目标电压。
手机常用的快充QC2.0/3.0协议,你都了解吗? 零是起源 资料共享- 公众号:零是起源 15 人赞同了该文章 何谓快充QC2.0/3.0协议? 1.QC2.0协议 QC2.0就是Quick Cha ...
- 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 ...
- 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 ...
最新文章
- python常见函数
- torch.ge,torch.gt,torch.le
- 贷款利率最高多少合法?
- Silverlight RIA Services基础专题
- mongodb默认的用户名密码_MongoDB 设置账号和密码
- 『TCP/IP详解——卷一:协议』读书笔记——03
- springmvc教程--注解开发基础详解
- 干货 | 产品经理要了解的技术类知识
- poj 1195(二维树状数组)
- caffe 初学参考链接
- Java 集合 List Arrays.asList
- LeetCode 131. 分割回文串(回溯)
- RPC框架的实现原理,及RPC架构组件详解
- eclipse java环境配置_Eclipse怎么配置运行环境?
- clodop配置SSL证书 WEB打印机服务
- 树莓派4安装minecraft java 1.12.2
- COJ 0359 xjr考考你数据结构(根号2)线段树区间增加
- YDOOK: ANSYS Maxwell 19 教程20:Maxwell 2D Surface Approximation 网格划分
- 从转载阿里开源项目 Egg.js 技术文档引发的“版权纠纷”,看宽松的 MIT 许可该如何用?
- discuz php单页,Discuz! X2 自定义单页面最简单方法