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

📄 debug375.c

📁 本程序为CH375主机模式下读写U盘的方案
💻 C
字号:
#include <reg51.h>
//#include <stdio.h>
#include <string.h>
/*端口地址依然可用*/
unsigned char volatile xdata	CH375_CMD_PORT _at_ 0xBDF1;	/* CH375命令端口的I/O地址 */
unsigned char volatile xdata	CH375_DAT_PORT _at_ 0xBCF0;	/* CH375数据端口的I/O地址 */
sbit	CH375_INT_WIRE	=		0xB0^2;	/* P3.2, INT0, 连接CH375的INT#引脚,用于查询中断状态 */

#define  INT8  unsigned char

//外部命令
#define	CMD_RESET_ALL		0x05			/* 执行硬件复位 */
#define	CMD_CHECK_EXIST		0x06			/* 测试工作状态 */
#define CMD_SET_USB_MODE 	0x15			
#define CMD_DISK_INIT		0x51
#define CMD_GET_STATUS		0x22
#define CMD_DISK_SIZE		0x53
#define CMD_RD_USB_DATA		0x28
#define CMD_DISK_READ		0x54
#define CMD_DISK_RD_GO		0x55
#define CMD_DISK_WRITE		0x56
#define CMD_DISK_WR_GO		0x57
#define CMD_RD_USB_DATA		0x28
#define CMD_WR_USB_DATA		0x2B

//操作状态结果
#define CMD_RET_SUCCESS   0x51   //操作成功
#define CMD_RET_ABORT     0x5F   //操作失败

//中断状态结果
#define USB_INT_SUCCESS		0x14
#define USB_INT_DISK_READ	0x1D
#define USB_INT_DISK_WRITE      0x1E
//#define flash_pro(x)	{if(c==x)	flash_led2();//正确慢闪
		//else flash_led1();} //错误快闪
							

unsigned char c;	//用于返回命令状态
unsigned char xdata *pchar;
unsigned char xdata Usb_Buf[64];

/* 延时1微秒 */
void	mDelay1uS( )
{
	INT8 i;
	for ( i = 1; i != 0; i -- );
}

/* 延时2微秒*/
void	mDelay2uS( )
{
	INT8 i;
	for ( i = 2; i != 0; i -- );
}

/* 延时100毫秒*/
void	mDelay100mS( )
{
	INT8	i, j,cn;
	for ( i = 150; i != 0; i -- ) 
		for ( j = 200; j != 0; j -- )
		 cn+=3;
}




/* 向CH375命令端口写命令数据 */
void CH375_CMD_PORT_d_out( INT8 d_out )
{
	mDelay1uS( );
	CH375_CMD_PORT=d_out;
	mDelay2uS( );  /* 至少延时2uS */
	
}

/* 向CH375数据端口写数据 */
void CH375_DAT_PORT_d_out( INT8 d_out )
{
	CH375_DAT_PORT=d_out;
	mDelay1uS( );
	
	
}

INT8 CH375_DAT_PORT_in( )
{
	mDelay1uS( );
	return( CH375_DAT_PORT );
}

//快闪灯
void flash_led1()
{
	P1=0xff;	//灯灭
	mDelay100mS( );
	P1=0x00;	//灯亮
	mDelay100mS( );
}

//慢闪灯
void flash_led2()
{
	P1=0xff;	//灯灭
	mDelay100mS( );
	mDelay100mS( );
	mDelay100mS( );
	P1=0x00;	//灯亮
	mDelay100mS( );
	mDelay100mS( );
	mDelay100mS( );
}


/*******************************************************/

print_s(unsigned char *pstring,unsigned char string_len)//打印字符串,pstring为字符串首址,string_len为长度
{
	while(string_len--)
	{
	SBUF=*pstring;
	while(!TI){};
	pstring++;
	TI=0;
	}

}

