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

📄 ch375ev0.c

📁 使用ATMEGA128加CH375对U盘扇区进行读写,本程序在ICCAVR上调试,并在相应硬件电路上调试通过!供参考用
💻 C
📖 第 1 页 / 共 2 页
字号:
					{
				     ShowNumber(j,160+col, DATA_BUFFER[mLength]);  //显示
				     j+=4;
				     if(j>37)
					    {
						     j=0;
					       col+=16;
				      }
				  }
				mLength--;
				mBufferPoint++;
			}
			CH375_WR_CMD_PORT( CMD_DISK_RD_GO );  /* 继续执行USB存储器的读操作 */
		}
		else break;  /* 返回错误状态 */
	}
	if ( mBlockCount == 0 ) {
		mIntStatus = mWaitInterrupt( );  /* 等待中断并获取状态 */
		if ( mIntStatus == USB_INT_SUCCESS ) return( 0 );  /* 操作成功 */
	}
//	if ( mIntStatus == USB_INT_DISCONNECT ) return( mIntStatus );  /* U盘断开 */
	mClearError( );  /* 清除U盘错误以便重试 */
	return( mIntStatus );  /* 操作失败 */
}

/* 将缓冲区中的多个扇区的数据块写入U盘 */
unsigned char	mWriteSector( unsigned long iLbaStart, unsigned char iSectorCount )
/* iLbaStart 是写入的线起始性扇区号, iSectorCount 是写入的扇区数 */
{
	unsigned char mIntStatus;
	unsigned char *mBufferPoint;
	unsigned int  mBlockCount,j=0,col=0;
	unsigned char mLength;
	CH375_WR_CMD_PORT( CMD_DISK_WRITE );  /* 向USB存储器写数据块 */
	CH375_WR_DAT_PORT( (unsigned char)iLbaStart );  /* LBA的最低8位 */
	CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 8 ) );
	CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 16 ) );
	CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 24 ) );  /* LBA的最高8位 */
	CH375_WR_DAT_PORT( iSectorCount );  /* 扇区数 */
	mBufferPoint = DATA_BUFFER;  /* 指向缓冲区起始地址 */
	for ( mBlockCount = iSectorCount * BlockPerSector; mBlockCount != 0; mBlockCount -- ) {  /* 数据块计数 */
		mIntStatus = mWaitInterrupt( );  /* 等待中断并获取状态 */
		if ( mIntStatus == USB_INT_DISK_WRITE ) {  /* USB存储器写数据块,请求数据写入 */
			CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 );  /* 向CH375缓冲区写入数据块 */
			mLength = CH375_BLOCK_SIZE;
			CH375_WR_DAT_PORT( mLength );  /* 后续数据的长度 */
		  while ( mLength ) {  //根据长度写入数据 
				CH375_WR_DAT_PORT( DATA_BUFFER[mLength]); // 将数据写入 
			/*	if( 160+col < 240 )
					{
				     ShowNumber(j,160+col,*mBufferPoint);  //显示  *mBufferPoint
				     j+=4;
				     if(j>37)
					    {
						     j=0;
					       col+=16;
				      }
				  }*/
				mBufferPoint++;
				mLength--;
			}
		/*	do { //对于C51,这个DO+WHILE结构比上面的WHILE效率高,速度快
				CH375_WR_DAT_PORT( DATA_BUFFER[mLength] );
				mBufferPoint++;
			} while ( --mLength );*/
			CH375_WR_CMD_PORT( CMD_DISK_WR_GO );  /* 继续执行USB存储器的写操作 */
		}
		else break;  /* 返回错误状态 */
	}
	if ( mBlockCount == 0 ) {
		mIntStatus = mWaitInterrupt( );  /* 等待中断并获取状态 */
		if ( mIntStatus == USB_INT_SUCCESS ) return( 0 );  /* 操作成功 */
	}
//	if ( mIntStatus == USB_INT_DISCONNECT ) return( mIntStatus );  /* U盘断开 */
	mClearError( );  /* 清除U盘错误以便重试 */
	return( mIntStatus );  /* 操作失败 */
}

struct _HD_MBR_DPT {
	unsigned char	PartState;
	unsigned char	StartHead;
	unsigned int	StartSec;
	unsigned char	PartType;
	unsigned char	EndHead;
	unsigned int	EndSec;
	unsigned long	StartSector;
	unsigned long	TotalSector;
};

/* 为printf和getkey输入输出初始化串口 */
void	mInitSTDIO( )
{
/*	SCON = 0x50;
	PCON = 0x80;
	TMOD = 0x20;
	TH1 = 0xf3;  // 24MHz晶振, 9600bps//
	TR1 = 1;
	TI = 1;*/

 UCSR1B = 0x00; //disable while setting baud rate
 UCSR1A = 0x00;
 UCSR1C = 0x06;
 UBRR1L = 0x67; //set baud rate lo
 UBRR1H = 0x00; //set baud rate hi
 UCSR1B = 0x1C; //1c
 
}

