( O# f, ~0 O I( v- S4 f9 k1 X , N. w; H. \7 }" m. R2 y9 V 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。 # \7 S5 o2 X+ m$ C9 T+ s) U 在 USB 体系中又包括 USB Host(主机)和USB Device(设备)USB Host任何USB系统中只有一个主机。主机系统的USB接口被称为主机控制器。主机控制器可以以硬件,固件或软件的组合来实现。根集线器集成在主机系统内以提供一个或多个连接点。USB Device 可以分为 USB Hub 和 USB FunctionUSB Hub 提供了一种低成本、低复杂度的 USB接口扩展方法。Hub 的上行端口面向 HOST,下行端口面向设备(Hub 或功能设备)。! w, m" \. e: H. N; M . ?8 W, f; v4 S$ s; j$ @5 W 在下行端口上,Hub 提供了设备连接检测和设备移除检测的能力,并给各下行端口供电。Hub 可以单独使能各下行端口。不同端口可以工作在不同的速度等级(高速/全速/低速)。USB Function 能够通过总线传输或接收数据或控制信息的设备,在 USB2.0 标准中,别称为 Class % o$ |! P7 Z* h1 ]3 @0 ] 本文主要是基于正点原子 stm32f767-atk-apollo 开发板,给出了 USB Host 读写 U 盘的配置和使用示例。4 l3 W8 g( f% K g 9 X! q- N7 X7 F7 k 本文准备资料如下:
依赖
硬件连接准备 本文是基于 U 盘的读写,所以需要准备好一个 U 盘,并插入开发板上的 U 盘接口。 9 d; g' H+ \/ ^+ f W : z4 A& @2 o1 w1 e( H/ I 打开 USB Host RT-Thread 可以很方便的通过 ENV 来配置和生成工程。在 rt-thread\bsp\stm32\stm32f767-atk-apollo 目录下打开 ENV 工具,使用 menuconfig 进入如下配置界面并选中。 1---- Hardware Drivers Config2 ----On-Chip Peripheral Drivers 3 ----Enable USH Host 4 ----Enable Udisk Drivers 配置界面如下图所示
本文使用的是 USB Host 读写 U 盘的功能,所以需要打开 RT-Thread 的虚拟文件系统功能,打开文件系统的操作如下 1---- RT-Thread Components2 S" k9 f) }' R2 I+ }2 ----Device virtual file system* i& t4 X* p/ u% D, Z" q) C- M 3 ----Using device virtual file system 配置界面如下图所示
在 ENV 中打开 USB Host 和虚拟文件系统的功能之后,工程配置就结束了,退出配置界面并保存。在 ENV 工具中使用 scons --target=mdk5 命令重新生成工程并打开。工程打开之后可以看到 USB Host 的框架代码和驱动代码都已经自动加入到工程里面了,如下图所示
在 main.c 文件中加入以下测试代码并下载 (向右滑动查看全部代码)+ u B% s: o; \# K) Q, I1 \ 2#define TEST_FN "/test_usbh.c" 3static char test_data[120], buffer[120];2 t' G+ W* ?4 X) m 48 C* l$ G2 t5 b% \7 a5 Y0 Z+ O 5void readwrite(const char* filename) 6{ 7 int fd; 8 int index, length; 91 K- U9 d& L ?8 i. v 10 fd = open(TEST_FN, O_WRONLY | O_CREAT | O_TRUNC, 0); 11 if (fd < 0)5 ?9 M! U8 _* _: T. d 12 {* I) D2 a, A) D0 T9 P 13 rt_kprintf("open file for write failed\n"); 14 return;. P3 X# b5 G6 P+ ^% s/ Q 15 } 16 17 for (index = 0; index < sizeof(test_data); index ++)2 P0 H4 ]9 G! `8 s' Z" L. @0 `. I 18 {; U' D, E# }% J" S4 S 19 test_data[index] = index + 27; 20 } 21) z; P; a+ s) w* x+ _& B 22 length = write(fd, test_data, sizeof(test_data)); 23 if (length != sizeof(test_data)) 24 {8 F8 x: O& u" g8 b 25 rt_kprintf("write data failed\n");& Y7 V, j9 B' o' [, e8 r; W 26 close(fd);' M% t( U1 N7 a8 K. B# a9 I 27 return; 28 } 29 30 close(fd); 31 32 fd = open(TEST_FN, O_RDONLY, 0);) |& h V5 W3 ?0 d; _9 B: E 33 if (fd < 0) 34 {. D3 M) M8 f4 D9 E6 c( K" R5 a& g! v 35 rt_kprintf("check: open file for read failed\n"); 36 return;. A( E. H# t) W& Y) Z& ~; S 37 } 38 39 length = read(fd, buffer, sizeof(buffer)); 40 if (length != sizeof(buffer)) 41 {5 f: w4 w; q1 o, p& M6 B% z 42 rt_kprintf("check: read file failed\n");9 x8 h% v; V- q* M3 [ 43 close(fd); 44 return;. y8 f9 K: N' M; B C8 q 45 }% B7 H. @7 E: P- Z 46. E/ U. r. O( S: ~! o+ P; Y% o5 Y1 B 47 for (index = 0; index < sizeof(test_data); index ++) 48 { 49 if (test_data[index] != buffer[index]) 50 {- P' o( b+ F* K 51 rt_kprintf("check: check data failed at %d\n", index); 52 close(fd); 53 return; 54 } 55 }3 [/ _& [2 P: i0 u' k5 n2 t& f/ x 56 57 rt_kprintf("usb host read/write udisk successful\r\n");+ m8 I4 O8 |# {' G. S 58 59 close(fd);& c% b" U$ p( N 60}9 `. ?$ R; Y; l1 q 618 g2 w8 \1 k5 I0 T) j5 t4 ~ 62MSH_CMD_EXPORT(readwrite, usb host read write test); 9 S% Y$ t- K; u a# l' n 运行测试程序 将以上程序下载入开发板之后连接串口调试工具可以看到如下调试信息
这里可以看到 U 盘的大小约为 7.4G,说明 U 盘已经成功挂载到开发板上面的文件系统了。使用文件系统的 ls 命令查看 U 盘目录的结果如下图:
再次使用 ls 命令可以看到在 U 盘的根目录下已经新建了一个 test_usbh.c 文件,并且大小为 120 个字节,如下图所示
+ p7 H: K& _3 J 参考资料7 A8 ?9 c, o; S ENV 用户手册 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 (以上链接请复制至外部浏览器打开) 4 E, G+ N; J7 b: l' U* T& f/ J3 L% Q) v7 \/ N : @2 }2 M ^1 W$ Y% A' Z 常见问题Q: 5 C) t3 O2 T: p1 Z; M* n$ C3 ]9 u 在 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 外设添加指南。 |
| 楼主能提供下代码吗 |
| 谢谢分享! |
最全USB HID开发资料,悉心整理一个月,亲自测试
【源码】STLINK-V3MINI 高速USB仿真器,成功改刷【高速CMSIS-DAP】
STM32 USB CDC 虚拟多串口
实战经验 | 选择USBX模块生成USB CDC ACM无PD的项目
STM32 USB HID键盘例程
刘氓兔的杂谈【001】-片上USB 高速PHY
【经验分享】在进行 USB CDC 类开发时,无法发送 64整数倍的数据
在线直播|无需编写任何代码即可在STM32上实现USB-C Power Delivery
圈圈发布USB图书第二版有感,以及分享一些我学习USB过程...
USB Audio设计与实现
微信公众号
手机版