/*******************************************************/
unsigned char	mWaitInterrupt( )
{
//	unsigned char c;
	while ( CH375_INT_WIRE );  /* 如果CH375的中断引脚输出高电平则等待 */
	CH375_CMD_PORT_d_out(CMD_GET_STATUS);  /* 获取当前中断状态 */
	c = CH375_DAT_PORT_in();  /* 返回中断状态 */
/*	if ( c == USB_INT_DISCONNECT )  /* 检测到USB设备断开事件 */
/*	else if ( c == USB_INT_CONNECT )  /* 检测到USB设备连接事件 */
	return( c );
}

void mCH375Reset()
{
	unsigned char xdata str_array[30]={"CH375 RESET starting...\n"};
	pchar=str_array;
	CH375_CMD_PORT_d_out(CMD_RESET_ALL);
	print_s(pchar,3);
	mDelay100mS();
}

unsigned char	mCH375Init( )//初始化375芯片,验证正确性
{
	//unsigned char c;
	unsigned char xdata str_array[30]={"CH375 initial successed!\n"};
	pchar=str_array;
	//P2=0xBC;
	//P2=0xBD;
	CH375_CMD_PORT_d_out(CMD_CHECK_EXIST);  /* 测试工作状态 */
	CH375_DAT_PORT_d_out(0x23);  /* 测试数据 */
	c = CH375_DAT_PORT_in();  /* 返回数据应该是测试数据取反 */
	if ( c == 0xdc ) 
		{  
			flash_led2();//正确慢闪
			print_s(pchar,30);
		}
	else
		{
			flash_led1();//错误快闪
			strcpy(pchar,"CH375 initial failed!\n");
			print_s(pchar,30);
		}
		//printf("the CH375Init value is",&c)
	return(c);
}

unsigned char mSetMode()	//设定工作模式为“未启用的USB主机方式”
{
	unsigned char i;
	unsigned char xdata str_array[30]={"SetMode successed!\n"};
	pchar=str_array;
	
	CH375_CMD_PORT_d_out(CMD_SET_USB_MODE);
	CH375_DAT_PORT_d_out( 0x06);
	for(i=20;i==0;i--) mDelay1uS( );
	c = CH375_DAT_PORT_in();
	if(c==CMD_RET_SUCCESS)
		{
		flash_led2();//正确慢闪
		print_s(pchar,30);
		}
	else
		{
			 flash_led1();//错误快闪
			 strcpy(pchar,"SetMod failed\n");
			 print_s(pchar,30);
		}
	return(c);
}

unsigned char mDiskInit()	//磁盘初始化
{
	unsigned char xdata str_array[30]={"Disk initial successed!\n"};
	pchar=str_array;
	CH375_CMD_PORT_d_out(CMD_DISK_INIT);
	c=mWaitInterrupt( );
	if(c==USB_INT_SUCCESS)
		{
			print_s(pchar,30);
			flash_led2();//正确慢闪
		}
	else
		{
			 flash_led1();//错误快闪
			 strcpy(pchar,"Disk initial failed!");
			 print_s(pchar,30);
		}
	//	printf("the DiskInit value is",&c)
			return(c);
}
	

unsigned char mDiskSize()	//获得磁盘容量,可与上函数作同一函数而传不同参数
{
	unsigned char len;
	unsigned char mBufferpoint;// _at_ XBYTE[0x0080];
	CH375_CMD_PORT_d_out(CMD_DISK_SIZE);
	c=mWaitInterrupt( );
	if(c==USB_INT_SUCCESS)
	{	
		CH375_CMD_PORT_d_out(CMD_RD_USB_DATA);
		len=CH375_DAT_PORT_in();
		while(len!=0)
			{mBufferpoint=CH375_DAT_PORT_in();
			 len--;
			 }
	}
	return(c);
}		


//****************************************************

