×
单片机 > 单片机程序设计 > 详情

CH375_CH376 U盘读写模块在51单片机上的应用

发布时间:2020-08-26 发布时间:
|

电路原理图如下:
 

ch375资料手册:
 


本程序的接线图:

单片机源程序如下(host.c文件):

/* 

****************************************

**  Copyright  (C)  W.ch  1999-2004   **

****************************************

**  USB Host File Interface for CH375 **

**  TC2.0@PC, KC7.0@MCS51             **

****************************************

*/

/* CH375 主机文件系统接口 */

/* 支持: FAT12/FAT16/FAT32 */


/* MCS-51单片机C语言的U盘文件读写示例程序, 适用于89C52或者更大程序空间的单片机,也适用于ATMEL/PHILIPS/SST等具有1KB内部RAM的单片机 */

/* 该程序将U盘中的/C51/CH375HFT.C文件中的前200个字符显示出来,

   如果找不到原文件CH375HFT.C, 那么该程序将显示C51子目录下所有以CH375开头的文件名,

   如果找不到C51子目录, 那么该程序将显示根目录下的所有文件名,

   最后将程序ROM中的一个字符串写入写入新建的文件"NEWFILE.TXT"中

*/

/* CH375的INT#引脚采用查询方式处理, 数据复制方式为"单DPTR复制",兼容性最好但是速度最慢,

   本例只使用512字节的外部RAM, 同时作为磁盘数据缓冲区和文件数据缓冲区, 演示没有外部RAM但是单片机的内置RAM大于768字节的应用 */


/* 本例以字节为单位读写U盘文件,读写速度较扇区模式慢,但是由于字节模式读写文件不需要文件数据缓冲区FILE_DATA_BUF,

   所以总共只需要600字节的RAM,适用于单片机硬件资源有限、数据量小并且读写速度要求不高的系统 */


/*#define         NO_DEFAULT_CH375_INT                1*/        /* 在应用程序中定义NO_DEFAULT_CH375_INT可以禁止默认的中断处理程序,然后用自行编写的程序代替它 */

/*#define                CH375HF_NO_CODE                1*/

#include "CH375.H"


#ifdef        NO_DEFAULT_CH375_INT                        /* 自行编写中断处理程序,加上了超时处理,并且在等待中断的过程中可以做其它事 */

void xQueryInterrupt( void )                        /* 查询CH375中断并更新中断状态,该程序基本框架可以参考CH375HF?.H文件 */

{

        UINT16        i;

        for ( i = 65535; i != 0; i -- ) {  /* 正常情况下该过程为几毫秒到几十毫秒,偶尔也会达到几百毫秒 */

                if ( CH375_INT_WIRE == 0 ) break;  /* 如果CH375的中断引脚输出低电平则说明CH375操作完成 */

/*                if ( ( CH375_CMD_PORT & 0x80 ) == 0 ) break;  对于CH375B芯片,也查询CH375B的命令端口的位7为0说明中断引脚输出低电平 */

        }

        if ( i == 0 )

        CH375_CMD_PORT = CMD_GET_STATUS;  /* 获取当前中断状态 */

        mDelay2uS( );  /* 操作无意义,用于至少延时2uS,可以用多个NOP空操作指令实现 */

        CH375IntStatus = CH375_DAT_PORT;  /* 获取中断状态 */

        if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT;  /* 检测到USB设备断开事件 */

        else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT;  /* 检测到USB设备连接事件 */

}

#endif


/* 以毫秒为单位延时,不精确,适用于24MHz时钟 */

void        mDelaymS( UINT8 delay )

{

        unsigned char        i, j, c;

        for ( i = delay; i != 0; i -- ) {

                for ( j = 200; j != 0; j -- ) c += 3;  /* 在24MHz时钟下延时500uS */

                for ( j = 200; j != 0; j -- ) c += 3;  /* 在24MHz时钟下延时500uS */

        }

}


/* 将程序空间的字符串复制到内部RAM中,返回字符串长度 */

UINT8        mCopyCodeStringToIRAM( UINT8 idata *iDestination, UINT8 code *iSource )

{

        UINT8        i = 0;

        while ( *iDestination = *iSource ) {

                iDestination ++;

                iSource ++;

                i ++;

        }

        return( i );

}


/* 检查操作状态,如果错误则显示错误代码并停机 */

void        mStopIfError( UINT8 iError )

{

        if ( iError == ERR_SUCCESS ) return;  /* 操作成功 */

        printf( "Error: %02Xn", (UINT16)iError );  /* 显示错误 */

        while ( 1 ) {

                LED_UDISK_IN( );  /* LED闪烁 */

                mDelaymS( 100 );

                LED_UDISK_OUT( );

                mDelaymS( 100 );

        }

}


void host( ) {

        UINT8        i, c, TotalCount;

        UINT8        code *pCodeStr;

        UINT16        EnumCount;


#if DISK_BASE_BUF_LEN == 0

        pDISK_BASE_BUF = &my_buffer[0];  /* 不在.H文件中定义CH375的专用缓冲区,而是用缓冲区指针指向其它应用程序的缓冲区便于合用以节约RAM */

#endif


        i = CH375LibInit( );  /* 初始化CH375程序库和CH375芯片,操作成功返回0 */

        mStopIfError( i );

        while ( 1 ) {

                printf( "Insert USB diskn" );

                while ( CH375DiskStatus < DISK_CONNECT ) {  /* 等待U盘插入 */

                

/*                        if ( CH375_INT_WIRE == 0 ) xQueryInterrupt( );*/  /* 如果CH375中断,那么查询CH375中断并更新中断状态,可以改成中断方式 */

                        mDelaymS( 100 );  /* 没必要频繁查询 */

                        if ( CH375DiskConnect( ) == ERR_SUCCESS ) break;        /* 查询方式: 检查磁盘是否连接,返回成功说明连接 */

                }

                LED_UDISK_IN( );  /* LED亮 */

                mDelaymS( 250 );  /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */


/* 检查U盘是否准备好,但是某些U盘必须要执行这一步才能工作 */

                for ( i = 0; i < 5; i ++ ) {  /* 有的U盘总是返回未准备好,不过可以被忽略 */

                        mDelaymS( 100 );

                        printf( "Ready ?n" );

//                        if ( CH375DiskReady( ) == ERR_SUCCESS ) break;  /* 查询磁盘是否准备好,不支持CH375S,节约代码空间 */

                        if ( CH375sDiskReady( ) == ERR_SUCCESS ) break;  /* 查询磁盘是否准备好,支持CH375S和CH375A,但占用更多的代码空间 */

                }


#if DISK_BASE_BUF_LEN

                if ( DISK_BASE_BUF_LEN < CH375vSectorSize ) {  /* 检查磁盘数据缓冲区是否足够大,CH375vSectorSize是U盘的实际扇区大小 */

                        printf( "Too large sector sizen" );

                        while ( CH375DiskConnect( ) == ERR_SUCCESS ) mDelaymS( 100 );

                        continue;

                }

#endif

/* 读取原文件 */

                printf( "Openn" );

                mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/LCSOFT.TXT" );  /* 文件名,该文件在C51子目录下 */

                i = CH375FileOpen( );  /* 打开文件 */

                if ( i == ERR_MISS_DIR || i == ERR_MISS_FILE ) {  /* 没有找到C51子目录,没有找到CH375HFT.C文件 */

/* 列出文件 */

                        if ( i == ERR_MISS_DIR ) pCodeStr = "/*";  /* C51子目录不存在则列出根目录下的所有文件 */


关键字:CH375  CH376  U盘读写  51单片机 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机中断源的扩展方法