⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch375hf1.c

📁 u盘读写模块.C51单片机与USB接口芯片对U盘进行文件读写,支持FAT8,FAT16和FAT32磁盘格式.
💻 C
📖 第 1 页 / 共 5 页
字号:
				else if ( status == ERR_MISS_FILE ) {  /* 文件不存在 */
					status = CH375FileCreate( );  /* 新建文件并打开,如果文件已经存在则先删除后再新建 */
				}
				if ( status == ERR_SUCCESS ) {  /* 文件已经打开 */
					mCmdParam.ByteWrite.mByteCount = mCopyCodeString( mCmdParam.ByteWrite.mByteBuffer, "在CH375的U盘模块自动演示时写入当前信息:\xd\xa版本=串口标准版V" );
					mByteToString( & mCmdParam.ByteWrite.mByteBuffer[ mCmdParam.ByteWrite.mByteCount ], FILE_MODULE_VER ); /* 将数据转换为十六进制字符串 */
					mCmdParam.ByteWrite.mByteCount += 2;
					status = CH375ByteWrite( );  /* 以字节为单位向当前文件写入数据 */
					if ( status == ERR_SUCCESS ) {
						mCmdParam.ByteWrite.mByteCount = mCopyCodeString( mCmdParam.ByteWrite.mByteBuffer, ", 工作模式和接口配置值=" );
						mByteToString( & mCmdParam.ByteWrite.mByteBuffer[ mCmdParam.ByteWrite.mByteCount ], mWorkMode ); /* 将数据转换为十六进制字符串 */
						mCmdParam.ByteWrite.mByteCount += 2;
						mCmdParam.ByteWrite.mByteCount += mCopyCodeString( & mCmdParam.ByteWrite.mByteBuffer[ mCmdParam.ByteWrite.mByteCount ], "H, 串口波特率除数/兼容I2C设备地址=" );
						mByteToString( & mCmdParam.ByteWrite.mByteBuffer[ mCmdParam.ByteWrite.mByteCount ], 0 - RCAP2L ); /* 将数据转换为十六进制字符串 */
						mCmdParam.ByteWrite.mByteCount += 2;
						mCmdParam.ByteWrite.mByteCount += mCopyCodeString( & mCmdParam.ByteWrite.mByteBuffer[ mCmdParam.ByteWrite.mByteCount ], "H\xd\xa" );
						status = CH375ByteWrite( );  /* 以字节为单位向当前文件写入数据 */
						if ( status == ERR_SUCCESS ) {
							mCmdParam.Close.mUpdateLen = 1;
							status = CH375FileClose( );  /* 关闭当前文件 */
						}
					}
				}
			}
			mDelaymS( 100 );
			SBUF = 0x57;
			while ( 1 ) {  /* 演示完成后停机,成功则LED常亮,失败则LED闪烁 */
				mDelaymS( 250 );
				BUSY_OUT = 0;  /* 空闲 */
				if ( status != ERR_SUCCESS ) {  /* 演示过程中出现错误 */
					mDelaymS( 250 );
					BUSY_OUT = 1;
				}
			}
		}
		EA = 0;  /* 命令执行期间禁止中断 */
		BUSY_OUT = 1;  /* 命令执行正忙 */
		INT_OUT = 1;
		TR0 = 0;
		AUXR = 0x01;  /* 使能内部扩展RAM,禁止无效ALE */
		status = ERR_SUCCESS;
		RetLen = 0;  /* 默认返回长度为0 */
		if ( mUsbModeDevice == 0 ) {  /* USB主机模式 */
			if ( CH375_INT_WIRE == 0 && mCmdCode != CMD_QueryStatus ) mQueryCH375( );  /* 如果CH375的中断引脚输出低电平则先处理中断状态 */
			switch ( mCmdCode ) {  /* 分析命令码 */
				case CMD_QueryStatus:  /* 查询当前模块的状态 */
					if ( mQueryCH375( ) != ERR_CH375_ERROR ) {  /* 查询CH375的中断状态,CH375尚未出错 */
						if ( mTestCH375( ) ) CH375DiskStatus = DISK_UNKNOWN;  /* 返回数据应该是测试数据取反,否则CH375出错 */
					}
					mCmdParam.Status.mLastStatus = mLastState;  /* 上次的状态 */
					mCmdParam.Status.mDiskStatus = CH375DiskStatus;  /* 当前磁盘及文件状态 */
					mCmdParam.Status.mIntStatus = CH375IntStatus;  /* 上次CH375操作的中断状态 */
					mCmdParam.Status.reserved = 0;
					mCmdParam.Status.mFileSize = CH375vFileSize;  /* 当前文件的长度 */
					mCmdParam.Status.mCurrentOffset = CH375vCurrentOffset;  /* 当前文件指针,当前读写位置的字节偏移 */
					RetLen = sizeof( mCmdParam.Status );
					if ( mModeBigEndian == 0 ) {  /* 小端格式,转换字节顺序 */
						mConvertDword( & mCmdParam.Status.mFileSize );
						mConvertDword( & mCmdParam.Status.mCurrentOffset );
					}
					break;
				case CMD_DiskQuery:  /* 查询磁盘信息 */
					status = CH375DiskQuery( );
					if ( status == ERR_SUCCESS ) RetLen = sizeof( mCmdParam.Query );  /* 操作成功则返回结果 */
					if ( mModeBigEndian == 0 ) {  /* 小端格式,转换字节顺序 */
						mConvertDword( & mCmdParam.Query.mDiskSizeSec );
						mConvertDword( & mCmdParam.Query.mTotalSector );
						mConvertDword( & mCmdParam.Query.mFreeSector );
					}
					break;
				case CMD_FileEnumer:  /* 枚举文件,返回文件名 */
					status = CH375FileEnumer( );
					if ( status == ERR_SUCCESS ) {  /* 操作成功则计算返回结果 */
						mCmdParam.Enumer.mPathName[ MAX_PATH_LEN - 1 ] = 0;  /* 结束标志 */
						NameBuf = (PUINT8I)( &mCmdParam );
						while ( *NameBuf != 0 ) {  /* 计算文件名的长度 */
							RetLen ++;
							NameBuf ++;
						}
						RetLen ++;  /* 包含字符串结束符后的长度 */
					}
					break;
				case CMD_FileOpen:  /* 打开文件 */
					status = CH375FileOpen( );
					break;
				case CMD_FileCreate:  /* 新建文件并打开,如果文件已经存在则先删除后再新建 */
					status = CH375FileCreate( );
					break;
				case CMD_FileErase:  /* 删除文件并关闭 */
					status = CH375FileErase( );
					break;
				case CMD_FileClose:  /* 关闭当前文件 */
					status = CH375FileClose( );
					break;
				case CMD_FileQuery:  /* 查询当前文件的信息 */
					status = CH375FileQuery( );
					if ( status == ERR_SUCCESS ) RetLen = sizeof( mCmdParam.Modify );  /* 操作成功则返回结果 */
					if ( mModeBigEndian == 0 ) {  /* 小端格式,转换字节顺序 */
						mConvertDword( & mCmdParam.Modify.mFileSize );
						mConvertWord( & mCmdParam.Modify.mFileDate );
						mConvertWord( & mCmdParam.Modify.mFileTime );
					}
					break;
				case CMD_FileModify:  /* 查询或者修改当前文件的信息 */
					if ( mModeBigEndian == 0 ) {  /* 小端格式,转换字节顺序 */
						mConvertDword( & mCmdParam.Modify.mFileSize );
						mConvertWord( & mCmdParam.Modify.mFileDate );
						mConvertWord( & mCmdParam.Modify.mFileTime );
					}
					status = CH375FileModify( );
					if ( status == ERR_SUCCESS ) RetLen = sizeof( mCmdParam.Modify );  /* 操作成功则返回结果 */
					if ( mModeBigEndian == 0 ) {  /* 小端格式,转换字节顺序 */
						mConvertDword( & mCmdParam.Modify.mFileSize );
						mConvertWord( & mCmdParam.Modify.mFileDate );
						mConvertWord( & mCmdParam.Modify.mFileTime );
					}
					break;
				case CMD_FileLocate:  /* 移动当前文件指针 */
					if ( mModeBigEndian == 0 ) {  /* 小端格式,转换字节顺序 */
						mConvertDword( & mCmdParam.Locate.mSectorOffset );
					}
					status = CH375FileLocate( );
					if ( mModeBigEndian == 0 ) {  /* 小端格式,转换字节顺序 */
						mConvertDword( & mCmdParam.Locate.mSectorOffset );
					}
					break;
				case CMD_FileRead:  /* 从当前文件读取数据 */
					mCmdParam.ReadX.mDataBuffer = 0;
					status = CH375FileReadX( );
					RetLen = sizeof( mCmdParam.Read );
					break;
				case CMD_FileWrite:  /* 向当前文件写入数据 */
					mCmdParam.WriteX.mDataBuffer = 0;
					status = CH375FileWriteX( );
					RetLen = sizeof( mCmdParam.Write );
					break;
				case CMD_ByteLocate:  /* 以字节为单位移动当前文件指针 */
					if ( mModeBigEndian == 0 ) {  /* 小端格式,转换字节顺序 */
						mConvertDword( & mCmdParam.ByteLocate.mByteOffset );
					}
					status = CH375ByteLocate( );
					if ( mModeBigEndian == 0 ) {  /* 小端格式,转换字节顺序 */
						mConvertDword( & mCmdParam.ByteLocate.mByteOffset );
					}
					break;
				case CMD_ByteRead:  /* 以字节为单位从当前文件读取数据 */
					status = CH375ByteRead( );
					if ( status == ERR_SUCCESS ) RetLen = mCmdParam.ByteRead.mByteCount + 1;  /* 操作成功则返回结果 */
					else RetLen = 1;
					break;
				case CMD_ByteWrite:  /* 以字节为单位向当前文件写入数据 */
					status = CH375ByteWrite( );
					RetLen = 1;
					break;
				case CMD_StreamRead:  /* 数据流模式读文件,只支持串口,只支持文本 */
					TI = 0;
					CH375DiskConnect( );  /* 检查磁盘是否连接 */
					if ( CH375DiskStatus < DISK_OPEN_FILE ) {  /* 尚未打开文件 */
						if ( CH375DiskStatus < DISK_CONNECT ) {  /* U盘尚未连接 */
							for ( RetLen = 250; RetLen != 0; RetLen -- ) {  /* 等待U盘连接 */
								mDelaymS( 50 );  /* 等待后再查询 */
								if ( RI && SBUF == SER_STREAM_END ) goto StreamExit;  /* 要求退出 */
								mDelaymS( 50 );  /* 等待后再查询 */
								if ( RI && SBUF == SER_STREAM_END ) goto StreamExit;  /* 要求退出 */
								if ( CH375DiskConnect( ) == ERR_SUCCESS ) break;  /* 检查磁盘是否连接,U盘已经连接 */
							}
						}
						if ( CH375DiskStatus < DISK_READY ) {  /* U盘尚未分析 */
							mDelaymS( 200 );  /* 等待U盘稳定 */
							for ( RetLen = 20; RetLen != 0; RetLen -- ) {  /* 等待U盘就绪 */
								mDelaymS( 50 );  /* 等待后再查询 */
								if ( RI && SBUF == SER_STREAM_END ) goto StreamExit;  /* 要求退出 */
								mDelaymS( 50 );  /* 等待后再查询 */
								if ( RI && SBUF == SER_STREAM_END ) goto StreamExit;  /* 要求退出 */
								status = CH375DiskReady( );  /* 查询磁盘是否准备好 */
								if ( status == ERR_SUCCESS ) break;
							}
						}
						mCopyCodeString( mCmdParam.Open.mPathName, STREAM_DEFAULT_FILE );  /* 默认数据流文件 */
						status = CH375FileOpen( );  /* 打开文件 */
						if ( status != ERR_SUCCESS ) {  /* 打开文件失败 */
							RetLen = SER_STREAM_ERROR;  /* 提示错误 */
							goto StreamExitSend;
						}
					}
					while ( 1 ) {
						if ( RI ) {  /* 接收到控制码 */
							RI = 0;
							RetLen = SBUF;
							if ( RetLen == SER_STREAM_ACK ) {  /* 接收应答 */
							}
							else if ( RetLen == SER_STREAM_END ) {  /* 要求退出 */
								if ( TI && mCmdParam.ByteRead.mByteCount ) {  /* 已经发送过数据并且已经预读过数据 */
									mCmdParam.ByteLocate.mByteOffset = CH375vCurrentOffset - 1;
									status = CH375ByteLocate( );  /* 回移文件指针 */
								}
								RetLen = status == ERR_SUCCESS ? SER_STREAM_ACK : SER_STREAM_ERROR;  /* 提示 */
								break;
							}
							else if ( RetLen == SER_STREAM_FLUSH ) {  /* 要求刷新 */
								mCmdParam.ByteLocate.mByteOffset = 0;
								status = CH375ByteLocate( );  /* 移动文件指针到首字节 */
								if ( status == ERR_SUCCESS ) {  /* 操作成功 */
									TI = 0;  /* 指示未预读数据 */
									continue;
								}
								else {
									RetLen = SER_STREAM_ERROR;  /* 提示错误 */
									break;
								}
							}
							else if ( TI ) {  /* 已经发送过数据 */
								while ( RI == 0 );  /* 重新等待应答 */
								continue;
							}
						}
						if ( TI == 0 ) {  /* 尚未预读数据 */
							mCmdParam.ByteRead.mByteCount = 1;
							status = CH375ByteRead( );  /* 从文件读取一个数据 */
						}
						if ( status != ERR_SUCCESS ) {  /* 读操作失败 */
							RetLen = SER_STREAM_ERROR;  /* 提示错误 */
							break;
						}
						if ( mCmdParam.ByteRead.mByteCount == 0 ) {  /* 文件结束 */
							RetLen = SER_STREAM_END;  /* 提示结束 */
							break;
						}
						TI = 0;
						SBUF = mCmdParam.ByteRead.mByteBuffer[0];  /* 发送数据 */
						mCmdParam.ByteRead.mByteCount = 1;
						status = CH375ByteRead( );  /* 从文件读取一个数据 */
						while ( TI == 0 );  /* 等待发送完成 */
#ifdef	WATCHDOG_TIMEOUT
						while ( RI == 0 ) WDT = 1;  /* 等待应答,清除看门狗计时 */
#else
						while ( RI == 0 );  /* 等待应答 */
#endif
					}
StreamExitSend:
					TI = 0;
					SBUF = RetLen;
					while ( TI == 0 );
StreamExit:
					mLastState = status;  /* 保存本次状态 */
					EXT_INT_FLAG = 0;  /* 清除中断标志 */
					RI = 0; TI = 0;  /* 清除中断标志 */
					mCmdAction = 0;  /* 清命令激活位 */
					AUXR = 0x03;  /* 禁止内部扩展RAM,禁止无效ALE */
					EA = 1;  /* 允许中断 */
					continue;
					break;
				case CMD_StreamWrite:  /* 数据流模式写文件,只支持串口,只支持文本 */
					TI = 0;
					CH375DiskConnect( );  /* 检查磁盘是否连接 */
					if ( CH375DiskStatus < DISK_OPEN_FILE ) {  /* 尚未打开文件 */
						if ( CH375DiskStatus < DISK_CONNECT ) {  /* U盘尚未连接 */
							for ( RetLen = 250; RetLen != 0; RetLen -- ) {  /* 等待U盘连接 */
								mDelaymS( 50 );  /* 等待后再查询 */
								if ( RI && SBUF == SER_STREAM_END ) goto StreamExit;  /* 要求退出 */
								mDelaymS( 50 );  /* 等待后再查询 */
								if ( RI && SBUF == SER_STREAM_END ) goto StreamExit;  /* 要求退出 */
								if ( CH375DiskConnect( ) == ERR_SUCCESS ) break;  /* 检查磁盘是否连接,U盘已经连接 */
							}
						}
						if ( CH375DiskStatus < DISK_READY ) {  /* U盘尚未分析 */
							mDelaymS( 200 );  /* 等待U盘稳定 */
							for ( RetLen = 20; RetLen != 0; RetLen -- ) {  /* 等待U盘就绪 */
								mDelaymS( 50 );  /* 等待后再查询 */
								if ( RI && SBUF == SER_STREAM_END ) goto StreamExit;  /* 要求退出 */
								mDelaymS( 50 );  /* 等待后再查询 */
								if ( RI && SBUF == SER_STREAM_END ) goto StreamExit;  /* 要求退出 */
								status = CH375DiskReady( );  /* 查询磁盘是否准备好 */
								if ( status == ERR_SUCCESS ) break;
							}
						}
						mCopyCodeString( mCmdParam.Open.mPathName, STREAM_DEFAULT_FILE );  /* 默认数据流文件 */
						status = CH375FileOpen( );  /* 打开文件 */
						if ( status == ERR_SUCCESS ) {  /* 文件已经存在 */
							mCmdParam.ByteLocate.mByteOffset = 0xFFFFFFFF;
							status = CH375ByteLocate( );  /* 以字节为单位移动当前文件指针,移到文件末尾以追加数据 */
						}
						else if ( status == ERR_MISS_FILE ) {  /* 文件不存在 */
							status = CH375FileCreate( );  /* 新建文件并打开,如果文件已经存在则先删除后再新建 */
						}
						if ( status != ERR_SUCCESS ) {  /* 打开文件失败 */
							RetLen = SER_STREAM_ERROR;  /* 提示错误 */
							goto StreamExitSend;
						}
					}
					mCmdParam.ByteWrite.mByteCount = 0;
					TI = 1;
					while ( 1 ) {
						if ( RI == 0 ) {  /* 尚未接收到数据 */
							RetLen = 255;  /* 超时计数 */
							TH0 = 0;
							TF0 = 0;  /* 清定时器0溢出标志 */
							TR0 = 1;  /* 打开定时器0检查超时 */
							while ( RI == 0 ) {  /* 等待接收 */
#ifdef	WATCHDOG_TIMEOUT
								WDT = 1;  /* 清除看门狗计时 */
#endif
								if ( TF0 && RetLen ) {  /* 超时 */
									TF0 = 0;
									RetLen --;  /* 计数 */
									if ( RetLen == 0  ) {  /* 累计超时足够则自动刷新 */
										status = CH375ByteWrite( );  /* 将缓冲区中的数据写入文件 */
										if ( status == ERR_SUCCESS && mCmdParam.ByteWrite.mByteCount ) {  /* 操作成功 */
											mCmdParam.ByteWrite.mByteCount = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -