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

📄 usb5.c

📁 这是一个有关USB接口中传输数据的C语言源代码,对于通信方面的设计有很大的帮助
💻 C
📖 第 1 页 / 共 2 页
字号:
 }

  
 UINT8 ch375_init(UINT8 mode)
{
	 UINT8 i, k;
	 
     /* 测试CH375是否正常工作 */
	 for( k=100; k!=0; k-- )
	   {
		 xWriteCH375Cmd(CMD_CHECK_EXIST) ;  /* 测试CH375是否正常工作 */
		 delay2us(1);
		 xWriteCH375Data(0x0f); /* 写入测试数据 */
	     /* 返回数据应该是测试数据取反 */
		 delay2us(1);
		 i=xReadCH375Data();
	     if ( 0xf0!= i)   /* CH375不正常 */
	    {
		    for ( i=5; i!=0; i-- )
			  xWriteCH375Cmd(CMD_RESET_ALL);  /* 多次重复发命令,执行硬件复位 */
			
             delayms(50);  /* 延时50ms */
	    }
		else
        break;
	 }    if( k==0 )
       return 0;
	   /* 设置USB工作模式, 必要操作 */
        set_usb_mode( 6 ); /*已启用的主机方式并且自动产生SOF  */
     return set_usb_mode(mode); //内部固件模式
  }
 
   UINT8 	CH375LibInit( void )  /* 初始化CH375程序库和CH375芯片,操作成功返回0 */
{
	CH375LibConfig = LIB_CFG_VALUE;  /* CH375程序库配置值 */
	DISK_BASE_BUF[0] = 0;  /* 该操作无意义,只是为了防止编译器优化时不产生DISK_BASE_BUF缓冲区 */
	if ( CH375GetVer( ) < CH375_LIB_VER ) return( 0xFF );  /* 获取当前子程序库的版本号,版本太低则返回错误 */
	return( CH375Init( ) );  /* 初始化CH375 */
}
 
 


/* 检查操作状态,如果错误则显示错误代码并停机 */
void	mStopIfError( UINT8 iError )
{
	if ( iError == ERR_SUCCESS ) return;  /* 操作成功 */
	printf( "Error: %02X\n", (UINT16)iError );  /* 显示错误 */
	
}

