移植 CH376 USB FAT12/16/32文件系统芯片 单片机 MCU51

2019-04-15 12:47发布

已经移植好的代码下载: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  

1      概述:

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上查看并没有产生文件或读写成功,还会造成同名文件产生。  

2      源码文件列表:

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断点行)。    

3      结构图:

从机设备一般指:U盘,SD卡,鼠标,打印机等特定功能的USB设备,响应USB HOST命令,主机设备一般指PC,单片机,CPU等主动发出命令设备。其目的都是进行USB总线通讯,对其进行规范而已。  

4      电路原理图参考:

 

4.1    通讯接口的选择:

5      DEMO 程序详解:

HOST.C

5.1    头文件:

 

5.2    缓存BUFFER

buf大小根据实际需要申请  

5.3    调试信息:

只有一个串口情况下采用串口通讯将无法再使用串口调试信息  

5.4    SPI通讯模式:

选择了SPI通讯模式,将不能同时再选UART通讯模式  

5.4.1  SPI 单片机IO脚配置:

SPI_SW.C 软件模拟SPI,硬件SPI(略)。  

5.5    UART通讯模式:

选择了UART通讯模式,将不能同时再选SPI通讯模式,并且必须关闭DEBUG调试信息(只有一个串口情况)。  

5.5.1  串口参数设置:

UART_HW.C 硬件串口,波特率设置,CH376支持硬件、软件波特率设置。  

5.5.2  CH376 DATASHEET串口说明:

 

5.6    检测U盘插入:

本文采用查询方式,中断方式(略)   CH376DiskConnect函数可以是一直等待或超时返回,由DEF_INT_TIMEOUT(见FILE_SYSTEM.H)宏控制,在实际产品应用中,一般不会一直等待,需要设定一个超时时间,由单片机的时钟频率决定,超时后可以调用回调函数,等待用户重试或退出。   如果返回成功也可以调用一个回调函数,CH376官方程序并没有提供此类模型,可自行做简单修改即可。  

5.7    U盘拔出:

 

5.8    创建目录:

默认情况从根目录开始。  

5.9    写文件:

本例对错误处理简单化,在实际应用中,必须分析错误代码,并提供用户重试、退出或对应方法,s为错误代码,可查询CH376INC.H文件。最安全情况CH376ByteWrite函数第3个参数为实际写入字节数,最好与需要写入字节数进行比较判断,在此简略。  

5.10       读文件:

分块读取文件,大、小文件均适应,读完一块可调用一回调函数,请判断realsize和readsize大小是否相等,不等情况理论上是会有的。  

5.11       删除文件:

删除文件将是不可恢复的  

5.12       main()函数:

实际应用中,如果有多个设备采用轮询方式检测状态或数据,需要进行主循环时间片控制,分配好每个设备的时间片和延时(上文已经提到U盘检测延时),不能进入一直等待状态。   如果只有用户主动操作单一模式,只需考虑超时即可,即不用处理被动状态(U盘插入中断),如:插入U盘后用户必须按键或其它操作才能读写U盘。  

6      总结:

6.1    优点:

从测试结果来看,CH376对U盘读写效果还算不错,网络上有公布一些测试速度的结果,并口模式可以达到几十K每秒,它简单易用,资源占用极少,物美价廉,稳定性好。  

6.2    不足:

从DEMO程序来看,整体结构不算很好,用户需要处理的工作还比较多,如:回调机制,主循环时间片控制,事件及错误处理等。   文件库函数太多,还要区分根目录,多级目录,使用的函数也不一样(如:新建多级目录使用不方便),不像操作系统封装成类似:open,read,write,del等通用函数。   大小写处理不好,只能处理全部大写目录或文件名(也支持小写文件名,例子EXAM11有说明,建议不要使用长文件名)。FAT文件系统是不区分大小写的,但是CH376可以建立大、小写同名的相同文件在同一目录,应该是属于BUG。