void CH375_Write(unsigned char xdata *Usb_Buf_Startp,unsigned char xdata *Usb_Buf_Endp)//
{
	unsigned char count;
	unsigned char Usb_Buf_Len;
	int i;

  if ((Usb_Buf_Endp-Usb_Buf_Startp)>64)
    	{
    	Usb_Buf_Len=64;
    	}
  else
    {
    Usb_Buf_Len=Usb_Buf_Endp-Usb_Buf_Startp;
    }
    
  count=64-Usb_Buf_Len;
  CH375_CMD_PORT_d_out(CMD_WR_USB_DATA);
  CH375_DAT_PORT_d_out(Usb_Buf_Len);
  
  for (i=0;i<Usb_Buf_Len;i++)
    {
    CH375_DAT_PORT_d_out(*Usb_Buf_Startp);
    Usb_Buf_Startp++;
    }
  
  for(i=0;i<count;i++)
  	{
  		 CH375_DAT_PORT_d_out(0xff);
  		}
  		
}


unsigned char CH375_WriteUD(unsigned char xdata *pData,long LbaNo,int BytesLen)
{
	unsigned char xdata *Usb_Startp;
	unsigned char xdata *Usb_Endp;
	unsigned char SecNum;
	//unsigned char help_view=1;//串口输出,作观察数据
	unsigned char xdata str_array[30]={"Now write nd data block!/n"};
	pchar=str_array;
	
	if(BytesLen==0) return 0;
	if(BytesLen%512==0) 
		{
			SecNum=BytesLen<<9 ;
		}
	else
		{
			SecNum=((BytesLen<<9)+1);
		}
		
	CH375_CMD_PORT_d_out(CMD_DISK_WRITE);
	CH375_DAT_PORT_d_out((unsigned char)((LbaNo>>0)&0xff));
	CH375_DAT_PORT_d_out((unsigned char)((LbaNo>>8)&0xff));
	CH375_DAT_PORT_d_out((unsigned char)((LbaNo>>16)&0xff));
	CH375_DAT_PORT_d_out((unsigned char)((LbaNo>>24)&0xff));
	CH375_DAT_PORT_d_out(SecNum);

while (1)
	{ 

	switch (mWaitInterrupt( ))
		{
		case USB_INT_DISK_WRITE:
			if(BytesLen>=64)
			{
			Usb_Startp=pData;
			pData=pData+64;
			Usb_Endp=pData;
			BytesLen=BytesLen-64;
			}
			else
			{
			Usb_Startp=pData;
			pData=pData+BytesLen;
			Usb_Endp=pData;
			BytesLen=0;
			}
				print_s(pchar,30)	;
				//help_view++;						
			CH375_Write(Usb_Startp,Usb_Endp);//void CH375_Write(void)//U8* Usb_Buf_Startp;U8* Usb_Buf_Endp;
			CH375_CMD_PORT_d_out(CMD_DISK_WR_GO);
		    break;
					
		case USB_INT_SUCCESS:
			strcpy(pchar,"Write successed!\n");
			print_s(pchar,30);
			return 1;
		    break;
					
		default :
			strcpy(pchar,"Write failed!\n");
			print_s(pchar,30);
			return (0);
		    break;
		}
	}
}



/*
void CH375_Read()//unsigned char xdata* pbuffer,unsigned char Rd_DataLen//读Usb_Buf_Len长度的字符到pbuffer所指地址
{
  unsigned char Usb_Buf_Len;
  unsigned char i,count;
  unsigned char	nouse_data;//存放读无用数据
  
  
  CH375_CMD_PORT_d_out(CMD_RD_USB_DATA);
  Usb_Buf_Len=CH375_DAT_PORT_in();
 // count=64-Usb_Buf_Len;	//如果其它地方出问题,此处会出现许多bug
  if(Rd_DataLen<=Usb_Buf_Len)
  	{
  		 for (i=0;i<Rd_DataLen;i++)
  		  {
    			*pbuffer=CH375_DAT_PORT_in();
    			pbuffer++;
   			 }
   		for	(i=0;i<count;i++)
   		{
   			nouse_data=CH375_DAT_PORT_in();
   		}
   	}

  }
*/

	//*******************************************************

