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

📄 ch375h.c

📁 USB 1.1 U Device for CH375 & USB 2.0 for CH375A 读写usb超精简的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#if UseCH375LIB == 1 
//=================================================================================================
// 中断状态查询处理子程序 
//=================================================================================================
// 
#ifdef NO_DEFAULT_CH375_INT 
// 在应用程序中定义 NO_DEFAULT_CH375_INT 可以禁止默认的中断处理程序,然后用自行编写的程序代替它 
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
#if LIB_CFG_INT_EN == 0					
// CH375的INT#引脚连接方式为"查询方式" 
//-------------------------------------------------------------------------------------------------
// 查询 CH375 中断并更新中断状态 
void xQueryInterrupt( void )			
{
	while ( CH375_INT_WIRE );  // 如果CH375的中断引脚输出高电平则等待 
//	if( !CH375_INT_WIRE )      // 中断请求 
//	{
		xWriteCH375Cmd( CMD_GET_STATUS );        // 获取当前中断状态 
		CH375IntStatus &= 0x80; if ( CH375IntStatus ) CH375IntStatus = 0;  // 操作无意义,用于至少延时2uS 
		CH375IntStatus = xReadCH375Data( );      // 获取中断状态 
		if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT; // 检测到USB设备断开事件 
		else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT;  // 检测到USB设备连接事件 
//	}
}

//-------------------------------------------------------------------------------------------------
#else 
// LIB_CFG_INT_EN != 0, CH375的INT#引脚连接方式为"中断方式" 									
//-------------------------------------------------------------------------------------------------
// 查询中断状态,等待硬件中断 
void xQueryInterrupt( void )			
{
	while ( CH375IntStatus == 0 );		// 子程序库调用该子程序之前CH375IntStatus=0,硬件中断后,由中断服务程序置为非0的实际中断状态后返回 
}

// CH375中断服务程序,由CH375的INT#的低电平或者下降沿触发单片机中断 
void CH375Interrupt( void ) interrupt CH375_INT_NO 
{
	CH375_CMD_PORT = CMD_GET_STATUS;        // 获取中断状态并取消中断请求 
	CH375IntStatus &= 0x80; if ( CH375IntStatus ) CH375IntStatus = 0;  // 操作无意义,用于至少延时2uS 
	CH375IntStatus = CH375_DAT_PORT;        // 获取中断状态 
	if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT;  // 检测到USB设备断开事件 
	else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT;   // 检测到USB设备连接事件 
#ifdef CLEAR_INT_MARK
	CLEAR_INT_MARK( );                      // 某些单片机需要由软件清除中断标志 
#endif
}
#endif

//-------------------------------------------------------------------------------------------------
#endif

//=================================================================================================
// 用于从CH375读取文件数据到外部缓冲区子程序 
// 用于从外部缓冲区读取文件数据到CH375子程序 
//=================================================================================================
// 
#if LIB_CFG_FILE_IO == 0				
// 文件读写的数据的复制方式为"外部子程序" 
//-------------------------------------------------------------------------------------------------
// 
#ifndef LIB_CFG_FILE_IO_DEFAULT	
// 如果应用程序中定义该值则使用默认"外部子程序",否则应该自行编写程序代替 
//-------------------------------------------------------------------------------------------------
// 
unsigned char xdata *current_buffer;	// 保存文件数据读写时的缓冲区的当前指针,由应用程序在调用CH375FileReadX和CH375FileWriteX子程序前设置初值 

