已经移植好的代码下载:
http://download.csdn.net/detail/lxj_com2006/3793887
欢迎交流: QQ:67016879 EMAIL: lxj_com@163.com
目录
1 概述:... 1
2 源码文件列表:... 2
3 结构图:... 3
4 电路原理图参考:... 4
4.1 通讯接口的选择:... 5
5 DEMO程序详解:... 5
5.1 头文件:... 5
5.2 缓存BUFFER:... 6
5.3 调试信息:... 6
5.4 SPI通讯模式:... 6
5.4.1 SPI 单片机IO脚配置:... 7
5.5 UART通讯模式:... 7
5.5.1 串口参数设置:... 7
5.5.2 CH376DATASHEET串口说明:... 8
5.6 检测U盘插入:... 8
5.7 U盘拔出:... 9
5.8 创建目录:... 10
5.9 写文件:... 10
5.10 读文件:... 11
5.11 删除文件:... 12
5.12 main()函数:... 13
6 总结:... 14
6.1 优点:... 14
6.2 不足:... 14
CH376做为一颗国产USB芯片(
南京沁恒电子),支持HOST,SLAVE模式,相比前期版本CH375,CH376内部自带了FAT12/16/32文件系统,避免了MCU需要去处理庞大的文件系统库,将系统开销降到很低,甚至一颗89C51就能顺利的运行起来,内存占用极低。并提供部分向上兼容。价格方面与市面同类产品差不多(如:PB375,SL811等),大概十几元左右,优势在于稳定性稍好一些。
编译器:Keil3 C51 v8.18
单片机:SST89X516RD
USB芯片:CH376S(SOP-28PIN)
通讯接口:SPI,串口,总线并口(略)
由于对读写速度没有特别要求,加上占用IO脚考虑,本文并没有说明CH376总线模式和IO模拟总线模式,采用SPI或串口通讯。
本文主要说明CH376以HOST模式读写U盘为例,CH376功能非常强大,如:与SD卡,键盘,鼠标,打印机等通讯,SLAVE模式,并没有进行描述。
CH376对大小写支持不好,所有路径,文件名必须为全大写(datasheet有说明),分别以小、大小写混合名称测试,函数也会返回成功,但实际没有效果,到PC上查看并没有产生文件或读写成功,还会造成同名文件产生。
HAL.H声明了一些设备接口函数,如:CH376_PORT_INIT,mInitCH376Host,xWriteCH376Cmd,xReadCH376Data,xWriteCH376Data等,而这些函数分别是在SPI_SW.C,UART_HW.C等这些文件实现的,等于是把通讯接口统一封装了一次,供上层统一调用,这样做是因为CH376支持3总通讯模式:MCU LOCAL BUS(总线),SPI, UART,当用户选择不同的通讯模式时与上层应用无关,只需编译不同的通讯模块即可,非常方便(下文有详细说明)。所以像SPI_SW.C,UART_HW.C等这些文件只能任选一被编译,不能同时编译,会产生错误,函数重定义。
CH376官方提供的解决办法是通过#include包含不同C文件来进行不同通讯模块选择,本文不建议这样使用,这会破坏C语言的文件结构(一般情况#include只包含.h头文件),根据需要将C文件加入keil工程管理中更好(#include C文件方式无法debug断点行)。
从机设备一般指:U盘,SD卡,鼠标,打印机等特定功能的USB设备,响应USB HOST命令,主机设备一般指PC,单片机,CPU等主动发出命令设备。其目的都是进行USB总线通讯,对其进行规范而已。
HOST.C
buf大小根据实际需要申请
只有一个串口情况下采用串口通讯将无法再使用串口调试信息
选择了SPI通讯模式,将不能同时再选UART通讯模式
SPI_SW.C
软件模拟SPI,硬件SPI(略)。
选择了UART通讯模式,将不能同时再选SPI通讯模式,并且必须关闭DEBUG调试信息(只有一个串口情况)。
UART_HW.C
硬件串口,波特率设置,CH376支持硬件、软件波特率设置。
本文采用查询方式,中断方式(略)
CH376DiskConnect函数可以是一直等待或超时返回,由DEF_INT_TIMEOUT(见FILE_SYSTEM.H)宏控制,在实际产品应用中,一般不会一直等待,需要设定一个超时时间,由单片机的时钟频率决定,超时后可以调用回调函数,等待用户重试或退出。
如果返回成功也可以调用一个回调函数,CH376官方程序并没有提供此类模型,可自行做简单修改即可。
默认情况从根目录开始。
本例对错误处理简单化,在实际应用中,必须分析错误代码,并提供用户重试、退出或对应方法,s为错误代码,可查询CH376INC.H文件。最安全情况CH376ByteWrite函数第3个参数为实际写入字节数,最好与需要写入字节数进行比较判断,在此简略。
分块读取文件,大、小文件均适应,读完一块可调用一回调函数,请判断realsize和readsize大小是否相等,不等情况理论上是会有的。
删除文件将是不可恢复的
实际应用中,如果有多个设备采用轮询方式检测状态或数据,需要进行主循环时间片控制,分配好每个设备的时间片和延时(上文已经提到U盘检测延时),不能进入一直等待状态。
如果只有用户主动操作单一模式,只需考虑超时即可,即不用处理被动状态(U盘插入中断),如:插入U盘后用户必须按键或其它操作才能读写U盘。
从测试结果来看,CH376对U盘读写效果还算不错,网络上有公布一些测试速度的结果,并口模式可以达到几十K每秒,它简单易用,资源占用极少,物美价廉,稳定性好。
从DEMO程序来看,整体结构不算很好,用户需要处理的工作还比较多,如:回调机制,主循环时间片控制,事件及错误处理等。
文件库函数太多,还要区分根目录,多级目录,使用的函数也不一样(如:新建多级目录使用不方便),不像操作系统封装成类似:open,read,write,del等通用函数。
大小写处理不好,只能处理全部大写目录或文件名(也支持小写文件名,例子EXAM11有说明,建议不要使用长文件名)。FAT文件系统是不区分大小写的,但是CH376可以建立大、小写同名的相同文件在同一目录,应该是属于BUG。