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

📄 ch375hf1.c

📁 u盘读写模块.C51单片机与USB接口芯片对U盘进行文件读写,支持FAT8,FAT16和FAT32磁盘格式.
💻 C
📖 第 1 页 / 共 5 页
字号:
			TI = 0;
			SBUF = mModeBigEndian ? (UINT8)back : (UINT8)( back >> 8 );
			while ( TI == 0 );
#ifdef	WATCHDOG_TIMEOUT
			WDT = 1;  /* 清除看门狗计时 */
#endif
			return;
		}
		SBUF = USB_INT_DISK_READ;  /* 操作状态码: 请求读取数据 */
		mBuffer[0] = CH375_DAT_PORT;  /* 00H */
		mBuffer[1] = CH375_DAT_PORT;  /* 从CH375取出数据暂存到串口数据收发缓冲区再发送 */
		mBuffer[2] = CH375_DAT_PORT;
		mBuffer[3] = CH375_DAT_PORT;
		mBuffer[4] = CH375_DAT_PORT;
		mBuffer[5] = CH375_DAT_PORT;
		mBuffer[6] = CH375_DAT_PORT;
		mBuffer[7] = CH375_DAT_PORT;
		mBuffer[8] = CH375_DAT_PORT;
		mBuffer[9] = CH375_DAT_PORT;
		mBuffer[10] = CH375_DAT_PORT;
		mBuffer[11] = CH375_DAT_PORT;
		mBuffer[12] = CH375_DAT_PORT;
		mBuffer[13] = CH375_DAT_PORT;
		mBuffer[14] = CH375_DAT_PORT;
		mBuffer[15] = CH375_DAT_PORT;
		mBuffer[16] = CH375_DAT_PORT;  /* 10H */
		mBuffer[17] = CH375_DAT_PORT;
		mBuffer[18] = CH375_DAT_PORT;
		mBuffer[19] = CH375_DAT_PORT;
		mBuffer[20] = CH375_DAT_PORT;
		mBuffer[21] = CH375_DAT_PORT;
		mBuffer[22] = CH375_DAT_PORT;
		mBuffer[23] = CH375_DAT_PORT;
		mBuffer[24] = CH375_DAT_PORT;
		mBuffer[25] = CH375_DAT_PORT;
		mBuffer[26] = CH375_DAT_PORT;
		mBuffer[27] = CH375_DAT_PORT;
		mBuffer[28] = CH375_DAT_PORT;
		mBuffer[29] = CH375_DAT_PORT;
		mBuffer[30] = CH375_DAT_PORT;
		mBuffer[31] = CH375_DAT_PORT;
		mBuffer[32] = CH375_DAT_PORT;  /* 20H */
		mBuffer[33] = CH375_DAT_PORT;
		mBuffer[34] = CH375_DAT_PORT;
		mBuffer[35] = CH375_DAT_PORT;
		mBuffer[36] = CH375_DAT_PORT;
		mBuffer[37] = CH375_DAT_PORT;
		mBuffer[38] = CH375_DAT_PORT;
		mBuffer[39] = CH375_DAT_PORT;
		mBuffer[40] = CH375_DAT_PORT;
		mBuffer[41] = CH375_DAT_PORT;
		mBuffer[42] = CH375_DAT_PORT;
		mBuffer[43] = CH375_DAT_PORT;
		mBuffer[44] = CH375_DAT_PORT;
		mBuffer[45] = CH375_DAT_PORT;
		mBuffer[46] = CH375_DAT_PORT;
		mBuffer[47] = CH375_DAT_PORT;
		mBuffer[48] = CH375_DAT_PORT;  /* 30H */
		mBuffer[49] = CH375_DAT_PORT;
		mBuffer[50] = CH375_DAT_PORT;
		mBuffer[51] = CH375_DAT_PORT;
		mBuffer[52] = CH375_DAT_PORT;
		mBuffer[53] = CH375_DAT_PORT;
		mBuffer[54] = CH375_DAT_PORT;
		mBuffer[55] = CH375_DAT_PORT;
		mBuffer[56] = CH375_DAT_PORT;
		mBuffer[57] = CH375_DAT_PORT;
		mBuffer[58] = CH375_DAT_PORT;
		mBuffer[59] = CH375_DAT_PORT;
		mBuffer[60] = CH375_DAT_PORT;
		mBuffer[61] = CH375_DAT_PORT;
		mBuffer[62] = CH375_DAT_PORT;
		mBuffer[63] = CH375_DAT_PORT;  /* 3FH */
		while ( TI == 0 );  /* 等待状态码发送完成 */
		INT_OUT = 1;
		for ( count = 0; count != 64; count ++ ) {  /* 通过串口输出64字节数据 */
			TI = 0;
			SBUF = mBuffer[ count ];  /* 输出数据 */
			while ( TI == 0 );
		}
