STM32USB⼤容量存储器MassStorage⼯程的讲解
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中被调⽤。
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。总之,他们之间有着层次关系。