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

📄 ch375hf1.c

📁 u盘读写模块.C51单片机与USB接口芯片对U盘进行文件读写,支持FAT8,FAT16和FAT32磁盘格式.
💻 C
📖 第 1 页 / 共 5 页
字号:
		CH375_CMD_PORT = CMD_GET_STATUS;  /* 获取当前中断状态 */
		_nop_( ); _nop_( ); _nop_( ); _nop_( ); _nop_( );  /* 至少延时2uS */
		CH375IntStatus = CH375_DAT_PORT;  /* 获取中断状态 */
		if ( CH375IntStatus == USB_INT_EP2_OUT ) {  /* USB端点2的OUT */
			status = ERR_USB_DAT_DOWN;
		}
		else if ( CH375IntStatus == USB_INT_EP2_IN ) {  /* USB端点2的IN */
			status = ERR_USB_DAT_UP;
		}
		else if ( CH375IntStatus == USB_INT_EP1_IN ) {  /* USB端点1的IN */
			status = ERR_SUCCESS;
		}
		else {
			status = ERR_CH375_ERROR;  /* CH375硬件错误,可能需要复位CH375 */
		}
	}
	else status = ERR_SUCCESS;
	return( status );
}

/* 将字符串复制到内部RAM中,返回字符串长度 */
UINT8	mCopyCodeString( PUINT8I iDestination, UINT8 code *iSource )
{
	UINT8	i;
	i = 0;
	while ( *iDestination = *iSource ) {
		iDestination ++;
		iSource ++;
		i ++;
	}
	return( i );
}

/* 磁盘缓冲区清零 */
void	mClrDiskBaseBuf( void )
{
	UINT8	c1, c2;
	PUINT8X	DirXramBuf;
	DirXramBuf = &DISK_BASE_BUF[0];
	for ( c1 = 2; c1 != 0; c1 -- ) {
		c2 = 0;
		do {
			*DirXramBuf = 0;
			DirXramBuf ++;
		} while ( -- c2 );
	}
}

/* 将字节数据转换为十六进制字符串(两位数) */
void	mByteToString( PUINT8I iBuffer, UINT8 iBcd )
{
	UINT8	c;
	c = ( iBcd >> 4 ) & 0x0F;
	*iBuffer = c + ( c >= 10 ? 'A' - 10 : '0' );
	iBuffer ++;
	c = iBcd & 0x0F;
	*iBuffer = c + ( c >= 10 ? 'A' - 10 : '0' );
}

/* 将缓冲区中的双字数据交换字节顺序 */
void	mConvertDword( PUINT32I iBuffer )
{
	PUINT8I	iBuf;
	iBuf = (PUINT8I)iBuffer;
	R7X = *iBuf;
	iBuf ++;
	R6X = *iBuf;
	iBuf ++;
	B = *iBuf;
	iBuf ++;
	ACC = *iBuf;
	*iBuf = R7X;
	iBuf --;
	*iBuf = R6X;
	iBuf --;
	*iBuf = B;
	iBuf --;
	*iBuf = ACC;
}

/* 将缓冲区中的字数据交换字节顺序 */
void	mConvertWord( PUINT16I iBuffer )
{
	PUINT8I	iBuf;
	iBuf = (PUINT8I)iBuffer;
	B = *iBuf;
	iBuf ++;
	ACC = *iBuf;
	*iBuf = B;
	iBuf --;
	*iBuf = ACC;
}

/* 测试CH375是否正常, 返回0则正常 */
UINT8	mTestCH375( void )
{
	if ( CH375_DAT_PORT & 1 ) {
		mWriteCmdCH375( CMD_CHECK_EXIST );  /* 测试工作状态 */
		CH375_DAT_PORT = 0x55;  /* 测试数据 */
		mDelay2uS( );
		return( CH375_DAT_PORT ^ 0xAA );  /* 返回数据应该是测试数据取反,否则CH375出错 */
	}
	else {
		mWriteCmdCH375( CMD_CHECK_EXIST );  /* 测试工作状态 */
		CH375_DAT_PORT = 0xAA;  /* 测试数据 */
		mDelay2uS( );
		return( CH375_DAT_PORT ^ 0x55 );  /* 返回数据应该是测试数据取反,否则CH375出错 */
	}
}

/* 设置USB的设备ID */
void	mSetUsbID( void )
{
	mWriteCmdCH375( CMD_SET_USB_ID );
	CH375_DAT_PORT = mCmdParam.SetUsbId.mVidLow;
	_nop_( );
	CH375_DAT_PORT = mCmdParam.SetUsbId.mVidHigh;
	_nop_( );
	CH375_DAT_PORT = mCmdParam.SetUsbId.mPidLow;
	_nop_( );
	CH375_DAT_PORT = mCmdParam.SetUsbId.mPidHigh;
}