#ifndef NO_DEFAULT_CH375_INT			/* 在应用程序中定义NO_DEFAULT_CH375_INT可以禁止默认的中断处理程序,然后用自行编写的程序代替它 */
#if LIB_CFG_INT_EN == 0					/* CH375的INT#引脚连接方式为"查询方式" */
void xQueryInterrupt( void )			/* 查询CH375中断并更新中断状态 */
{
	while ( PINE&0x10 );  /* 如果CH375的中断引脚输出高电平则等待 */
	xWriteCH375Cmd( CMD_GET_STATUS );  /* 获取当前中断状态,发出命令后至少延时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的实际中断状态后返回 */
}
void	CH375Interrupt( void ) __attribute__ ((signal));
void	CH375Interrupt( void )			/* CH375中断服务程序,由CH375的INT#的低电平或者下降沿触发单片机中断 */
{
	xWriteCH375Cmd( CMD_GET_STATUS );  /* 获取中断状态并取消中断请求 */
	CH375IntStatus = xReadCH375Data( );  /* 获取中断状态 */
	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

 UINT8 waitint(void)
{ 
  while(PINE&0x10);
  xWriteCH375Cmd(CMD_GET_STATUS);
  delay2us(2);
  
  return xReadCH375Data( );
  
}
 
   UINT8  CH375DiskReady(void ) 
   {
    xWriteCH375Cmd(CMD_DiskReady);
    delay2us(2);
    return xReadCH375Data( );
   }

   
   UINT8 InitDisk(void)
 { 
     UINT8    i,Status;
     xWriteCH375Cmd( CMD_GET_STATUS );  /* 获取当前中断状态,发出命令后至少延时2uS */
	 delay2us(1);
	 Status = xReadCH375Data( );  /* 获取中断状态 */
     if (Status==USB_INT_DISCONNECT) return Status;/*usb断开 */
     delay2us(10);
     /* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */
	 for ( i = 0; i < 10; i ++ ) {  /* 有的U盘总是返回未准备好,不过可以被忽略 */
	 delayms( 100) ;
			
	 if ( CH375DiskReady( ) == USB_INT_SUCCESS ) break;  /* 查询磁盘是否准备好 */
		}
     xWriteCH375Cmd(CMD_DISK_INIT);          /*u盘初始化*/
     Status=waitint(  );
     if (Status!=USB_INT_SUCCESS) return Status;
     xWriteCH375Cmd(CMD_DISK_SIZE);        /* 主机方式: 获取USB存储器的容量 */
     Status=waitint(  );
     if (Status!=USB_INT_SUCCESS) 
     {
      delayms(250);
	  xWriteCH375Cmd(CMD_DISK_SIZE);
      Status=waitint(  );   
     }
     if (Status!=USB_INT_SUCCESS) return Status;
	 return 1;/*u盘初始化成功  */
 }
 
    UINT8  CH375FileOpen( )
	{xWriteCH375Cmd(CMD_FileOpen);
	 delay2us(2);
	 return xReadCH375Data( );
	}
   
   
  int main(void )
 {
    UINT8 i,  c;
	UINT8	*pCodeStr;
	UINT16	TotalCount;

	port_init();
	CH375_port_init();
	init_devices();
    delay2us(10);
	CH375LibInit(  ) 
    c=ch375_init(6);
	while(c!=1)
	{for( i=5; i!=0; i-- )
	   c=ch375_init(6);
	   delayms(50);  /* 延时50ms */
	}
  
while ( 1 )
      {
//		while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( );  /* 查询CH375中断并更新中断状态,等待U盘插入 */
		while ( CH375DiskStatus < DISK_CONNECT ) 
		{  /* 查询CH375中断并更新中断状态,等待U盘插入 */
			if ( CH375DiskConnect( ) == ERR_SUCCESS ) break;  /* 有设备连接则返回成功,CH375DiskConnect同时会更新全局变量CH375DiskStatus */
             delayms(100);
		}
		
		 delayms(200);;  /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */
		  }
		
   InitDisk(); /*u盘初始化*/
   
   /* 读取原文件 */
	printf( "Open\n" );
	strcpy(CMD_PARAM.Open.mPathName, "/C51/CH375HFT.C" );  /* 文件名,该文件在C51子目录下 */
		 i = CH375FileOpen( );  /* 打开文件 */
		 if ( i == ERR_MISS_DIR || i == ERR_MISS_FILE ) {  /* 没有找到文件 */
/* 列出文件 */
			if ( i == ERR_MISS_DIR ) pCodeStr = (UINT8 *)"/*";  /* C51子目录不存在则列出根目录下的文件 */
			else pCodeStr = (UINT8 *)"/C51/CH375*";  /* CH375HFT.C文件不存在则列出\C51子目录下的以CH375开头的文件 */
			printf( "List file %s\n", pCodeStr );
			for ( c = 0; c < 254; c ++ ) {  /* 最多搜索前254个文件 */
				strcpy( (char *)CMD_PARAM.Open.mPathName, (char *)pCodeStr );  /* 搜索文件名,*为通配符,适用于所有文件或者子目录 */
				i = strlen( (char *)CMD_PARAM.Open.mPathName );  /* 计算文件名长度,以处理文件名结束符 */
				CMD_PARAM.Open.mPathName[ i ] = c;  /* 根据字符串长度将结束符替换为搜索的序号,从0到255 */
				i = CH375FileOpen( );  /* 打开文件,如果文件名中含有通配符*,则为搜索文件而不打开 */
				if ( i == ERR_MISS_FILE ) break;  /* 再也搜索不到匹配的文件,已经没有匹配的文件名 */
				if ( i == ERR_FOUND_NAME ) {  /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中 */
					printf( "  match file %03d#: %s\n", (unsigned int)c, CMD_PARAM.Open.mPathName );  /* 显示序号和搜索到的匹配文件名或者子目录名 */
					continue;  /* 继续搜索下一个匹配的文件名,下次搜索时序号会加1 */
				}
				else {  /* 出错 */
					mStopIfError( i );
					break;
				}
			}
		}
		else {  /* 找到文件或者出错 */
			mStopIfError( i );
			TotalCount = 600;  /* 准备读取总长度 */
			printf( "从文件中读出的前%d个字符是:\n",TotalCount );
			while ( TotalCount ) {  /* 如果文件比较大,一次读不完,可以再调用CH375ByteRead继续读取,文件指针自动向后移动 */
				if ( TotalCount > MAX_BYTE_IO ) c = MAX_BYTE_IO;  /* 剩余数据较多,限制单次读写的长度不能超过 sizeof( mCmdParam.ByteRead.mByteBuffer ) */
				else c = TotalCount;  /* 最后剩余的字节数 */
				CMD_PARAM.ByteRead.mByteCount = c;  /* 请求读出几十字节数据 */
				i = CH375ByteRead( );  /* 以字节为单位读取数据块,单次读写的长度不能超过MAX_BYTE_IO,第二次调用时接着刚才的向后读 */
				mStopIfError( i );
				TotalCount -=CMD_PARAM.ByteRead.mByteCount;  /* 计数,减去当前实际已经读出的字符数 */
				for ( i=0; i!=CMD_PARAM.ByteRead.mByteCount; i++ )  {printf( "%c", CMD_PARAM.ByteRead.mByteBuffer[i] ); } /* 显示读出的字符 */
				if ( CMD_PARAM.ByteRead.mByteCount < c ) {  /* 实际读出的字符数少于要求读出的字符数,说明已经到文件的结尾 */
					printf( "\n" );
					printf( "文件已经结束\n" );
					break;
				}
 
           }
       }
	   
	  /* 从U 盘读取多个扇区的数据块到缓冲区,可以读写U 盘中的任意位置的数据 */
UINT8  mReadSector( UINT32 iLbaStart, UINT8  iSectorCount ) 
{
/* iLbaStart 是准备读取的线性起始扇区号LBA, iSectorCount 是准备读取的扇区数 */
 UINT8 mIntStatus;
 UINT8 *mBufferPoint;
 UINT16 mBlockCount;
 UINT8 mLength;
xWriteCH375Cmd( CMD_DISK_READ ); /* 从USB 存储器读数据块 */
xWriteCH375Data( (UINT8)iLbaStart ); /* LBA 的最低8 位 */
xWriteCH375Data( (UINT8)( iLbaStart >> 8 ) );
xWriteCH375Data( (UINT8)( iLbaStart >> 16 ) );
xWriteCH375Data( (UINT8)( iLbaStart >> 24 ) ); /* LBA 的最高8 位 */
xWriteCH375Data( iSectorCount ); /* 扇区数 */
mBufferPoint = &DATA_BUFFER; /* 指向缓冲区起始地址 */
for ( mBlockCount=iSectorCount*8; mBlockCount!=0; mBlockCount-- ){ /* 数据块计数 */
mIntStatus = waitint( ); /* 等待中断并获取状态 */
if ( mIntStatus == USB_INT_DISK_READ ) { /* USB 存储器读数据块,请求数据读出 */
xWriteCH375Cmd( CMD_RD_USB_DATA ); /* 从CH375 缓冲区读取数据块 */
mLength = CH375_RD_DAT_PORT( ); /* 后续数据的长度 */
while ( mLength -- ) { /* 根据长度读取数据 */
*mBufferPoint = xReadCH375Data( ); /* 读出数据并保存 */
mBufferPoint ++;
}
xWriteCH375Data( CMD_DISK_RD_GO ); /* 继续执行USB 存储器的读操作 */
}
else break; /* 返回错误状态 */
}
if ( mBlockCount == 0 ) { /* 数据传输完成 */
mIntStatus =waitint( ); /* 等待中断并获取状态 */
if ( mIntStatus == USB_INT_SUCCESS ) return( 0 ); /* 操作成功 */
}
return( mIntStatus ); /* 操作失败 */
} 
	   
 }
 
 
 

⌨️ 快捷键说明

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