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

📄 usbtest.c

📁 C8051FTest.rar 是C8051F系列处理器的基本测试程序
💻 C
字号:
#include "system.h"
#include "typedef.h"
#include "usbtest.h"
#include "d12interface.h"
#include <string.h>
#include "lcd.h"
#include "usb.h"
#include "mmc.h"

extern EPPFLAGS	bEppflags;

extern char Found;			//在目录中找到的文件或目录个数
extern FILESTRUCT  File[];//保存查找到的文件或目录信息
extern FILESTRUCT CurF;							//存放当前目录
extern MMCDataBuf[512];
extern MMCUSBBuf[513];
extern char PATH[40];
extern char DEPTH;

//定时器3计数值,20ms
#define T3L_VAL 0x00
#define T3H_VAL 0x70

bool bTruncated = false;	//set it true if command was truncated 
//CMD_HEADER	CmdHeader;
u16	wCount = 0;

USBTEST1_DATA usbtest1={0, 0, 0, 1, 1, 0, 0, 0, AUTOECHO_OFF, 
	TRANSMODE_CONTROL, 0, 0};
bool bNeedRefresh = false;	//dynamic refresh
bool bTimerRefresh = false;

extern void SetUSBTest1Data(USBTEST1_DATA *pData);
extern void reserved();

u8	bTestNo = 0;

static 	CMD_HEADER xdata *g_pCmd = (CMD_HEADER*)Ep2Buf;
static	u8	xdata *g_pData = Ep2Buf+sizeof(CMD_HEADER);


void Timer3_INIT()               	//16位自动重装模式,产成10ms中断
{   
    SFRPAGE = TMR3_PAGE;
	
	TMR3L=T3L_VAL;                	//赋值          
    TMR3H=T3H_VAL;
    RCAP3L=T3L_VAL;
    RCAP3H=T3H_VAL;
    TMR3CF |=0x01;                	//SYSCLK/12作为T3输入,向上计数
	TMR3CN =0x04;                	//T3工作模式: 自动重装,计时器,忽略T2EX信号                       
	EIE2 |=0x1;
}

u8	count = 0;

//timer2 happen interval 1 second
void Timer3_Handler() interrupt 14 	//T3 20ms中断,用于控制时钟
{
//	TMR3CN&=0X7F;					//清中断标志位
	TF3=0;
	count++;
	if (count < 50)
		return;

	count = 0;
	usbtest1.bSecond++;
	bTimerRefresh = true;
	if(usbtest1.bSecond>59)
	{
		usbtest1.bSecond = 0;
		usbtest1.bMinute++;
		if (usbtest1.bMinute >59)
		{
			usbtest1.bMinute = 0;
			usbtest1.bHour++;
		}
		if (usbtest1.bHour > 23)
		{
			usbtest1.bHour = 0;
			usbtest1.bDay++;
		}
		switch(usbtest1.bMonth)
		{
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			if (usbtest1.bDay>31)
			{
				usbtest1.bDay=1;
				usbtest1.bMonth++;
			}
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			if (usbtest1.bDay > 30)
			{
				usbtest1.bDay = 1;
				usbtest1.bMonth++;
			}
			break;
		case 2:
			if (usbtest1.bYear%4==0&&usbtest1.bDay>29)
			{
				usbtest1.bDay = 1;
				usbtest1.bMonth++;
			}
			else if (usbtest1.bDay>28)
			{
				usbtest1.bDay = 1;
				usbtest1.bMonth++;
			}
			break;
		}
		if (usbtest1.bMonth > 12)
		{
			usbtest1.bMonth = 1;
			usbtest1.bYear++;
		}
		if (usbtest1.bYear > 99)
			usbtest1.bYear = 0;
	}
}

void display_err(u8	bErr)
{
	g_pCmd->wTag = USBCMD_BEGIN;
	g_pCmd->bCmd = USBCMD_ERROR;
	g_pCmd->bLen = 1;

	*(g_pData) = bErr;
	D12_WriteEndpointBuffer(D12_EP2IN, Ep2Buf, 64);
}
	