/* 设置CH375的工作模式,返回等待操作状态的计数 */
UINT8	mSetModeCH375( void )
{
	UINT8	i;
	mWriteCmdCH375( CMD_SET_USB_MODE );
	CH375_DAT_PORT = mCmdParam.SetUsbMode.mUsbMode;  /* USB模式 */
	_nop_( );
	for ( i = 250; i != 0; i -- ) if ( CH375_DAT_PORT == CMD_RET_SUCCESS ) break;
	return( i );  /* 返回0则设置模式失败 */
}

/* 复位CH375芯片 */
void	mResetCH375( void )
{
	P1 = 0xFF;  /* 硬复位CH375芯片 */
	mDelaymS( 1 );
	P1 = 0xFC;  /* 取消复位 */
	mDelay2uS( );
	if ( ( P1 & ~ DISABLE_RESET ) == 0 ) {  /* 硬件支持硬复位 */
		P1 = DISABLE_RESET;  /* 禁止复位 */
		mDelaymS( 50 );
	}
	else {  /* 只能命令复位 */
		P1 = DISABLE_RESET;  /* 禁止复位 */
		CH375Reset( );  /* 复位CH375 */
	}
}

main( ) {
	UINT8	RetLen, status;
	UINT8	DirNameStart, c;
	UINT32	UpDirCluster;
	PUINT8I	NameBuf, SerRetBuf;
	PUINT8I	ReadUsbBuf, WriteUsbBuf;
	PUINT8X	DirXramBuf;
	PUINT8I	DirInfoBufI1, DirInfoBufI2;
	PUINT8X	DirInfoBufX1, DirInfoBufX2;
	UINT8 code *DirConstData;
	IE = 0;  /* 关闭中断,恢复默认值 */
	P1 = 0xFF;
	P0 = 0xFF;
	P2 = 0xFF;
	P3 = 0xFF;
	IP = 0;
	PSW = 0;
	P1 = DISABLE_RESET;  /* 禁止复位 */
	mDelaymS( 50 );
	IE = 0;
	AUXR = 0x03;  /* 禁止内部扩展RAM,禁止无效ALE */
	TCON = 0x00;
	TMOD = 0x01;  /* 定时器0用于串口接收超时检测 */
	TH0 = 0x00;
	if ( xPresetSig == 0x24484D53 ) {  /* 模块的预设标志$HMS有效 */
		mWorkMode = xWorkMode;  /* 模块的预设标志$HMS有效则获取预设的工作模式 */
		RetLen = xBaudRate;  /* 预设串口通讯波特率 */
	}
	else if ( zPresetSig == 0x24484D53 ) {  /* 模块的预设标志$HMS有效 */
		mWorkMode = zWorkMode;  /* 模块的预设标志$HMS有效则获取预设的工作模式 */
		RetLen = zBaudRate;  /* 预设串口通讯波特率 */
	}
	else {  /* 默认工作模式 */
		mWorkMode = 0x00;  /* 清工作模式 */
		mModeBigEndian = 1;  /* 数据字节顺序:大端BIG_ENDIAN */
		mModeAutoNotice = 0;  /* 空闲时查询U盘连接状态并自动中断通知:禁止 */
		mModeUpdateSize = 0;  /* 向文件写入数据后自动更新文件长度:禁止 */
		mModeTimeout = 1;  /* 串口超时使能:允许超时检查 */
		mModeSerial = 0;  /* 接口方式:并口 */
		mModePortSpec = 0; /* 并口/专用接口方式选择:8位并口 */
		RetLen = DEFAULT_BAUDRATE;  /* 默认波特率 */
	}
#ifdef	WATCHDOG_TIMEOUT
	if ( mModeTimeout ) {  /* 允许超时检查 */
		WDTC = 0;  /* 关闭看门狗 */
		WDTD = WATCHDOG_TIMEOUT;
		WDTC = 0x0F;  /* 启用看门狗 */
	}
#endif
	if ( PIN_SER_MODE == 0 ) {  /* 低电平设置接口方式为3线制串口方式 */
		mDelaymS( 1 );  /* 延时1毫秒 */
		if ( PIN_SER_MODE == 0 ) {  /* 强制为3线制串口方式 */
			mModeSerial = 1;
			mModeSerialSync = 1;
		}
	}
	if ( RetLen == 0 || RetLen == 0xFF ) RetLen = DEFAULT_BAUDRATE;  /* 未预设波特率 */
	if ( mModeSerial == 0 ) {  /* 并口 */
		while ( 1 ) {
			BUSY_OUT = 0;  /* 空闲 */
			mDelaymS( 250 );
			mDelaymS( 250 );
			BUSY_OUT = 1;  /* 空闲 */
			mDelaymS( 250 );
			mDelaymS( 250 );
		}
	}
		PCON = 0x80;
		SCON = 0x50;  /* 8位串行数据 */
		TL2 = RCAP2L = 0 - RetLen;
		TH2 = RCAP2H = 0xFF;
		T2CON = 0x34;  /* 定时器2用于串口的波特率发生器 */
		if ( mModeSerialSync ) {  /* 三线制串口,由串口同步码启动操作 */
			RI = 0; TI = 0;  /* 清除中断标志 */
			EXT_INT_ENABLE = 0;  /* 禁止外部接口中断 */
			ES = 1;  /* 允许串口中断 */
		}
		else {  /* 默认为4+1线串口 */
			ES = 0;  /* 由外部中断启动操作 */
			EXT_INT_ENABLE = 1;  /* 允许外部接口中断 */
		}
	IT1 = 1;  /* 使用边沿触发方式 */
/*	PX1 = 1;*/  /* 高优先级 */
	EXT_INT_FLAG = 0;  /* 清中断标志 */
	mCmdAction = 0;  /* 命令激活位无效 */
	mSetBaudRate = 0;  /* 不设置波特率 */
	mCmdCode = 0;  /* 命令码无效 */
/*	mCmdLength = 0;*/  /* 命令包的参数长度 */
	CH375LibConfig = LIB_CFG_VALUE;  /* CH375程序库配置值 */
	if ( mModeUpdateSize ) CH375LibConfig |= 0x10;  /* 自动更新文件长度 */
	mUsbModeDevice = 0;  /* USB主机模式 */
	if ( mTestCH375( ) || mTestCH375( ) ) mLastState = ERR_CH375_ERROR;  /* CH375硬件错误 */
	else mLastState = CH375Init( );  /* 初始化CH375 */
	while ( mLastState != ERR_SUCCESS ) {  /* 初始化失败 */
		mResetCH375( );  /* 复位CH375芯片 */
		for ( RetLen = 3; RetLen != 0; RetLen -- ) {
			BUSY_OUT = 0;  /* 闪烁 */
			mDelaymS( 100 );  /* 延时100毫秒 */
			BUSY_OUT = 1;
			mDelaymS( 100 );
		}
		mLastState = CH375Init( );  /* 再次初始化CH375 */
	}
	EA = 1;  /* 开全局中断 */
	while ( 1 ) {
		BUSY_OUT = 0;  /* 空闲 */
#ifdef	WATCHDOG_TIMEOUT
		WDT = 1;  /* 清除看门狗计时 */
#endif
		while ( mCmdAction == 0 ) {  /* 尚未收到命令包 */
#ifdef	WATCHDOG_TIMEOUT
			WDT = 1;  /* 清除看门狗计时 */
#endif
			if ( mModeAutoNotice ) {  /* 允许空闲时查询U盘连接状态并自动中断通知 */
				status = mUsbModeDevice ? mQueryCH375Device( ) : mQueryCH375( );  /* 查询CH375的中断状态 */
				if ( status != ERR_SUCCESS ) {  /* U盘断开或者连接 */
					INT_OUT = 1;  /* 撤消之前的中断 */
					mDelay2uS( );  /* 至少延时2uS */
						INT_OUT = 0;  /* 输出中断请求 */
						if ( mModeSerialSync ) EA = 0;  /* 关闭中断 */
						TI = 0;
						SBUF = status;  /* 操作状态码 */
						while ( TI == 0 );
						INT_OUT = 1;  /* 撤消中断 */
						TI = 0;
						EA = 1;  /* 允许中断 */
				}
			}
			if ( PIN_AUTO_DEMO ) continue;
			for ( RetLen = 0xFF; RetLen != 0; RetLen -- ) if ( PIN_AUTO_DEMO || mCmdAction ) break;
			if ( mCmdAction ) break;
			if ( PIN_AUTO_DEMO ) continue;
			EA = 0;  /* 命令执行期间禁止中断 */
			BUSY_OUT = 1;  /* 命令执行正忙 */
			INT_OUT = 1;
			AUXR = 0x01;  /* 使能内部扩展RAM,禁止无效ALE */
			do {
				if ( CH375DiskConnect( ) == ERR_SUCCESS ) break;  /* 检查磁盘是否连接,U盘已经连接 */
				mDelaymS( 2 );  /* 等待后再查询 */
			} while ( PIN_AUTO_DEMO == 0 );  /* 自动演示状态 */
			if ( PIN_AUTO_DEMO ) {  /* 退出自动演示 */
				AUXR = 0x03;  /* 禁止内部扩展RAM,禁止无效ALE */
				EA = 1;  /* 允许中断 */
				continue;
			}
			mDelaymS( 250 );  /* 等待U盘稳定 */
			for ( RetLen = 10; RetLen != 0; RetLen -- ) {  /* 模块自动演示字节模式文件功能,向U盘中文件添加信息 */
				mDelaymS( 50 );  /* 等待后再查询 */
				status = CH375DiskReady( );  /* 查询磁盘是否准备好 */
				if ( status == ERR_SUCCESS ) break;
			}
			if ( CH375DiskStatus >= DISK_MOUNTED ) {  /* U盘已经成功加载 */
				mCopyCodeString( mCmdParam.Open.mPathName, AUTO_DEMO_FILE );
				status = CH375FileOpen( );  /* 打开文件 */
				if ( status == ERR_SUCCESS ) {  /* 文件已经存在 */
					mCmdParam.ByteLocate.mByteOffset = 0xFFFFFFFF;
					status = CH375ByteLocate( );  /* 以字节为单位移动当前文件指针,移到文件末尾以追加数据 */
				}

⌨️ 快捷键说明

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