📄 ch374hft.c
字号:
{ // 在磁盘上UNICODE用小端方式存放
#if UNICODE_ENDIAN == 1
LongNameBuf[index++] =
DISK_BASE_BUF[offset + i*2 + 2];
LongNameBuf[index++] =
DISK_BASE_BUF[offset + i*2 + 1];
#else
LongNameBuf[index++] =
DISK_BASE_BUF[offset + i*2 + 1];
LongNameBuf[index++] =
DISK_BASE_BUF[offset + i*2 + 2];
#endif
}
for( i =0; i!=6; i++) // 长文件名的6-11个字符
{
#if UNICODE_ENDIAN == 1
LongNameBuf[index++] =
DISK_BASE_BUF[offset + 14 + i*2 + 1];
LongNameBuf[index++] =
DISK_BASE_BUF[offset + + 14 + i*2 ];
#else
LongNameBuf[index++] =
DISK_BASE_BUF[offset + + 14 + i*2 ];
LongNameBuf[index++] =
DISK_BASE_BUF[offset + 14 + i*2 + 1];
#endif
}
for( i=0; i!=2; i++) // 长文件名的12-13个字符
{
#if UNICODE_ENDIAN == 1
LongNameBuf[index++] =
DISK_BASE_BUF[offset + 28 + i*2 + 1];
LongNameBuf[index++] =
DISK_BASE_BUF[offset + 28 + i*2 ];
#else
LongNameBuf[index++] =
DISK_BASE_BUF[offset + 28 + i*2 ];
LongNameBuf[index++] =
DISK_BASE_BUF[offset + 28 + i*2 + 1];
#endif
}
if( DISK_BASE_BUF[offset] & 0X40 )
{
if( ! (((LongNameBuf[index -1] ==0x00)
&& (LongNameBuf[index -2] ==0x00))
|| ((LongNameBuf[index -1] ==0xFF)
&& (LongNameBuf[index -2 ] ==0xFF))))
{ // 处理刚好为26字节长倍数的文件名
if(index + 52 >LONG_NAME_BUF_LEN )
return ERR_BUF_OVER;
LongNameBuf[ index ] = 0x00;
LongNameBuf[ index + 1] = 0x00;
}
return ERR_SUCCESS; // 成功完成长文件名收集完成
}
}
else
return ERR_NO_NAME; // 错误的长文件名,程序返回
}
else
{
if( FirstBit == FALSE )
FirstBit = TRUE;
else // 否则第二次进入
{
for( i=0; i!=MAX_PATH_LEN; i++ )// 还原路径
mCmdParam.Open.mPathName[i] = BackPathBuf[i];
}
i = GetUpSectorData( &BackFdtSector );
if( i == ERR_SUCCESS )
{
CH374vFdtOffset = CH374vSectorSize;
goto P_NEXT1;
}
else
return i;
// 向后偏移扇区
}
}
}
}
return i; // 返回错误
}
/*
长文件名示例(UNICODE编码的大小端 必须与UNICODE_ENDIAN定义相同)
以下是LongName里编码内容:
建立长文件名,输入两个参数: 1.采用(unicode 大端),字符串末尾用两个0表示结束;2.ANSI编码短文件名.TXT
*/
UINT8 code LongName[] =
#if UNICODE_ENDIAN ==1
{
0x5E, 0xFA, 0x7A, 0xCB, 0x95, 0x7F, 0x65, 0x87, 0x4E, 0xF6, 0x54, 0x0D, 0xFF, 0x0C, 0x8F, 0x93,
0x51, 0x65, 0x4E, 0x24, 0x4E, 0x2A, 0x53, 0xC2, 0x65, 0x70, 0xFF, 0x1A, 0x00, 0x20, 0x00, 0x31,
0x00, 0x2E, 0x91, 0xC7, 0x75, 0x28, 0x00, 0x28, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63,
0x00, 0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x20, 0x59, 0x27, 0x7A, 0xEF, 0x00, 0x29, 0xFF, 0x0C,
0x5B, 0x57, 0x7B, 0x26, 0x4E, 0x32, 0x67, 0x2B, 0x5C, 0x3E, 0x75, 0x28, 0x4E, 0x24, 0x4E, 0x2A,
0x00, 0x30, 0x88, 0x68, 0x79, 0x3A, 0x7E, 0xD3, 0x67, 0x5F, 0x00, 0x3B, 0x00, 0x32, 0x00, 0x2E,
0x00, 0x41, 0x00, 0x4E, 0x00, 0x53, 0x00, 0x49, 0x7F, 0x16, 0x78, 0x01, 0x77, 0xED, 0x65, 0x87,
0x4E, 0xF6, 0x54, 0x0D, 0x00, 0x2E, 0x00, 0x54, 0x00, 0x58, 0x00, 0x54
};
#else
{
0xFA, 0x5E, 0xCB, 0x7A, 0x7F, 0x95, 0x87, 0x65, 0xF6, 0x4E, 0x0D, 0x54, 0x0C, 0xFF, 0x93, 0x8F,
0x65, 0x51, 0x24, 0x4E, 0x2A, 0x4E, 0xC2, 0x53, 0x70, 0x65, 0x1A, 0xFF, 0x20, 0x00, 0x31, 0x00,
0x2E, 0x00, 0xC7, 0x91, 0x28, 0x75, 0x28, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00,
0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x20, 0x00, 0x27, 0x59, 0xEF, 0x7A, 0x29, 0x00, 0x0C, 0xFF,
0x57, 0x5B, 0x26, 0x7B, 0x32, 0x4E, 0x2B, 0x67, 0x3E, 0x5C, 0x28, 0x75, 0x24, 0x4E, 0x2A, 0x4E,
0x30, 0x00, 0x68, 0x88, 0x3A, 0x79, 0xD3, 0x7E, 0x5F, 0x67, 0x3B, 0x00, 0x32, 0x00, 0x2E, 0x00,
0x41, 0x00, 0x4E, 0x00, 0x53, 0x00, 0x49, 0x00, 0x16, 0x7F, 0x01, 0x78, 0xED, 0x77, 0x87, 0x65,
0xF6, 0x4E, 0x0D, 0x54, 0x2E, 0x00, 0x54, 0x00, 0x58, 0x00, 0x54, 0x00
};
#endif
main( ) {
UINT8 i;
UINT16 j;
LED_OUT_INIT( );
LED_OUT_ACT( ); /* 开机后LED亮一下以示工作 */
CH374DelaymS( 100 ); /* 延时100毫秒 */
LED_OUT_INACT( );
mInitSTDIO( ); /* 为了让计算机通过串口监控演示过程 */
printf( "Start\n" );
#if DISK_BASE_BUF_LEN == 0
pDISK_BASE_BUF = &my_buffer[0]; /* 不在.H文件中定义CH374的专用缓冲区,而是用缓冲区指针指向其它应用程序的缓冲区便于合用以节约RAM */
#endif
i = CH374LibInit( ); /* 初始化CH374程序库和CH374芯片,操作成功返回0 */
mStopIfError( i );
/* 其它电路初始化 */
while ( 1 ) {
printf( "Wait Udisk\n" );
#ifdef UNSUPPORT_USB_HUB
/* 如果不需要支持USB-HUB,那么等待U盘插入的程序与CH374相似,都是通过CH374DiskConnect查询连接,已连接则通过CH374DiskReady等待就绪,然后读写 */
while ( CH374DiskStatus < DISK_CONNECT ) { /* 查询CH374中断并更新中断状态,等待U盘插入 */
CH374DiskConnect( );
CH374DelaymS( 50 ); /* 没必要频繁查询 */
}
LED_OUT_ACT( ); /* LED亮 */
CH374DelaymS( 200 ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */
/* 对于检测到USB设备的,最多等待100*50mS,主要针对有些MP3太慢,对于检测到USB设备并且连接DISK_MOUNTED的,最多等待5*50mS,主要针对DiskReady不过的 */
for ( i = 0; i < 100; i ++ ) { /* 最长等待时间,100*50mS */
CH374DelaymS( 50 );
printf( "Ready ?\n" );
if ( CH374DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */
if ( CH374DiskStatus < DISK_CONNECT ) break; /* 检测到断开,重新检测并计时 */
if ( CH374DiskStatus >= DISK_MOUNTED && i > 5 ) break; /* 有的U盘总是返回未准备好,不过可以忽略,只要其建立连接MOUNTED且尝试5*50mS */
}
if ( CH374DiskStatus < DISK_CONNECT ) { /* 检测到断开,重新检测并计时 */
printf( "Device gone\n" );
continue; /* 重新等待 */
}
if ( CH374DiskStatus < DISK_MOUNTED ) { /* 未知USB设备,例如USB键盘、打印机等 */
printf( "Unknown device\n" );
goto UnknownUsbDevice;
}
#else
/* 如果需要支持USB-HUB,那么必须参考本例中下面的等待程序 */
while ( 1 ) { /* 支持USB-HUB */
CH374DelaymS( 50 ); /* 没必要频繁查询 */
if ( CH374DiskConnect( ) == ERR_SUCCESS ) { /* 查询方式: 检查磁盘是否连接并更新磁盘状态,返回成功说明连接 */
CH374DelaymS( 200 ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */
/* 对于检测到USB设备的,最多等待100*50mS,主要针对有些MP3太慢,对于检测到USB设备并且连接DISK_MOUNTED的,最多等待5*50mS,主要针对DiskReady不过的 */
for ( i = 0; i < 100; i ++ ) { /* 最长等待时间,100*50mS */
CH374DelaymS( 50 );
printf( "Ready ?\n" );
if ( CH374DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */
if ( CH374DiskStatus < DISK_CONNECT ) { /* 检测到断开,重新检测并计时 */
printf( "Device gone\n" );
break; /* 重新等待 */
}
if ( CH374DiskStatus >= DISK_MOUNTED && i > 5 ) break; /* 有的U盘总是返回未准备好,不过可以忽略,只要其建立连接MOUNTED且尝试5*50mS */
if ( CH374DiskStatus == DISK_CONNECT ) { /* 有设备连接 */
if ( CH374vHubPortCount ) { /* 连接了一个USB-HUB,但可能没有U盘 */
printf( "No Udisk in USB_HUB\n" );
break;
}
else { /* 未知USB设备,有可能是U盘反应太慢,所以要再试试 */
}
}
}
if ( CH374DiskStatus >= DISK_MOUNTED ) { /* 是U盘 */
break; /* 开始操作U盘 */
}
if ( CH374DiskStatus == DISK_CONNECT ) { /* 多次尝试还是不行,估计不是U盘 */
if ( CH374vHubPortCount ) { /* 连接了一个USB-HUB,但可能没有U盘 */
/* 在while中等待HUB端口有U盘 */
}
else { /* 未知USB设备,例如USB键盘、打印机等,而且已经试了很多次还不行 */
printf( "Unknown device\n" );
goto UnknownUsbDevice;
}
}
}
}
LED_OUT_ACT( ); /* LED亮 */
#endif
#if DISK_BASE_BUF_LEN
if ( DISK_BASE_BUF_LEN < CH374vSectorSize ) { /* 检查磁盘数据缓冲区是否足够大,CH374vSectorSize是U盘的实际扇区大小 */
printf( "Too large sector size\n" );
goto UnknownUsbDevice;
}
#endif
/*==================== 以下演示创建及读取长文件名 ============================*/
// 复制长文件名(UNICODE 大端)到LongNameBuf里
memcpy( LongNameBuf, LongName, sizeof(LongName) );
// 末尾用两个0表示结束
LongNameBuf[sizeof(LongName)] = 0x00;
LongNameBuf[sizeof(LongName) + 1] = 0x00;
// 该长文件名的ANSI编码短文件名(8+3格式)
strcpy( mCmdParam.Create.mPathName, "\\C51\\AA\\长文件名.TXT" );
i = CH374CreateLongName( );
if( i == ERR_SUCCESS )
printf( "Created Long Name OK!!\n" );
else
printf( "Error Code: %02X\n", (UINT16)i );
printf( "Get long Name#\n" );
strcpy( mCmdParam.Open.mPathName, "\\C51\\AA\\长文件名.TXT" );
// 以上需要输入文件名的完整路径
i = CH374GetLongName( );
if( i == ERR_SUCCESS )
{
// 长文件名收集完成,以UNICODE编码方式(按UNICODE_ENDIAN定义)
// 存放在LongNameBuf缓冲里,长文件名最后用两个0结束.
// 以下显示缓冲区里所有数据
printf( "LongNameBuf: " );
for( j=0; j!=LONG_NAME_BUF_LEN; j++ )
printf( "%02X ", (UINT16)LongNameBuf[j] );
printf( "\n" );
}
else
printf( "Error Code: %02X\n", (UINT16)i );
/*==============================================================================*/
UnknownUsbDevice:
LED_RUN_INACT( );
printf( "Take out\n" );
while ( 1 ) { /* 支持USB-HUB */
CH374DelaymS( 10 ); /* 没必要频繁查询 */
if ( CH374DiskConnect( ) != ERR_SUCCESS ) break; /* 查询方式: 检查磁盘是否连接并更新磁盘状态,返回成功说明连接 */
}
LED_OUT_INACT( ); /* LED灭 */
CH374DelaymS( 200 );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -