CH376是文件管理控制芯片,用于单片机系统读写U 盘或者SD 卡中的文件。CH376支持USB设备方式和USB主机方式,并且内置了USB通讯协议的基本固件,内置了处理Mass-Storage海量存储设备的专用通讯协议的固件,内置了SD卡的通讯接口固件,内置了FAT16和FAT32以及FAT12文件系统的管理固件,支持常用的USB存储设备(包括U盘/USB硬盘/USB闪存盘/USB读卡器)和SD卡(包括标准容量SD卡和高容量HC-SD卡以及协议兼容的MMC卡和TF卡)。
有关U 盘和SD 卡文件读写的例子主要由以下文件组成:
① 硬件抽象层,即I/O 接口子程序,由单片机与CH376 芯片之间的通讯接口方式决定
HAL.H 硬件抽象层头文件
HAL_BASE.C 硬件抽象层基本子程序,包括延时子程序,需要根据单片机实际速度修改I/O 接口子程序,必须根据实际的通讯方式选择以下其中一种并按实际硬件和参数进行修改:
UART_HW.C 是硬件异步串口连接方式,支持波特率从9600bps 到3Mbps。
② 文件系统层,将常用命令进行打包,提供了常用的文件管理子程序和一些不太常用的子程序
FILE_SYS.H 文件系统层头文件,子程序声明等;
FILE_SYS.C 文件系统层子程序,子程序源程序等,在第5 节有详细说明。
③ 辅助调试子程序,用于打印输出调试信息,以便检查程序运行结果,正式产品中必须删除之
DEBUG.H 辅助调试子程序头文件;
DEBUG.C 辅助调试子程序源程序等。
正常使用的主要是硬件抽象层和文件系统层,并且要做相应的修改。对于辅助调试子程序,主要是对几个程序段的监视,但是必须要有两个及以上的通讯串口,只有一个串口需要禁用调试输出。
在硬件层,HAL_BASE.c中需要根据单片机的频率修改延时的设置,粗略设置即可。
在UART_HW.C中,需要修改以下几个地方:
//#defineCH376_INT_WIRE P1_0 /假定CH376的INT#引脚,如果未连接那么也可以通过查询串口中断状态码实现 /如果在评估板上没有使用INT端口,直接注释掉,使用查询即可。
#define UART_INIT_BAUDRATE 9600 /*默认通讯波特率9600bps,建议通过硬件引脚设定直接选择更高的CH376的默认通讯波特率 */
//#define UART_WORK_BAUDRATE 57600 /*正式通讯波特率57600bps */若不修改波特率,建议使用初始波特率,调试成功后再修改通讯波特率。
void CH376_PORT_INIT( void ) /*由于使用异步串口读写时序,所以进行初始化*/
{
/* 如果单片机只有一个串口,那么必须禁止通过串口输出监控信息 */
SCON = 0x50;
PCON = 0x80;
TL2 = RCAP2L = 0 -11059200/32/UART_INIT_BAUDRATE;
TH2 = RCAP2H = 0xFF;
T2CON = 0x34; /*定时器2用于串口的波特率发生器 */
RI = 0;
}
设定单片机的UART串口通讯配置,对于51,只需修改频率即可,其他单片机根据使用串口的数据手册指导,修改该文件内的所有的查询位。直到可以正常通讯。
在FILE_SYS.C中,注释掉所有的 xEndCH376Cmd( );函数,定义
#define EN_DIR_CREATE,定义 EN_DIR_CREATE用于提供新建多级子目录的子程序,默认是不提供 。
在主函数中写如下代码:
#include"string.h"
#include"reg52.h"
#include"HAL.H"
#include"FILE_SYS.h"
UINT8 idata buf[64];
sbit P1_2 = P1^2; //定义IO口,便于调试中的监视程序运行状态
sbit P1_3 = P1^3;
sbit P1_4 = P1^4;
sbit P1_5 = P1^5;
sbit P1_6 = P1^6;
sbit P1_7 = P1^7;
void main()
{
UINT8 s= 0;
UINT32 i=0;
UINT8 FileCreate(UINT8 mFileName[],UINT8mFileType);
UINT8 ReadStatus();
P1_2 = 1;
P1_3 = 1;
P1_4 = 1;
P1_5 = 1;
P1_6 = 1;
P1_7 = 1;
s = mInitCH376Host(); //初始化
if(CH376DiskConnect() == USB_INT_SUCCESS)
P1_2 = 0;
s = CH376DiskMount(); //挂载磁盘
if( s == USB_INT_SUCCESS)
P1_4 = 0;
CH376FileClose(FALSE);
CH376FileCreatePath("/ABX.TXT");
if(s == USB_INT_SUCCESS)
P1_5 = 0;
strcpy( buf, "lkokl" );
s = CH376ByteWrite( buf, strlen(buf), NULL); /*以字节为单位向当前位置写入数据块 */
s = CH376FileClose( TRUE ); /*关闭文件,对于字节读写建议自动更新文件长度 */
if(s == USB_INT_SUCCESS)
P1_6 = 0;
/**指令集操作文件段**
CH376_PORT_INIT( );
xWriteCH376Cmd( CMD11_CHECK_EXIST );
xWriteCH376Data( 0x22 );
s = xReadCH376Data( );
if ( s != 0xdd ) P1_4 = 0; //出错
xWriteCH376Cmd( CMD11_SET_USB_MODE ); //设备USB工作模式
xWriteCH376Data( 0x06 );
s = xReadCH376Data( );
if ( s != CMD_RET_SUCCESS ) P1_4 = 0; //出错
while(1)
{
while(1)
{
if(Query376Interrupt())
{
xWriteCH376Cmd( CMD01_GET_STATUS);
s = xReadCH376Data( );
if(s==USB_INT_CONNECT)
{
P1_5 = 0;
break;
}
}
mDelaymS(50);
}
mDelaymS(600);
s = CH376DirCreate("/TTXX"); //创建目录
if(s == USB_INT_SUCCESS)
P1_2 = 0;
CH376FileCreate("POI.TXT"); //创建文件
strcpy( buf, "lkokl" );
s = CH376ByteWrite( buf, strlen(buf),NULL ); //以字节为单位向当前位置写入数据块
s = CH376FileClose( TRUE ); //关闭文件,对于字节读写建议自动更新文件长度
*/
while(1);
}
建议使用指令进行基本的创建文件,选择USB模式等操作,了解芯片对U盘的操作模式,便于以后的使用。