main() {
	unsigned char	c, mIntStatus;
	unsigned int i=0;
//-------------------------------------------------------
    init_devices();
    //-----------------------------------------------------------------------------
    CH375_PORT_INIT(); //首先将串口初始化为9600 因为CH375默认的波特率是9600
    SET_BAUDRATE();  //设置CH375的串口通讯波特率 57600
    CH375_PORT_INIT_57600();//重新调整波特率 单片机串口波特率57600
    //-----------------------------------------------------------------------------
 	  initLCDM();     //初始化LCD
	  CleanScreen();
	//Welcome_interface();  //显示欢迎界面 

//-------------------------------------------------------
	
	LED_OUT_ACT( );  /* 开机后LED亮一下以示工作 */
	mDelaymS( 100 );  /* 延时100毫秒 */
	LED_OUT_INACT( );
	//mInitSTDIO( );
  //	printf( "Start\n" );
  ShowText(10,5,"开始");
	c = mCH375Init( );  /* 初始化CH375 */
	//if ( c );// printf( "Error @CH375Init\n" );
	/*	{
			ShowText(10,21,"初始化错误!");
	    while ( 1 ) 
	     {
		     LED_OUT_ACT( );  //LED闪烁 
		     mDelaymS( 80 );
		     LED_OUT_INACT( );
		     mDelaymS( 80 );
	     }
		} */
	//printf( "Insert USB disk\n" );
	
	


	
	ShowText(10,21,"等待插入U盘......");
	do {  /* 等待U盘连接 */
		mIntStatus = mWaitInterrupt( );  /* 等待中断并获取状态 */
	} while ( mIntStatus != USB_INT_CONNECT );  /* U盘没有连接或者已经拔出 */
	mDelaymS( 200 );  /* 延时等待U盘进入正常工作状态 */
	//printf( "InitDisk\n" ); 
	ShowText(10,37,"已插入U盘......");
	loop:
	c = mInitDisk( );  /* 初始化U盘,实际是识别U盘的类型,不影响U盘中的数据,在所有读写操作之前必须进行此步骤 */
	if ( c )// printf( "Error @InitDisk, %02X\n", c );
		{
		   ShowText(10,53,"初始化U盘错误");
			while ( 1 ) 
	     {
		    LED_OUT_ACT( );  /* LED闪烁 */
		    mDelaymS( 80 );
		    LED_OUT_INACT( );
		    mDelaymS( 80 );
	     }
    }

	for(i=0;i<100;i++)
	{
		  DATA_BUFFER[i]=168;
	}
	
	
/* 检查U盘是否准备好,大多数U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */
//	do {
//		mDelaymS( 100 );
//		printf( "Disk Ready ?\n" );
//		i = CH375DiskReady( );  /* 查询磁盘是否准备好,如果省掉这个子程序可以节约将近1KB的程序代码 */
//	} while ( i != ERR_SUCCESS );
/* CH375DiskReady 在CH375的U盘文件子程序库中,因为代码较多,所以此处省去 */

	//printf( "ReadSector 0# to buffer\n" );
	ShowText(10,53,"读扇区......");
 	c = mWriteSector( 2, 1 );
	c = mReadSector( 2, 1 );
	//---------------------------------------------------
	if ( c )//printf( "Error @ReadSector, %02X\n", c );
		{
			 ShowText(10,69,"读取U盘失败!");
			 while ( 1 ) 
	     {
		      LED_OUT_ACT();  /* LED闪烁 */
		      mDelaymS( 80 );
		      LED_OUT_INACT();
		      mDelaymS( 80 );
	     }
	  }
	else
		{
			 ShowText(10,69,"读取U盘扇区成功!");
		}
	//---------------------------------------------------
/*	if ( DATA_BUFFER[0x01FF] == 0xAA ) 
	  { // 磁盘分区有效 
		//printf( "WriteSector 1# from buffer\n" );
	  ShowText(10,69,"磁盘分区有效");
		c = mWriteSector( 1, 1 );
		if ( c )// printf( "Error @WriteSector, %02X\n", c );
		memset( DATA_BUFFER, 0, sizeof(DATA_BUFFER) );  // 清空数据缓冲区,代替原来的分区信息 
		//printf( "WriteSector 0# for clear\n" );
		c = mWriteSector( 0, 1 );
		if ( c ); //printf( "Error @WriteSector, %02X\n", c );
	  }
	else {
		//printf( "ReadSector 1# to buffer\n" );
	//	c = mReadSector( 1, 1 );
		if ( c )// printf( "Error @ReadSector, %02X\n", c );
		//printf( "WriteSector 0# from buffer\n" );
		c = mWriteSector( 0, 1 );
		if ( c ); //printf( "Error @WriteSector, %02X\n", c );
	}*/
	//printf( "Stop\n" );
	while ( 1 ) {
		mIntStatus = mWaitInterrupt( );  // 等待中断并获取状态 
		if ( mIntStatus == USB_INT_DISCONNECT )
		 {  // U盘没有连接或者已经拔出 //
			//printf( "Out\n" );
			 ShowText(10,85,"U盘已拨出!");
		 }
		else if ( mIntStatus == USB_INT_CONNECT ) 
		 {  // U盘已经连接//
			//printf( "In\n" );
			ShowText(10,101,"U盘插入!");
			LED_OUT_ACT();
			CleanScreen();
			goto loop;
		 }
	}
}
void CH375_PORT_INIT_57600()  /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */
{
 UCSR1B = 0x00; //disable while setting baud rate
 UCSR1A = 0x00;
 UCSR1C = 0x06;
 UBRR1L = 0x10; //set baud rate lo
 UBRR1H = 0x00; //set baud rate hi
 UCSR1B = 0x1C; //1c
}
void CH375_PORT_INIT()  /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */
{
 UCSR1B = 0x00; //disable while setting baud rate
 UCSR1A = 0x00;
 UCSR1C = 0x06;
 UBRR1L = 0x67; //set baud rate lo
 UBRR1H = 0x00; //set baud rate hi
 UCSR1B = 0x1C; //1c
}
void SET_BAUDRATE()  //设置CH375的串口通讯波特率
{
	   CH375_WR_CMD_PORT( CMD_SET_BAUDRATE );  //发送设置波特率的命令
	   CH375_WR_DAT_PORT(0x03);CH375_WR_DAT_PORT(0x98);  //57600Bps
}

⌨️ 快捷键说明

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