打印

【转】USB Mass Storage学习笔记

[复制链接]
楼主: sunmeat
手机看帖
扫描二维码
随时随地手机跟帖
21
sunmeat|  楼主 | 2015-2-25 14:18 | 只看该作者 回帖奖励 |倒序浏览
3、USB初始化:连接USB、USB硬件复位、配制CNTR寄存器使能和屏蔽中断、清零中断状态寄存器。

使用特权

评论回复
22
sunmeat|  楼主 | 2015-2-25 14:18 | 只看该作者
4、FLASH初始化。

使用特权

评论回复
23
sunmeat|  楼主 | 2015-2-25 14:19 | 只看该作者
三、            USB的枚举

当USB连接时,进入USB低优先级中断。首先获取中断状态(读ISTR寄存器),在MASS STORAGE中有USB复位中断、USB挂起中断和正确的数据传输中断。

注:在usb_istr.c 的void USB_Istr(void)函数中。

使用特权

评论回复
24
sunmeat|  楼主 | 2015-2-25 14:19 | 只看该作者
1、USB总线复位:

           设置分组缓冲区描述表起始地址;

                  初始化端点:端点0为控制端点、端点1、2为批量端点;设置发送和接收状态,设置发送和接收缓冲区地址。

            设置CBW签名, CBW.dSignature=0x43425355;

            初始化BOT状态机。

            注:在usb_prop.c的void MASS_Reset()函数中。

使用特权

评论回复
25
sunmeat|  楼主 | 2015-2-25 14:20 | 只看该作者
2、USB总线挂起:Xms总线上无数据传输,USB总线挂起,进入低功耗模式。

           注:在usb_pwr.c的void Suspend()函数中。

使用特权

评论回复
26
sunmeat|  楼主 | 2015-2-25 15:56 | 只看该作者
3、USB初始化:连接USB、USB硬件复位、配制CNTR寄存器使能和屏蔽中断、清零中断状态寄存器。

4、FLASH初始化。

使用特权

评论回复
27
sunmeat|  楼主 | 2015-2-25 15:57 | 只看该作者
三、            USB的枚举

当USB连接时,进入USB低优先级中断。首先获取中断状态(读ISTR寄存器),在MASS STORAGE中有USB复位中断、USB挂起中断和正确的数据传输中断。

注:在usb_istr.c 的void USB_Istr(void)函数中。

使用特权

评论回复
28
sunmeat|  楼主 | 2015-2-25 15:57 | 只看该作者
1、USB总线复位:

           设置分组缓冲区描述表起始地址;

                  初始化端点:端点0为控制端点、端点1、2为批量端点;设置发送和接收状态,设置发送和接收缓冲区地址。

            设置CBW签名, CBW.dSignature=0x43425355;

            初始化BOT状态机。

            注:在usb_prop.c的void MASS_Reset()函数中。

使用特权

评论回复
29
sunmeat|  楼主 | 2015-2-25 15:57 | 只看该作者
2、USB总线挂起:Xms总线上无数据传输,USB总线挂起,进入低功耗模式。

           注:在usb_pwr.c的void Suspend()函数中。

使用特权

评论回复
30
sunmeat|  楼主 | 2015-2-25 15:58 | 只看该作者
  3、正确的数据传输中断(usb_int.c   CTR_LP();)

           清除中断标志;

           获取端点标识符;

           控制端点处理:读端点寄存器,用来判断是数据输入、输出还是建立包。

使用特权

评论回复
31
sunmeat|  楼主 | 2015-2-25 15:58 | 只看该作者
四、            非控制端点处理(usb_endp.c -> usb.bot.c)

端点2输出中断:usb主机传数据或命令包至mcu。

端点1输入中断:mcu传数据或描述符至usb主机。

使用特权

评论回复
32
sunmeat|  楼主 | 2015-2-25 15:58 | 只看该作者
1、端点2输出中断

(1)    将主机传过来的数据从USB端点缓存区copy至MCU内存;

(2)    判断BOT状态,根据BOT状态做出相应的处理:当BOT状态位为0时,CBW包解析,并处理SCSI命令;当BOT状态为1时,表示数据输出,执行WRITE10命令处理。

使用特权

评论回复
33
sunmeat|  楼主 | 2015-2-25 15:59 | 只看该作者
2、端点1输入中断

判断BOT状态,如果BOT状态为2,表示数据输入,执行READ10命令处理;如果BOT状态为4,则表示数据输入完成,则返回CSW,进行到命令状态。

使用特权

评论回复
34
sunmeat|  楼主 | 2015-2-25 15:59 | 只看该作者
3、BOT状态机软件流程图

(1)端点2输出中断流程图(usb_bot.c -> Mass_Storage_Out())

使用特权

评论回复
35
sunmeat|  楼主 | 2015-2-25 15:59 | 只看该作者
(2)CBW包解析软件流程图(usb_bot.c -> CBW_Decode())

使用特权

评论回复
36
sunmeat|  楼主 | 2015-2-25 16:00 | 只看该作者
(3)READ10命令软件流程图(usb_scsi.c -> SCSI_Read10_Cmd(lun , LBA , BlockNbr))

使用特权

评论回复
37
sunmeat|  楼主 | 2015-2-25 16:00 | 只看该作者
(3)READ10命令软件流程图(usb_scsi.c -> SCSI_Read10_Cmd(lun , LBA , BlockNbr))

使用特权

评论回复
38
sunmeat|  楼主 | 2015-2-25 16:01 | 只看该作者
(4)WRITE10命令软件流程图(usb_scsi.c -> SCSI_Write10_Cmd(lun , LBA , BlockNbr))

使用特权

评论回复
39
sunmeat|  楼主 | 2015-2-25 16:01 | 只看该作者
(5)端点1输入中断流程图(usb_bot.c -> Mass_Storage_In())

使用特权

评论回复
40
sunmeat|  楼主 | 2015-2-25 16:02 | 只看该作者
4、USB对Memory的操作

   在MASS STORAGE中,USB对MEMORY的操作是以扇区(在FAT中,一个扇区为512字节)为单位的,而USB端点的最大包长为64字节,因此要发送或接收的数据会先放到内存,假设是CPU向端点1写数据,则首先从FLASH或SD卡中读取一扇区数据,再按最大包长分8次向USB端点发送。如果是端点2输出数据,则CPU将收到的数据先放至内存,并累加,当是512字节的整数倍时,再将数据写入FLASH或SD,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则