[USB编程]

USB单片机CH559模拟U盘应用源码

[复制链接]
2412|11
手机看帖
扫描二维码
随时随地手机跟帖
WCHCN|  楼主 | 2017-5-5 09:32 | 显示全部楼层 |阅读模式
本帖最后由 WCHCN 于 2017-5-5 09:42 编辑


一、摘要

根据Mass Storage Class(大容量/海量存储器,以下简称MSC)协议,使用CH558、CH559和CH563分别实现模拟全速和高速U盘的功能,外部存储介质和U盘容量支持自由调整,用以解决数据转存或者定制U盘等功能。关键在于CH5XX USB设备控制器操作、Bulk-Only传输协议、SCSI命令支持和存储介质读写这几个部分。
二、总体概述
模拟U盘关键功能部件包括以下几点:

(1)、USB Mass Storage Framework
图片1.png
(2)、以U盘为例,下图是PC和U盘的内部抽象逻辑框图
图片2.png
CH558、CH559和CH563内置USB设备控制器和PHY,对于实现U盘控制器的应用,只需要配置USB设备模式和读写外部存储介质。
(3)、USB MSC CBI/BBB Transport
USB MSC Control/Bulk/Interrupt Transport 只能用于Full-speed的软盘(Floppy drive),这里不赘述,有兴趣可以自己百度。
Bulk-only传输类控制、批量都是通过批量端点,即用Bulk端点来传送命令块,数据,状态,因此,才类似于Control/Bulk/Interrupt被简称为CBI一样,而Bulk/Bulk/Bulk被简称为BBB。

图片3.png
(4)、USB MSC Protocol relation
图片4.png
传输通讯:Host和Device之间的数据通讯根据存储介质(Floppy或Flash)分别使用UFI和SCSI协议,更深入的设备特性配置参考More Feature。
(5)、U盘配置描述符Class,Subclass和Protocol对应关系
对应的,了解USB的都知道,每个设备的描述符中,都有对应下面这几个域:

bInterfaceClass 、 bInterfaceSubClass 、 bInterfaceProtocol
分别对应着USB的Class,Subclass,Protocol。
而对于我们此处的U盘:

bInterfaceClass=0x08=Mass Storage,Class就是USB Mass Storage Class,

bInterfaceSubClass=0x06=SCSI Transparent,Subclass,所支持的列表如下:
SubClass Codes Mapped to Command Block Specifications
图片5.png
bInterfaceProtocol=0x50=Bulk Only Transport,Protocol,所支持的列表如下:
Mass Storage Transport Protocol
图片6.png
(6)、MSC使用的SCSI命令集


0x00        TestUnitReady               0x03        RequestSense

0x12        Inquiry                     0x1A        ModeSense6
0x1B        StartStop                   0x1E        MediumRemoval

0x23        ReadFormatCapacity          0x25        ReadCapacity

0x28        Read(10)                    0x2A        Write(10)

0x2F        Verify                      0x5A        ModeSense10
SCSI命令使用各位可以阅读代码,或者去USB-IF搜索SCSI协议,实际上U盘所使用的所有SCSI命令集都可以参考UFI文档,它比SCSI标准文档更简洁明了。
(7)、Bulk-Only传输协议
详细的规范请阅读《Universal Serial BusMass Storage ClassBulk-Only Transport》)

设备插入到USB 后,USB 即对设备进行搜索,并要求设备提供相应的描述符。在USBHost 得到上述描述符后,即完成了设备的配置,识别出为Bulk-Only 的Mass Storage 设备, 然后即进入Bulk-Only 传输方式。在此方式下,USB 与设备间的所有数据均通过Bulk-In和Bulk-Out 来进行传输,不再通过控制端点传输任何数据。
在这种传输方式下,有三种类型的数据在USB 和设备之间传送,CBW、CSW 和普通数据。
CBW(Command Block Wrapper,即命令块包)是从USB Host 发送到设备的命令,命令格式遵从接口中的bInterfaceSubClass 所指定的命令块,这里为SCSI 传输命令集。USB设备需要将SCSI 命令从CBW 中提取出来,执行相应的命令,完成以后,向Host 发出反映 当前命令执行状态的CSW(Command Status Wrapper),Host 根据CSW 来决定是否继续发 送下一个CBW 或是数据。Host 要求USB 设备执行的命令可能为发送数据,则此时需要将 特定数据传送出去,完毕后发出CSW,以使Host 进行下一步的操作。USB 设备所执行的操作可用下图描述
图片7.png
CBW和CSW命令包格式在程序里面有或者参看Bulk-Only协议。
三、硬件设计
        CH558、CH559模拟U盘使用的SPI接口的串行Flash,硬件如下图:
图片8.png
CH558,CH559是增强型51内核的全速(12Mbps)USB单片机,内置晶振,芯片外围也足够简洁。CH563是32位高速USB MCU,内置网络PHY和协议栈。
芯片资源如下图:

9.jpg

四、软件设计
软件主要包括以下方面:
(1)、USB设备模式初始化

图片9.png
(2)、存储芯片接口初始化
图片10.png
(3)Bulk_Only传输
CBW包:
图片11.png
CSW包:
图片12.png
五、可拓展功能
(1)、其他存储介质:除了以上提到的SPI接口的串行Flash,也可以替换成EEPROM或者Nand falsh等非掉电易失存储介质。
(2)、数据来源可以随意指定,比如串口数据流,并口数据流,甚至其他温湿度传感器设备等。
(3)、CH559+SPI串行Flash模拟U盘测试参数


测试系统,功能
复制
粘贴
创建
格式化
XP
WIN7
WIN10
安卓

六、应用场合
应用的典型场合,比如:
(1)、代替光盘为客户提供说明书,可以将说明资料直接放到板子的存储介质内。
(2)、U盘数据监控、截取和加密。
(3)、采集数据数据暂存,方便拷贝到主机。
(4)、定制U盘等。

七、源码
CH558、CH559模拟USB1.1 全速U盘的源码(C语言):
CH559模拟U盘.rar (158.24 KB)

相关帖子

观摩一下大侠的风采

使用特权

评论回复
WCHCN|  楼主 | 2017-5-5 09:41 | 显示全部楼层

从word复制过来的,字体有点问题

使用特权

评论回复
可以可以,这近也在研究这个东西,想把SD卡移植到FPGA上面来

使用特权

评论回复
WCHCN|  楼主 | 2017-5-5 09:45 | 显示全部楼层
阳光下的泡馍 发表于 2017-5-5 09:42
可以可以,这近也在研究这个东西,想把SD卡移植到FPGA上面来

FPGA操作SD卡?怕麻烦的话还是用个如CH376这种芯片吧,省时省力,自己搞文件系统有点麻烦

使用特权

评论回复
嗯嗯,现在就是用软核移植文件系统,有点凌乱

使用特权

评论回复
中环仪表| | 2017-5-5 10:07 | 显示全部楼层
  我可以借鉴 了~~~

使用特权

评论回复
lzm2008| | 2017-5-5 14:39 | 显示全部楼层
有上文件系統的例子么?

使用特权

评论回复
WCHCN|  楼主 | 2017-5-5 15:51 | 显示全部楼层
lzm2008 发表于 2017-5-5 14:39
有上文件系統的例子么?

上文件系统?  读写U盘和SD卡的时候都提供了文件系统,未提供文件系统源码

使用特权

评论回复
东撒撒| | 2017-5-6 09:20 | 显示全部楼层
赞一个

使用特权

评论回复
hangc| | 2017-5-31 16:53 | 显示全部楼层
我用CH554 demo 板开发的,U盘插上提示格式化,但无法完成格式化,求解答!

使用特权

评论回复
WCHCN|  楼主 | 2017-5-31 16:57 | 显示全部楼层
hangc 发表于 2017-5-31 16:53
我用CH554 demo 板开发的,U盘插上提示格式化,但无法完成格式化,求解答!

加QQ2542195643看一下问题

使用特权

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

本版积分规则

个人签名:WCH单价1.3元的USB和Touchkey单片机CH552G已全面供货,试样QQ:1258305301

22

主题

473

帖子

31

粉丝