void _set_reg()
{
	//check the test no
	if (bTestNo != 1)
	{
		display_err(USBERR_WRONGTEST);
		return;
	}

	memcpy(&usbtest1, g_pData, 8);
	usbtest1.wRecvCount += 8;

	bNeedRefresh = true;
}

void _get_reg()
{
	g_pCmd->wTag = USBCMD_BEGIN;
	g_pCmd->bCmd = USBCMD_GETREG;
	g_pCmd->bLen = 8;
	memcpy(g_pData, &usbtest1, 8);
	usbtest1.wSendCount += 8;

	D12_WriteEndpointBuffer(D12_EP2IN, Ep2Buf, 64);

//	bNeedRefresh = true;
}

void _connect_mmc()
{
	u8	i;

	//check the test no
	if (bTestNo != 2)
	{
		display_err(USBERR_WRONGTEST);
		return;
	}

	//open root 
	CurF.firstcluster=0;						//首先打开根目录(firstcluster=0判断为根目录)
	CurF.attribute=0;							//首先打开根目录(firstcluster=0判断为根目录)
	OpenDir(&CurF);

	//send file struct to pc
	g_pCmd->wTag = USBCMD_BEGIN;
	g_pCmd->bCmd = USBCMD_CONNECTMMC;
	g_pCmd->bLen = sizeof(FILESTRUCT);
	for (i=0;i<Found;i++)
	{
		memcpy(g_pData, &File[i], sizeof(FILESTRUCT));
		D12_WriteEndpointBuffer(D12_EP2IN, Ep2Buf, 64);
	}
}

void _change_dir()
{
	u8	i;
	//check the test no
	if (bTestNo != 2)
	{
		display_err(USBERR_WRONGTEST);
		return;
	}

	if (g_pCmd->bCmd == USBCMD_CHANGEDIR)
		OpenDir(&File[*g_pData]);
	else if (g_pCmd->bCmd == USBCMD_REFRESH)
		OpenDir(&CurF);

	//send file struct to pc
	g_pCmd->wTag = USBCMD_BEGIN;
	g_pCmd->bCmd = USBCMD_CHANGEDIR;
	g_pCmd->bLen = sizeof(FILESTRUCT);
	for (i=0;i<Found;i++)
	{
		memcpy(g_pData, &File[i], sizeof(FILESTRUCT));
		D12_WriteEndpointBuffer(D12_EP2IN, Ep2Buf, 64);
	}
}

void _read_file()
{
	u32 u32Offset = 0;
	u8	u8FileNo = *g_pData;
	//check the test no
	if (bTestNo != 2)
	{
		display_err(USBERR_WRONGTEST);
		return;
	}

	g_pCmd->wTag = USBCMD_BEGIN;
	g_pCmd->bCmd = USBCMD_READFILE;
	///////////////////////
	//read file & SEND data to pc
	while (u32Offset<File[u8FileNo].size)
	{
		if (File[u8FileNo].size-u32Offset > EP2_PACKET_SIZE-sizeof(CMD_HEADER))
		{
			mmc_fread(g_pData, EP2_PACKET_SIZE-sizeof(CMD_HEADER));
			g_pCmd->bLen = EP2_PACKET_SIZE-sizeof(CMD_HEADER);
		}
		else
		{
			mmc_fread(g_pData, File[u8FileNo].size-u32Offset);
			g_pCmd->bLen = File[u8FileNo].size-u32Offset;
		}
		u32Offset += g_pCmd->bLen;
		D12_WriteEndpointBuffer(D12_EP2IN, Ep2Buf, 64);
	}
	//////////////////////////////

	//file read over
	g_pCmd->bCmd = USBCMD_READOVER;
	g_pCmd->bLen = 0;
	D12_WriteEndpointBuffer(D12_EP2IN, Ep2Buf, 64);
}

void _write_file()
{
	u8	u8FileNo = *g_pData;
	//check the test no
	if (bTestNo != 2)
	{
		display_err(USBERR_WRONGTEST);
		return;
	}

	mmc_fwrite(g_pData, g_pCmd->bLen);

	//data write over
	g_pCmd->wTag = USBCMD_BEGIN;
	g_pCmd->bCmd = USBCMD_WRITEOVER;
	g_pCmd->bLen = 0;//64-sizeof(CMD_HEADER);
//	memset(pData, 'y', g_pCmd->bLen);
	D12_WriteEndpointBuffer(D12_EP2IN, Ep2Buf, 64);

}

void _delete_file()
{
	//check the test no
	if (bTestNo != 2)
	{
		display_err(USBERR_WRONGTEST);
		return;
	}

	DeleteFile(*g_pData);
}

void _add_file()
{
	u8 u8FileNo = *(g_pData+sizeof(FILESTRUCT));
	//check the test no
	if (bTestNo != 2)
	{
		display_err(USBERR_WRONGTEST);
		return;
	}

	memcpy(&File[u8FileNo], g_pData, sizeof(FILESTRUCT));
	AddFile(u8FileNo);
}

void _open_file()
{
	//check the test no
	if (bTestNo != 2)
	{
		display_err(USBERR_WRONGTEST);
		return;
	}

	mmc_fopen(*g_pData);
}

void _close_file()
{
	//check the test no
	if (bTestNo != 2)
	{
		display_err(USBERR_WRONGTEST);
		return;
	}

	mmc_fclose();
}

code void (*Dispatch[])() = 
{
	reserved,
	_set_reg,
	_get_reg,
	_change_dir,
	_read_file,
	_write_file,
	_delete_file,
	_add_file,	//add file & dir use the same func
	_add_file,
	_delete_file,	//delete file & dir use the same func
	_connect_mmc,
	_open_file,
	_close_file,
	_change_dir	//refresh & change_dir use the same func
};

/* initialize interrupt system */
/*
void Init()
{	

}
*/

void Uninit()
{
	EX0 = 0;
//	ES0 = 0;
	EIE2 &=0xfe;
}

void USB_test1(void)
{
	CMD_HEADER *g_pCmd = (CMD_HEADER*)Ep2Buf;
	bTestNo = 1;
	// reset event flags
	bEppflags.value = 0;

	SetUSBTest1Data(&usbtest1);

	IT0 = 0; //set int0 trigger mode
	EX0 = 1;	//ENABLE int0
	EA = 1;		//ENABLE interrupt system

	// set timer3 interval to 1s
	Timer3_INIT();

	Init_D12();
	
	D12_Connect();

	while(1)
	{
		if (bEppflags.flags.bus_reset)
		{
			DISABLE_INTERRUPT;
			bEppflags.flags.bus_reset = 0;
			ENABLE_INTERRUPT;

			// Release D12's SUSPEND pin after bus reset
			D12_SUSP = D12_SUSP_SLEEP;

		}
		if (bEppflags.flags.suspend)
		{
			DISABLE_INTERRUPT;
			bEppflags.flags.suspend = 0;
			ENABLE_INTERRUPT;
		}
		if (bEppflags.flags.setup_packet)
		{
			DISABLE_INTERRUPT;
			bEppflags.flags.setup_packet = 0;
			ENABLE_INTERRUPT;
			control_handler();
		}

		if (bEppflags.flags.ep2_out)
		{
//			DISABLE_INTERRUPT;	//the int was disabled in ep2 out interrupt,
								//we need open it after process the data
			bEppflags.flags.ep2_out = 0;
//			process(Ep2OutLen);
			ENABLE_INTERRUPT;
			if (g_pCmd->wTag != USBCMD_BEGIN)
			{
				display_err(USBERR_WRONGTEST);
			}
			
			Dispatch[g_pCmd->bCmd]();
		}

		if (CheckKeyF == 1)
		{
			CheckKey();
			CheckKeyF = 0;
		}

		if (Key[0].pressed == 1)	//key0 set trans mode
		{
			if (usbtest1.bTransMode == TRANSMODE_CONTROL)
				usbtest1.bTransMode = TRANSMODE_INT;
			else
				usbtest1.bTransMode = TRANSMODE_CONTROL;
			bNeedRefresh = true;
			Key[0].pressed = 0;
		}
		if (Key[1].pressed == 1)//key1 set auto echo
		{
			if (usbtest1.bAutoEcho == AUTOECHO_ON)
				usbtest1.bAutoEcho = AUTOECHO_OFF;
			else
				usbtest1.bAutoEcho = AUTOECHO_ON;
			bNeedRefresh = true;
			Key[1].pressed = 0;

//			D12_WriteEndpointBuffer(5, InData, 64);
		}
		if (Key[6].pressed == 1)	//key6 clear byte count
		{
			usbtest1.wSendCount = 0;
			usbtest1.wRecvCount = 0;
			bNeedRefresh = true;
			Key[6].pressed = 0;
		}
		if (Key[7].pressed == 1)	//exit usb test1
		{
			Uninit();
			D12_Disconnect();
			bTestNo = 0;

			SFRPAGE=TMR3_PAGE;
			TR3=0;
			SFRPAGE=CONFIG_PAGE;
			ClearKey();						//清按键
			Clear(0,240);					//清屏幕
			return;
		}

		if (bNeedRefresh == true || bTimerRefresh == true)
		{
			if (usbtest1.bAutoEcho == AUTOECHO_ON
				&& bTimerRefresh==true)
				_get_reg();

			SetUSBTest1Data(&usbtest1);
			bNeedRefresh = false;
			bTimerRefresh = false;
		}
	}
}