// 该子程序由CH375的子程序库调用,用于从CH375读取文件数据到外部缓冲区,被CH375FileReadX调用 
void xWriteToExtBuf( UINT8 mLength )	
{
//	if ( (UINT16)current_buffer + mLength >= (UINT16)&FILE_DATA_BUF + sizeof( FILE_DATA_BUF ) ) return;  // 防止缓冲区溢出 
	if ( mLength ) 
	{
		do // 根据长度读取数据,实际上长度总是CH375_MAX_DATA_LEN,也就是64 
		{  
			*current_buffer = CH375_DAT_PORT;  // 读出数据并保存,可以用这种方式将文件数据保存到单片机的各种串行存储器中 
			current_buffer ++;
		} while ( -- mLength );
	}    // 复制上述数据的总时间不得超过2mS 
	else // 重试,恢复缓冲区起址,如果将文件数据读写的缓冲区的当前指针放在mCmdParam.ReadX.mDataBuffer中则会被自动恢复,无需下面的两行程序 
	{  
		current_buffer += (UINT16)mCmdParam.ReadX.mDataBuffer;  // mDataBuffer中为负值 
		mCmdParam.ReadX.mDataBuffer = 0;  // 为了支持重试,在调用CH375FileReadX之前也应该清0 
	}
}

#ifdef EN_DISK_WRITE
//-------------------------------------------------------------------------------------------------
// 该子程序由CH375的子程序库调用,用于从外部缓冲区读取文件数据到CH375,被CH375FileWriteX调用 
void xReadFromExtBuf( UINT8 mLength )	
{
	if ( mLength ) 
	{
		do // 根据长度写入数据,实际上长度总是CH375_MAX_DATA_LEN,也就是64 
		{  
			CH375_DAT_PORT = *current_buffer;  // 将数据写入,可以用这种方式从单片机的各种串行存储器中取出文件数据 
			current_buffer ++;
		} while ( -- mLength );
	}    // 复制上述数据的总时间不得超过2mS 
	else // 重试,恢复缓冲区起址,如果将文件数据读写的缓冲区的当前指针放在mCmdParam.WriteX.mDataBuffer中则会被自动恢复,无需下面的两行程序 
	{  
		current_buffer += (UINT16)mCmdParam.WriteX.mDataBuffer;  // mDataBuffer中为负值 
		mCmdParam.WriteX.mDataBuffer = 0;  // 为了支持重试,在调用CH375FileWriteX之前也应该清0 
	}
}
#endif

#endif

//-------------------------------------------------------------------------------------------------
#endif

//----------------------------------------------------------------------------------------------------------------
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//----------------------------------------------------------------------------------------------------------------

//****************************************************************************************************************
//----------------------------------------------------------------------------------------------------------------
// 自行编写的子程序, 以供外界调用 
//----------------------------------------------------------------------------------------------------------------
//****************************************************************************************************************
// 
//-------------------------------------------------------------------------------------------------
// MCU = 单片机 
#if MCUMode == 0 
//-------------------------------------------------------------------------------------------------
// 将程序空间的字符串复制到内部RAM中,返回字符串长度 
UINT8 mCopyCodeStringToIRAM( UINT8 idata *iDestination, UINT8 code *iSource )
{
	UINT8	i = 0;

	while ( *iDestination = *iSource ) 
	{
		iDestination ++;
		iSource ++;
		i ++;
	}
	return( i );
}

//-------------------------------------------------------------------------------------------------
// 将程序空间的字符串复制到内部RAM中,返回字符串长度 
UINT8 mCopyCodeStringToIRAM1( UINT8 idata *iDestination, UINT8 xdata *iSource )
{
	UINT8	i = 0;

	while ( *iDestination = *iSource ) 
	{
		iDestination ++;
		iSource ++;
		i ++;
	}
	return( i );
}

//-------------------------------------------------------------------------------------------------
// 将程序空间的字符串复制到内部RAM中,返回字符串长度 
UINT8 mCopyCodeStringToXRAM( UINT8 xdata *iDestination, UINT8 code *iSource )
{
	UINT8	i = 0;

	while ( *iDestination = *iSource ) 
	{
		iDestination ++;
		iSource ++;
		i ++;
	}
	return( i );
}

#endif 
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
#endif

//-------------------------------------------------------------------------------------------------
// 如果错误则停止运行并显示错误状态 
void mStopIfError( UINT8 iErrCode ) 
{
	if ( iErrCode == 0 ) return;

	while( 1 )
	{
	    flash_led( );  // CH375出错 
	}
//	printf( "Error status, %02X\n", (UINT16)iErrCode );
}


⌨️ 快捷键说明

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