#ifdef	WATCHDOG_TIMEOUT
		WDT = 1;  /* 清除看门狗计时 */
#endif
}

/* 该子程序由CH375的子程序库调用,用于从外部缓冲区读取文件数据到CH375,被CH375FileWriteX调用 */
void xReadFromExtBuf( UINT8 mLength )
{
	UINT8	fill, count;
	PUINT8I	SerBuf;
	UINT16	back;
		INT_OUT = 0;  /* 输出中断请求 */
		TI = 0;
		if ( mLength == 0 ) {  /* 重试 */
			SBUF = USB_INT_DISK_RETRY;  /* 操作状态码: 重试 */
			while ( TI == 0 );  /* 等待状态码发送完成 */
			INT_OUT = 1;
			back = 0 - (UINT16)mCmdParam.WriteX.mDataBuffer;
			mCmdParam.WriteX.mDataBuffer = 0;
			TI = 0;
			SBUF = mModeBigEndian ? (UINT8)( back >> 8 ) : (UINT8)back;
			while ( TI == 0 );
			TI = 0;
			SBUF = mModeBigEndian ? (UINT8)back : (UINT8)( back >> 8 );
			while ( TI == 0 );
#ifdef	WATCHDOG_TIMEOUT
			WDT = 1;  /* 清除看门狗计时 */
#endif
			return;
		}
		SBUF = USB_INT_DISK_WRITE;  /* 操作状态码: 请求写入数据 */
		RI = 0;
		fill = 64;
		count = CH375_MAX_DATA_LEN;
		while ( TI == 0 ) {  /* 等待状态码发送完成 */
			CH375_DAT_PORT = ACC;  /* 因为串口数据接收较慢,为避免CH375等待而导致U盘挂起,必须先用任意数据结束写数据命令 */
			fill --;
			if ( TI == 0 ) {
				CH375_DAT_PORT = ACC;  /* 用任意数据结束写数据命令 */
				fill --;
				if ( TI == 0 ) {
					CH375_DAT_PORT = ACC;  /* 用任意数据结束写数据命令 */
					fill --;
					if ( TI == 0 ) {
						CH375_DAT_PORT = ACC;  /* 用任意数据结束写数据命令 */
						fill --;
						if ( fill == 0 ) {  /* 写数据命令填充完成 */
							while ( TI == 0 );
							break;
						}
					}
					else break;
				}
				else break;
			}
			else break;
		}
		INT_OUT = 1;
		SerBuf = mBuffer;
		do {  /* 通过串口输入64字节数据 */
			if ( RI == 0 ) {
				do {
					if ( fill ) {  /* 填充写数据命令 */
						CH375_DAT_PORT = ACC;  /* 用任意数据结束写数据命令 */
						fill --;
					}
				} while ( RI == 0 );
			}
			*SerBuf = SBUF;  /* 输入数据 */
			RI = 0;
			SerBuf ++;
		} while ( -- count );
		if ( fill ) {  /* 写数据命令尚未结束 */
			do {
				CH375_DAT_PORT = ACC;  /* 用任意数据结束写数据命令 */
			} while ( -- fill );
		}
		RI = 0;  /* 至少延时2uS */
		CH375_CMD_PORT = CMD_WR_USB_DATA7;  /* 向USB端点2的发送缓冲区写入数据块 */
		if ( TI ) TI = 0;  /* 至少延时2uS */
		CH375_DAT_PORT = CH375_MAX_DATA_LEN;  /* 后续数据的长度 */
		CH375_DAT_PORT = mBuffer[0];  /* 00H */
		CH375_DAT_PORT = mBuffer[1];  /* 将暂存在串口数据收发缓冲区中的数据写给CH375 */
		CH375_DAT_PORT = mBuffer[2];
		CH375_DAT_PORT = mBuffer[3];
		CH375_DAT_PORT = mBuffer[4];
		CH375_DAT_PORT = mBuffer[5];
		CH375_DAT_PORT = mBuffer[6];
		CH375_DAT_PORT = mBuffer[7];
		CH375_DAT_PORT = mBuffer[8];
		CH375_DAT_PORT = mBuffer[9];
		CH375_DAT_PORT = mBuffer[10];
		CH375_DAT_PORT = mBuffer[11];
		CH375_DAT_PORT = mBuffer[12];
		CH375_DAT_PORT = mBuffer[13];
		CH375_DAT_PORT = mBuffer[14];
		CH375_DAT_PORT = mBuffer[15];
		CH375_DAT_PORT = mBuffer[16];  /* 10H */
		CH375_DAT_PORT = mBuffer[17];
		CH375_DAT_PORT = mBuffer[18];
		CH375_DAT_PORT = mBuffer[19];
		CH375_DAT_PORT = mBuffer[20];
		CH375_DAT_PORT = mBuffer[21];
		CH375_DAT_PORT = mBuffer[22];
		CH375_DAT_PORT = mBuffer[23];
		CH375_DAT_PORT = mBuffer[24];
		CH375_DAT_PORT = mBuffer[25];
		CH375_DAT_PORT = mBuffer[26];
		CH375_DAT_PORT = mBuffer[27];
		CH375_DAT_PORT = mBuffer[28];
		CH375_DAT_PORT = mBuffer[29];
		CH375_DAT_PORT = mBuffer[30];
		CH375_DAT_PORT = mBuffer[31];
		CH375_DAT_PORT = mBuffer[32];  /* 20H */
		CH375_DAT_PORT = mBuffer[33];
		CH375_DAT_PORT = mBuffer[34];
		CH375_DAT_PORT = mBuffer[35];
		CH375_DAT_PORT = mBuffer[36];
		CH375_DAT_PORT = mBuffer[37];
		CH375_DAT_PORT = mBuffer[38];
		CH375_DAT_PORT = mBuffer[39];
		CH375_DAT_PORT = mBuffer[40];
		CH375_DAT_PORT = mBuffer[41];
		CH375_DAT_PORT = mBuffer[42];
		CH375_DAT_PORT = mBuffer[43];
		CH375_DAT_PORT = mBuffer[44];
		CH375_DAT_PORT = mBuffer[45];
		CH375_DAT_PORT = mBuffer[46];
		CH375_DAT_PORT = mBuffer[47];
		CH375_DAT_PORT = mBuffer[48];  /* 30H */
		CH375_DAT_PORT = mBuffer[49];
		CH375_DAT_PORT = mBuffer[50];
		CH375_DAT_PORT = mBuffer[51];
		CH375_DAT_PORT = mBuffer[52];
		CH375_DAT_PORT = mBuffer[53];
		CH375_DAT_PORT = mBuffer[54];
		CH375_DAT_PORT = mBuffer[55];
		CH375_DAT_PORT = mBuffer[56];
		CH375_DAT_PORT = mBuffer[57];
		CH375_DAT_PORT = mBuffer[58];
		CH375_DAT_PORT = mBuffer[59];
		CH375_DAT_PORT = mBuffer[60];
		CH375_DAT_PORT = mBuffer[61];
		CH375_DAT_PORT = mBuffer[62];
		CH375_DAT_PORT = mBuffer[63];  /* 3FH */
		RI = 0;
#ifdef	WATCHDOG_TIMEOUT
		WDT = 1;  /* 清除看门狗计时 */
#endif
}