unsigned char CH375_ReadUD(unsigned char xdata *pData,long LbaNo,unsigned int BytesLen)
{
	//unsigned char Usb_Buf;
	unsigned char RSecNum;
	unsigned char Usb_Buf_Len;
  	unsigned char i;//,count;
//unsigned char help_view=1;//串口输出,作观察数据
	unsigned char xdata str_array[30]={"Now read the nd data block!/n "};
	pchar=str_array;
	
	if(BytesLen==0) return 0;
	if(BytesLen%512==0) 
		{
			RSecNum=BytesLen<<9 ;
		}
	else
		{
			RSecNum=((BytesLen<<9)+1);
		}
		
	CH375_CMD_PORT_d_out(CMD_DISK_READ);
	CH375_DAT_PORT_d_out((unsigned char)((LbaNo>>0)&0xff));
	CH375_DAT_PORT_d_out((unsigned char)((LbaNo>>8)&0xff));
	CH375_DAT_PORT_d_out((unsigned char)((LbaNo>>16)&0xff));
	CH375_DAT_PORT_d_out((unsigned char)((LbaNo>>24)&0xff));
	CH375_DAT_PORT_d_out(RSecNum);
	while (1)
	{ 

		switch (mWaitInterrupt( ))
			{
				case USB_INT_DISK_READ:
				
		/*		if(BytesLen>=64)
				{
				Usb_Len=64;
				BytesLen=BytesLen-64;
				}
				else
				{
				Usb_Len=BytesLen;
				BytesLen=0;
				}
				print_s(pchar,30);
				//	help_view++;	
				CH375_Read(pData,Usb_Len);
			*/
				print_s(pchar,30);
			 	CH375_CMD_PORT_d_out(CMD_RD_USB_DATA);
 				Usb_Buf_Len=CH375_DAT_PORT_in();//可加溢出检测
 					for(i=0;i<Usb_Buf_Len;i++)
 					{
 						Usb_Buf[i]= CH375_DAT_PORT_in();//需调试纠正
 				 	}
 				 	
 				 	if(BytesLen<=Usb_Buf_Len)
 				 		{
 				 			for(i=0;i<BytesLen;i++)
 				 				{
 				 					*pData=Usb_Buf[i];
 				 					pData++;
 				 				}
 				 				BytesLen=0;
 				 		}
 				 		
 				 	else
 				 		{
 				 			for(i=0;i<Usb_Buf_Len;i++)
 				 				{
 				 					*pData=Usb_Buf[i];
 				 					pData++;
 				 				}
 				 			BytesLen=BytesLen-Usb_Buf_Len;	
 				 		}		
 				  				 
				CH375_CMD_PORT_d_out(CMD_DISK_RD_GO);
				  break;				
			
			case USB_INT_SUCCESS:
				strcpy(pchar,"Read successed!\n");
				print_s(pchar,30);
				return 1;
				  break;
			
			default :
					strcpy(pchar,"Read failed!\n");
					print_s(pchar,30);
				return 0;
				  break;
			}
		}
}
//*******************************************************
void ComInit()//串口初始化,定时器方式2,串口方式1,波特率19200
{
	PCON|=0x80;
	TMOD=0x20;
	SCON=0x50;
	TH1=0xfd;
	TL1=0xfd;
	TR1=1;
	}

//*******************************************************	
	
void main()
{
	unsigned char xdata look_var[6];
	unsigned char xdata test_data1[77]={"where is your friend? reply: it's in my heart,my ideal,my memory! "};//12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcb512over"};
	unsigned char xdata test_data2[70];
	unsigned char xdata *pxout=test_data1;//指向外部RAM的指针
	unsigned char xdata *pxin=test_data2;
	ComInit();  //串口初始化
	mCH375Reset();
	look_var[0]=mCH375Init();
	look_var[1]=mSetMode();
	look_var[2]=mDiskInit();
	//look_var[3]=mDiskSize();
	look_var[3]=CH375_WriteUD(pxout,2048,70);
	look_var[4]=CH375_ReadUD(pxin,2048,70);
	//look_var[5]=look_var[4];
	print_s(test_data2,70);
	while(1);
	//ACC=c;
}

	

⌨️ 快捷键说明

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