STM32 USB 大容量存储器Mass Storage工程的讲解

USB的大容量存储设备就没有向USB鼠标一样简单了。先从官方例程里的mass stroage工程讲起,User文件夹下,
usb_bot.c:是新出现的文件,这个文件只要是BOT的状态机,所谓的BOT其实就是仅限批量传输的意思,我们这里用到的是端点的仅批量传输的。这个文件对不同USB状态的做不同的操作。
usb_scsi.c:这也是新出现的文件,这个文件名字上虽然是SCSI,但其实里面定义的是一些UFI的命令。
scsi_data.c:里则保存着UFI的命令集。
memory.c:是内存管理层,只有Read_Memory和Write_Memory连个函数。
mass_mal.c:讲的是媒体接入层,平实的将就是连接底下硬件比如说SD卡或NAND Flash的相关驱动的API接口了。这里的文件实现的功能有底下设备或媒体的初始化,读媒体、写媒体、获取设备或媒体的状态等,在memory.c中被调用。
【STM32 USB 大容量存储器Mass Storage工程的讲解】fsmc_nand.c:NAND的驱动程序,NAND挂在STM32的存储体BANK2处,这样就可以直接内存访问NAND了
nand_if:是在fsmc_nand.c上面封装了下。
还有下面的STM32_EVAL组里的stm32_eval_sdio_sd.c和stm32_eval_spi_sd.c这两文件是SD卡的SDIO和SPI接口的驱动程序,跟smc_nand.c和nand_if类似。接下去讲讲他们之间的关系:
要说起来最顶层的话应该是stm32f10x_it或则stm32f1xx_it.h里的中断服务程序USB_LP_CAN1_RX0_IRQHandler,当有数据通讯时,就会触发中断,该中断服务程序会调用usb_istr.c文件里的USB_Istr()函数,该函数又会调用usb_it.c的CTR_LP()正确传输处理函数,之后该函数就会根据是哪个端点而调用相应端点的回调函数。端点的回调函数在usb_endp.c里,官方的工程用到了端点1用来发送数据,端点2用来接收数据。这两个函数分别是EP1_IN_Callback()和EP2_OUT_Callback(),他们有分别调用usb_bot.c里的Mass_Storage_In()和Mass_Storage_Out()函数。这两个函数会根据数据通讯的内容,判断应该调用usb_scsi.c里的哪个SCSI命令集。当然usb_scsi.c里的指令又会用到读取或写入内存的函数Read_Memory()和Write_Memory()。这两个函数在memory.c中定义,并且会调用媒体接入层的mass_mal.c文件的里MAL_Read()和MAL_Write()。最后MAL_Read()和MAL_Write()这两个函数会调用设备或媒体的相关函数了,如果你是NAND,则会调用nand_if.c,进而再调用fsmc_nand.c;如果你使用SPI读写SD卡,则调用stm32_eval_spi_sd.c,如果你使用SDIO读写SD卡,则调用stm32_eval_sdio_sd.c。总之,他们之间有着层次关系。

    推荐阅读