|
简介 USB(Universal Serial Bus)是一种支持热插拔的通用串行总线。它使用差分信号来传输数据,在 USB 1.0和 USB 1.1 版本中,只支持 1.5Mb/s 的低速(low-speed)模式和 12Mb/s 的全速(full-speed)模式,在 USB 2.0 中,又加入了480Mb/s 的高速模式,USB 3.0(super speed),传输速率最大5Gbps。 在 USB 体系中又包括 USB Host(主机)和USB Device(设备)USB Host任何USB系统中只有一个主机。主机系统的USB接口被称为主机控制器。主机控制器可以以硬件,固件或软件的组合来实现。根集线器集成在主机系统内以提供一个或多个连接点。USB Device USB Device 可以分为 USB Hub 和 USB FunctionUSB Hub 提供了一种低成本、低复杂度的 USB接口扩展方法。Hub 的上行端口面向 HOST,下行端口面向设备(Hub 或功能设备)。在下行端口上,Hub 提供了设备连接检测和设备移除检测的能力,并给各下行端口供电。Hub 可以单独使能各下行端口。不同端口可以工作在不同的速度等级(高速/全速/低速)。USB Function 能够通过总线传输或接收数据或控制信息的设备,在 USB2.0 标准中,别称为 Class 本文主要是基于正点原子 stm32f767-atk-apollo 开发板,给出了 USB Host 读写 U 盘的配置和使用示例。本文准备资料如下:
依赖
硬件连接准备 本文是基于 U 盘的读写,所以需要准备好一个 U 盘,并插入开发板上的 U 盘接口。 ENV 配置打开 USB Host$ I) M, T/ O' X" A: [; j RT-Thread 可以很方便的通过 ENV 来配置和生成工程。在 rt-thread\bsp\stm32\stm32f767-atk-apollo 目录下打开 ENV 工具,使用 menuconfig 进入如下配置界面并选中。 1---- Hardware Drivers Config( F/ ~/ ?& H& M I9 s w( D# P2 ----On-Chip Peripheral Drivers$ t! h. C, V1 ] 3 ----Enable USH Host, o7 z W" F0 b! L 4 ----Enable Udisk Drivers; Y; p7 Z% {# M& m; ~ / t' w# ^, i2 k5 p9 T- s 配置界面如下图所示
本文使用的是 USB Host 读写 U 盘的功能,所以需要打开 RT-Thread 的虚拟文件系统功能,打开文件系统的操作如下 1---- RT-Thread Components# M$ ]% ~ N3 P2 ----Device virtual file system 3 ----Using device virtual file system 配置界面如下图所示
在 ENV 中打开 USB Host 和虚拟文件系统的功能之后,工程配置就结束了,退出配置界面并保存。在 ENV 工具中使用 scons --target=mdk5 命令重新生成工程并打开。工程打开之后可以看到 USB Host 的框架代码和驱动代码都已经自动加入到工程里面了,如下图所示
在 main.c 文件中加入以下测试代码并下载 1#include <dfs_posix.h>2#define TEST_FN "/test_usbh.c" 3static char test_data[120], buffer[120]; 4 5void readwrite(const char* filename)/ S2 o7 _+ [+ Y/ n9 E/ ^! v; o 6{ 7 int fd;' w: d0 o5 Y& z7 Q! v% O 8 int index, length; 95 P. f6 V9 R1 O+ U+ b }/ g 10 fd = open(TEST_FN, O_WRONLY | O_CREAT | O_TRUNC, 0); 11 if (fd < 0)& @6 A- K2 R. s. G0 { 12 {4 }+ {" |! \) ? 13 rt_kprintf("open file for write failed\n"); 14 return;4 T' U) ~2 r8 T' D 15 } 163 n" }1 J3 f+ s1 D. A( a 17 for (index = 0; index < sizeof(test_data); index ++) 18 { 19 test_data[index] = index + 27; 20 } 21$ m8 G% d% C/ @/ f5 m, g, I 22 length = write(fd, test_data, sizeof(test_data));! C2 E1 q. l* C: K7 E+ Z% J# R/ C 23 if (length != sizeof(test_data)) 24 { 25 rt_kprintf("write data failed\n");5 f4 R( ]5 B9 d; G$ b6 k# G2 s 26 close(fd);2 n& K/ {6 f+ ?3 C8 k! s 27 return; 28 }& F5 k5 W& i& |7 ~% ~ 292 X. {& ?9 X3 G' z0 O 30 close(fd);1 f0 Y- h. z3 d. Q 31 32 fd = open(TEST_FN, O_RDONLY, 0);1 x5 w, t2 {- U! |3 Y3 L8 D( e- R 33 if (fd < 0) 34 {# H( [* g3 M9 Y3 k2 h% o 35 rt_kprintf("check: open file for read failed\n"); 36 return;4 Q; L& l, f* Q, U+ ~9 P6 ^ 37 }" @+ B2 V: G: `8 y 387 h# ?/ E# i; r6 \& i- q& h2 M 39 length = read(fd, buffer, sizeof(buffer)); 40 if (length != sizeof(buffer))6 w' Q/ J! l9 [( k: f2 j! Z8 C 41 {2 P8 n; u: k% K% v# Q7 r 42 rt_kprintf("check: read file failed\n");% i6 i5 k: Q: F 43 close(fd);1 F& n8 `4 `6 P. N, j% I( B 44 return;+ O) K, [) \8 ~* J& B4 W6 ]+ Z 45 } 46 47 for (index = 0; index < sizeof(test_data); index ++) 48 {- L' Y5 Y. }' z 49 if (test_data[index] != buffer[index])) `" G! p( \) C' X( n) E, g1 n, {0 I 50 {7 k4 ]6 E; p9 Z2 h# O2 I6 N 51 rt_kprintf("check: check data failed at %d\n", index);5 Q! ?" F9 g' z0 h0 P' A4 w8 o! A 52 close(fd);+ M- ^/ |/ W! E' L1 u+ g8 _( N9 X( S 53 return;* {/ V5 `/ M7 J7 w: p+ \3 x 54 }8 A- c9 z: C4 p 55 }% [5 u+ t! w0 ^( \1 N/ q 56- \: o7 P* x+ x: I 57 rt_kprintf("usb host read/write udisk successful\r\n"); 581 L" {( z8 O7 d% `3 a8 | 59 close(fd);7 A4 K1 q" ]# I) P2 ]8 c+ P( M6 E 60} 618 s- a) B! ~0 s* y7 ^$ e/ ] 62MSH_CMD_EXPORT(readwrite, usb host read write test); 运行测试程序 将以上程序下载入开发板之后连接串口调试工具可以看到如下调试信息
这里可以看到 U 盘的大小约为 7.4G,说明 U 盘已经成功挂载到开发板上面的文件系统了。使用文件系统的 ls 命令查看 U 盘目录的结果如下图:
再次使用 ls 命令可以看到在 U 盘的根目录下已经新建了一个 test_usbh.c 文件,并且大小为 120 个字节,如下图所示
6 j5 v3 ^1 \1 P9 M- s; d ENV 用户手册3 N8 C6 f. k0 H$ n' y/ \7 Q http://www.rt-thread.org/document/site/programming-manual/env/env/ 虚拟文件系统 http://www.rt-thread.org/document/site/programming-manual/filesystem/filesystem/ RT-Thread源码 http://github.com/RT-Thread/rt-thread (以上链接请复制至外部浏览器打开) 常见问题Q: 在 rt-thread\bsp\stm32\libraries 目录下没有 drv_usbh.c 文件?A: 该问题一般是当前版本还没有支持 USB Host 的驱动,请使用 RT-Thread 4.0.2+ 的版本进行测试。Q:工程目录下没有 drv_usbh.c 文件?A: 该问题一般是当前 BSP 没有添加 drv_usbh.c 的驱动,请参考STM32 外设添加指南。 |
| something looks good |
微信公众号
手机版