void USB_test2(void)
{
//	CMD_HEADER xdata *g_pCmd = (CMD_HEADER*)Ep2Buf;

//	char Selected;								//返回的目录选择项(0-12),-1表示退出MMC模块

	bTestNo = 2;

	// reset event flags
	bEppflags.value = 0;

	DEPTH=1;
	Clear(0,240);								
	MMCDataBuf[512]=0;							//缓冲区第513个字节清零,防止显示时溢出
	strcpy(PATH,"路径:根目录");

	//open root 
	CurF.firstcluster=0;						//首先打开根目录(firstcluster=0判断为根目录)
	CurF.attribute=0;							//首先打开根目录(firstcluster=0判断为根目录)
	OpenDir(&CurF);

	IT0 = 0; //set int0 trigger mode
	EX0 = 1;	//ENABLE int0
	EA = 1;		//ENABLE interrupt system
	Init_D12();
	
	D12_Connect();

	while(1)
	{
		if (bEppflags.flags.bus_reset)
		{
			DISABLE_INTERRUPT;
			bEppflags.flags.bus_reset = 0;
			ENABLE_INTERRUPT;

			// Release D12's SUSPEND pin after bus reset
			D12_SUSP = D12_SUSP_SLEEP;

		}
		if (bEppflags.flags.suspend)
		{
			DISABLE_INTERRUPT;
			bEppflags.flags.suspend = 0;
			ENABLE_INTERRUPT;
		}
		if (bEppflags.flags.setup_packet)
		{
			DISABLE_INTERRUPT;
			bEppflags.flags.setup_packet = 0;
			ENABLE_INTERRUPT;
			control_handler();
		}

		if (bEppflags.flags.ep2_out)
		{
//			DISABLE_INTERRUPT;	//the int was disabled in ep2 out interrupt,
								//we need open it after process the data
			bEppflags.flags.ep2_out = 0;
//			process(Ep2OutLen);
			ENABLE_INTERRUPT;
			if (g_pCmd->wTag != USBCMD_BEGIN)
			{
				display_err(USBERR_WRONGTEST);
			}

			Dispatch[g_pCmd->bCmd]();
		}

		if (CheckKeyF == 1)
		{
			CheckKey();
			CheckKeyF = 0;
		}
		if (Key[7].pressed == 1)	//exit usb test2
		{
			EX0 = 0;
			D12_Disconnect();			
			bTestNo = 0;

			ClearKey();						//清按键
			Clear(0,240);					//清屏幕
			return;
		}
	}
}

⌨️ 快捷键说明

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