/* 至少延时2uS */
void	mDelay2uS( )
{
	_nop_( );
}

/* 向CH375写入命令码 */
void	mWriteCmdCH375( UINT8 iCmd )
{
	CH375_CMD_PORT = iCmd;
	_nop_( );
	_nop_( );
	_nop_( );
}

/* 以毫秒为单位延时 */
void	mDelaymS( UINT8 iDelay )
{
	UINT8	i, j;
#ifdef	WATCHDOG_TIMEOUT
	WDT = 1;  /* 清除看门狗计时 */
#endif
	for ( i = iDelay; i != 0; i -- ) {
		j = 0;
		do {
			_nop_( );  /* 每循环周期为3个机器周期,时间为0.651uS*3 */
		} while ( -- j );  /* 在18.432MHz时钟下延时500uS */
		j = 0;
		do {
			_nop_( );
		} while ( -- j );  /* 在18.432MHz时钟下延时500uS */
	}
#ifdef	WATCHDOG_TIMEOUT
	WDT = 1;  /* 清除看门狗计时 */
#endif
}

/* USB主机模式: 查询CH375是否请求中断 */
UINT8	mQueryCH375( )
{
	UINT8	status;
	if ( CH375_INT_WIRE == 0 ) {  /* 如果CH375的中断引脚输出低电平 */
		_nop_( );
		CH375_CMD_PORT = CMD_GET_STATUS;  /* 获取当前中断状态 */
		_nop_( ); _nop_( ); _nop_( ); _nop_( ); _nop_( );  /* 至少延时2uS */
		CH375IntStatus = CH375_DAT_PORT;  /* 获取中断状态 */
		if ( CH375IntStatus == USB_INT_CONNECT || CH375IntStatus == USB_INT_DISCONNECT ) {  /* 检测到USB设备连接或者断开事件 */
			mDelaymS( 50 );  /* USB设备刚刚连接或者断开,延时等待50毫秒 */
			if ( CH375_INT_WIRE == 0 ) {  /* 如果CH375的中断引脚输出低电平 */
				_nop_( );
				CH375_CMD_PORT = CMD_GET_STATUS;  /* 获取当前中断状态 */
				_nop_( ); _nop_( ); _nop_( ); _nop_( ); _nop_( );  /* 至少延时2uS */
				CH375IntStatus = CH375_DAT_PORT;  /* 获取中断状态 */
			}
		}
		if ( CH375IntStatus == USB_INT_DISCONNECT ) {  /* 检测到USB设备断开事件 */
			CH375DiskStatus = DISK_DISCONNECT;
			status = ERR_DISK_DISCON;
		}
		else if ( CH375IntStatus == USB_INT_CONNECT ) {  /* 检测到USB设备连接事件 */
			CH375DiskStatus = DISK_CONNECT;
			status = ERR_USB_CONNECT;
		}
		else {
			CH375DiskStatus = DISK_UNKNOWN;
			status = ERR_CH375_ERROR;  /* CH375硬件错误,可能需要复位CH375 */
		}
	}
	else status = ERR_SUCCESS;
	return( status );
}

/* USB设备模式: 查询CH375是否请求中断 */
UINT8	mQueryCH375Device( )
{
	UINT8	status;
	if ( CH375_INT_WIRE == 0 ) {  /* 如果CH375的中断引脚输出低电平 */
		_nop_( );

⌨️ 快捷键说明

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