第五十五章 USB读卡器实验 上一章我们向大家介绍了如何利用STM32的USB来做一个触控USB鼠标,本章我们将利用STM32的USB来做一个USB读卡器。本章分为如下几个部分: 55.1 USB读卡器简介 55.2 硬件设计 55.3 软件设计 55.4 下载验证 55.1 USB读卡器简介 ALIENTEK 战舰STM32开发板板载了一个SD卡插槽,可以用来接入SD卡,另外战舰STM32开发板板载了一个8M字节的SPI FLASH芯片,通过STM32的USB接口,我们可以实现一个简单的USB读卡器,来读写SD卡和SPI FLASH。 本章我们还是通过移植官方的USB Mass_Storage例程来实现,该例程在MDK的安装目录下可以找到(..\MDK\ARM\Examples\ST\STM32F10xUSBLib\Demos\Mass_Storage)。 USB Mass Storage类支持两个传输协议: 1)Bulk-Only 传输(BOT) 2)Control/Bulk/Interrupt传输(CBI) Mass Storage类规范定义了两个类规定的请求:Get_Max_LUN和Mass Storage Reset,所有的Mass Storage类设备都必须支持这两个请求。 Get_Max_LUN(bmRequestType= 10100001b and bRequest= 11111110b)用来确认设备支持的逻辑单元数。Max LUN的值必须是0~15。注意:LUN是从0开始的。主机不能向不存在的LUN发送CBW,本章我们定义Max LUN的值为1,即代表2个逻辑单元。 Mass Storage Reset(bmRequestType=00100001b and bRequest= 11111111b)用来复位Mass Storage设备及其相关接口。 支持BOT传输的Mass Storage设备接口描述符要求如下: 接口类代码bInterfaceClass=08h,表示为Mass Storage设备; 接口类子代码bInterfaceSubClass=06h,表示设备支持SCSI Primary Command-2(SPC-2); 协议代码bInterfaceProtocol有3种:0x00、0x01、0x50,前两种需要使用中断传输,最后一种仅使用批量传输(BOT)。 支持BOT的设备必须支持最少3个endpoint:Control, Bulk-In和Bulk-Out。USB2.0的规范定义了控制端点0。Bulk-In端点用来从设备向主机传送数据(本章用端点1实现)。Bulk-Out端点用来从主机向设备传送数据(本章用端点2实现)。 ST官方的例程是通过USB来读写SD卡(SDIO方式)和NAND FALSH,支持2个逻辑单元,我们在官方例程的基础上,只需要修改SD驱动部分代码(改为SPI),并将对NAND FLASH的操作修改为对SPI FLASH的操作。只要这两步完成了,剩下的就比较简单了,对底层磁盘的读写,都是在mass_mal.c文件实现的,所以我们只需要修改该函数的MAL_Init、MAL_Write、MAL_Read和MAL_GetStatus等4个函数,使之与我们的SD卡和SPI FLASH对应起来即可。 本章我对SD卡和SPI FLASH的操作都是采用SPI方式,所以速度相对SDIO和FSMC控制的NAND FLASH来说,相对会慢一些。 55.2硬件设计 本节实验功能简介:开机的时候先检测SD卡和SPI FLASH是否存在,如果存在则获取其容量,并显示在LCD上面(如果不存在,则报错)。之后开始USB配置,在配置成功之后就可以在电脑上发现两个可移动磁盘。我们用DS1来指示USB正在读写SD卡,并在液晶上显示出来,同样我们还是用DS0来指示程序正在运行。 所要用到的硬件资源如下: 1) 指示灯DS0 、DS1 2) 串口 3) TFTLCD模块 4) SD卡 5) SPI FLASH 6) USB接口 这几个部分,在之前的实例中都已经介绍过了,我们在此就不多说了。不过还是要注意一下P13的连接,要和上一章一样! 55.3软件设计 本章,我们在第四十四章实验(实验39)的基础上修改,先打开实验39 的工程,在HARDWARE文件夹所在文件夹下新建一个USB的文件夹,然后在USB文件夹下面新建LIB和CONFIG文件夹,分别用来存放与USB核相关的代码以及配置部分代码。这两部分代码我们也不细说(详见光盘本例程源码),其中USB文件夹里面的代码同上一章的一模一样,而CONFIG文件夹里面的源码则来自MDK自带的Mass_Storage例程: X:\Keil3.80A\ARM\ Examples\ST\STM32F10xUSBLib\Demos\Mass_Storage下的source和include文件夹(X为你安装MDK的磁盘)。 然后,我们在工程文件里面新建USB和USBCFG组,分别加入USB\LIB下面的代码和USB\CONFIG下面的代码。然后把LIB和CONFIG文件夹加入头文件包含路径。 在test.c里面,我们修改main函数如下: //设置USB 连接/断线 //enable:0,断开 // 1,允许连接 void usb_port_set(u8 enable) { RCC->APB2ENR|=110)bDeviceState=UNCONNECTED; //2s内没收到在线标记,代表USB被拔出了 } USB_STATUS_REG=0; } }; } 此部分代码除了main函数,还有一个usb_port_set函数,usb_port_set函数我们在上一章已经介绍过了,这里就不多说。我们将SPI FLASH的最开始6M地址范围用作SPI FLASH Disk,也就是文件系统管理的范围大小,这个我们在之前的SPI FLASH也介绍过。 通过此部分代码就可以实现了我们之前在硬件设计部分描述的功能,这里我们用到了一个全局变量Usb_Status_Reg,用来标记USB的相关状态,这样我们就可以在液晶上显示当前USB的状态了。 软件设计部分就为大家介绍到这里。 55.4下载验证 在代码编译成功之后,我们通过下载代码到战舰STM32开发板上,在USB配置成功后(假设已经插入SD卡,注意:USB数据线,要插在USB口!不是USB_232端口!),LCD显示效果如图55.4.1所示: 图55.4.1 USB连接成功此时,电脑提示发现新硬件如图55.4.2所示: 图55.4.2 USB读卡器被电脑找到 等USB配置成功后,DS1不亮,DS0闪烁,并且在电脑上可以看到我们的磁盘,如图55.4.3所示: 图55.4.3 电脑找到USB读卡器的两个盘符我们打开设备管理器,在通用串行总线控制器里面可以发现多出了一个USB Mass Storage Device,同时看到磁盘驱动器里面多了2个磁盘,如图55.4.4所示: 图55.4.4 通过设备管理器查看磁盘驱动器此时,我们就可以通过电脑读写SD卡或者SPI FLASH里面的内容了。在执行读写操作的时候,就可以看到DS1亮,并且会在液晶上显示当前的读写状态。 注意,在对SPI FLASH操作的时候,最好不要频繁的往里面写数据,否则很容易将SPI FLASH写爆!! |
stm32 USB的CDC类传输掉数据
STM32F105 USB接收数据不断进入中断,出现“死机”现象
关于STM32CubeMX配置的USB例程电脑无法识别问题
STM32F407 USB-HS-OTG是否不外接PHY可以做虚拟串口?
如何做一个USB从机键盘用stm32f407
用STM32F4 Cube MX生成的USB Device C代码的BUG
USB Device + FatFS + SDIO 模拟U盘意外只读问题
USB Device + FatFS + SDIO 问题
STM32H7配置成USB DEVICE时,连接电脑时不进入中断
STM32F446 USB和串口1 冲突