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

📄 testusb.c

📁 keil c 开发的USB芯片CH375的程序CPU 为c8051f340
💻 C
字号:
#include "C8051F340.h"
#include "intrins.h"
#include <PORTDEFINE.H>
#include <MCU.H>
#include <USB.H>
#include <CH375HF5.H>

unsigned int SecCount;
unsigned int NewSize;
unsigned char xdata USB_data_buff[512];

bit USB_connect;
bit USB_disconnect;

void xDelay100uS(void)				//延时100uS
{
	Delayus(100);
}

void xDelayAfterWrite(void)			//写操作后延时
{
	Delayus(200);  					//延时200uS左右
}
					  
void xQueryInterrupt(void)			//查询中断状态,等待硬件中断
{
	while(CH375IntStatus==0);		
	//子程序库调用该子程序之前CH375IntStatus=0,硬件中断后,由中断服务程序置为非0的实际中断状态后返回
}

void INT0(void) interrupt INTERRUPT_INT0
{
	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设备连接事件
		USB_connect=1;
	}
}

//将程序空间的字符串复制到内部RAM中,返回字符串长度
unsigned char mCopyCodeStringToIRAM(UINT8 idata *iDestination, UINT8 code *iSource)
{
	UINT8	i = 0;
	while(*iDestination = *iSource) 
	{
		iDestination ++;
		iSource ++;
		i ++;
	}
	return(i);
}

unsigned char SafeRemoveDisk(void)
{
	unsigned char i;
	for(i=0;i<10;i++) 	//有的U盘总是返回未准备好,不过可以被忽略
	{  
		Delayms(100);
		if(CH375DiskReady()==ERR_SUCCESS) 
			break;  	//查询磁盘是否准备好
	}
	Delayms(10);
	xWriteCH375Cmd(CMD_SET_CONFIG);  //设置USB配置
	xWriteCH375Data(0);  	//取消配置,会导致很多U盘的LED灯灭
	xQueryInterrupt();  	//查询CH375中断并更新中断状态
	Delayms(10);
	if(i<5&&CH375IntStatus==USB_INT_SUCCESS) 
		return( USB_INT_SUCCESS );  	//操作成功
	else return(0xFF);
//以下取消SOF包会导致绝大多数U盘的LED灯灭
//如果此处取消SOF, 那么与此对应, 在检测到U盘插入后应该再恢复为模式6即恢复SOF包 */
//	xWriteCH375Cmd( CMD_SET_USB_MODE );  /* 设置USB工作模式 */
//	xWriteCH375Data( 5 );  /* 停止发出SOF包,检测到U盘插入后必须用模式6恢复SOF包发出 */
//	mDelaymS( 1 );
}

void main(void)
{
	unsigned char i;
	unsigned char c;
	unsigned int ui1,ui2;

	CloseWDT();
	Init_Device();
	CloseWDT();
	Clr_DOG();

	EA=0;
	Selectchip(0,2);   		//片选选择USB
	for(ui1=0;ui1<512;ui1++)
	{
		USB_data_buff[ui1]=0;
	}

//初始化USB,并测试USB---------------------------
	USB_RESET();
	i=CH375LibInit();	   	//初始化CH375程序库和CH375芯片,操作成功返回0
//----------------------------------------------
//设置USB工作模式-------------------------------
	xWriteCH375Cmd(CMD_SET_USB_MODE);
	xWriteCH375Data(0x06);  //设置为已启用的主机方式并且自动产生SOF包
	//当USB设备连接或者断开的时候会自动产生中断通知外部单片机
	//等待操作成功,通常需要等待10uS-20uS
	Delayus(20);
	if(xReadCH375Data()==CMD_RET_SUCCESS) 
		_nop_();
//----------------------------------------------
//启动USB中断(外部中断)-------------------------
	EA=1;
//----------------------------------------------
	while(1)
	{
		//看是否有U盘插入,如果有U盘插入,只处理U盘的信息,其他操作停止
		if(USB_connect==1) 
		{
			USB_connect=0;
			while(1) 			
			{
			// 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作
				for(i=0;i<5;i++) 	//有的U盘总是返回未准备好,不过可以被忽略
				{  
					Delayms(100);
					if(CH375DiskReady()==ERR_SUCCESS) 
						break;  	//查询磁盘是否准备好
				}
			//操作U盘文件	
				i=CH375DiskConnect();  	//正确返回0
				//不考虑U盘的盘符
				i=mCopyCodeStringToIRAM(mCmdParam.Open.mPathName, "\\S_DATA\\GDEMO.HEX");

				i=CH375FileOpen();  	//打开文件,正确返回0 

				if(i==ERR_MISS_DIR || i==ERR_MISS_FILE)   	
				//没有找到文件,子目录名出错或者是文件名出错
				{
					_nop_(); 	
				}
				else if(i==ERR_SUCCESS)
				//恭喜,找到了
				{
					ui1=CH375vFileSize;		//该文件的大小
					ui2=CH375vSectorSize;	//磁盘的扇区大小
					while(1) 
					{
						c=1;  //每次读取1个扇区
						mCmdParam.Read.mSectorCount=c;  //指定读取的扇区数
						i=CH375FileRead();   //读完后文件指针自动后移
						//处理数据--------
						for(ui1=0;ui1<FILE_DATA_BUF_LEN;ui1++)
						{
							USB_data_buff[ui1]=FILE_DATA_BUF[ui1]; 
						}
						//写FLASH
						//----------------
						if(mCmdParam.Read.mSectorCount<c) 
							break;		//实际读出的扇区数较小则说明文件已经结束
					}
					i=CH375FileClose();  //关闭文件,正确返回0

					if(SafeRemoveDisk()==USB_INT_SUCCESS) 
						break;
				}
				else
				//不知道是什么问题的错误出现了
				{
					_nop_();
				}
			}
		}
		else
		{
		 	_nop_();
		}
	}
}

⌨️ 快捷键说明

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