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

📄 mainloop.c

📁 USB D12 SMART 开发套件 usb驱动程序的源代码和技术文档
💻 C
字号:
/*
   //*************************************************************************
   //
   //                  		ZLGMCU
   //				www.zlgmcu.com
   // File Name:	MAINLOOP.C
   // Revision:		V0.2(2002-04-08)
   // Use Library:	USB51S.LIB
   // Note:		USB51S.LIB不带DMA控制功能
   //*************************************************************************
   */

#include <stdio.h>
#include <string.h>

#include <reg51.h>                /* special function register declarations   */

#include "mainloop.h"
#include "isr.h"
#include "vi2c_c51.h"

/*
//*************************************************************************
//  Public static data
//*************************************************************************
*/

extern EPPFLAGS bEPPflags;
extern unsigned char idata GenEpBuf[];
extern IO_REQUEST idata ioRequest;
extern unsigned char ioSize, ioCount;
extern unsigned char idata EpBuf[];
extern CONTROL_XFER ControlData;

bit i;
unsigned char  idata ComEpBuf[8];
rom_addr rwrom_addr,rwrom_type,rwlen;
unsigned char eprom_sla,operate_type,check_dat,rwcount;
unsigned char *eprom_sub;


unsigned char code i2crom_mask[]=
{
//页写掩字
0x00,					//
0x07,					//24c01
0x0f,					//24c02
0x0f,					//24c04
0x0f,					//24c08
0x0f,					//24c16
0x1f,					//24c64
};

unsigned int code rom_size[]=
{
//空间大小
0x0000,					//
0x007f,					//24c01
0x0100,					//24c02
0x0200,					//24c04
0x0400,					//24c08
0x0800,					//24c16
0x2000,					//24c64
};


void init_timer0(void)
{
	TMOD &= 0XF0;
	TMOD  |= 0X1;
	TL0 = 0X0;
	TH0 = 0X0;
	ET0 = 1;
	TR0 = 1;
	PT0 = 1;
	EA = 1;
}

void init_special_interrupts(void)
{
	IT0 = 0;
	EX0 = 1;
	PX0 = 0;
}

void init_port()
{
	P0 = 0xFF;
	P1 = 0xFF;
	P2 = 0xFF;
	P3 = 0xFF;
	MCU_D12CS = 0x0;
	D12SUSPD = 0;
}


timer_isr() interrupt 1
{
	DISABLE;
	bEPPflags.bits.timer = 0;
	ENABLE;
}

usb_isr() interrupt 0
{
	DISABLE;
	fn_usb_isr();
	ENABLE;
}

void main(void)
{
	init_port();
	init_timer0();
	init_special_interrupts();

	MCU_D12CS = 0x1;
	MCU_D12CS = 0x0;
	D12_SetDMA(0x0);
	bEPPflags.value = 0;

	/* Power on reset, lightup LEDs
	   disconnect and reconnect Soft-Connect */
	reconnect_USB();

	/* Main program loop */
	while( TRUE ){
		if(bEPPflags.bits.configuration)
			i2crw();

		usbserve();

	} // Main Loop

}


void i2crw(void)
{
	if (bEPPflags.bits.ep1_rxdone) {
		DISABLE;
		bEPPflags.bits.ep1_rxdone = 0;
		ENABLE;
		if (bEPPflags.bits.timer)
		{
			ComEpBuf[4]=GenEpBuf[0];
			ComEpBuf[5]=GenEpBuf[1];
			ComEpBuf[6]=GenEpBuf[2];
			ComEpBuf[7]=GenEpBuf[3];
			check_dat=ComEpBuf[0]^ComEpBuf[1]^ComEpBuf[2]^ComEpBuf[3]^ComEpBuf[4]^ComEpBuf[5]^ComEpBuf[6];
			if (check_dat==ComEpBuf[7])
			{
				GenEpBuf[0]=0x55;
				GenEpBuf[1]=0xaa;
				bEPPflags.bits.command=1;
				rwrom_type.word=(ComEpBuf[2] <<8)+ComEpBuf[1];
				switch (rwrom_type.word)
				{
					case 0x0001:				//24c01
					case 0x0002:				//24c02
					case 0x0003:				//24c04
					case 0x0004:				//24c08
					case 0x0005:				//24c16
						{
						operate_type=1;
						break;
						}
					case 0x0006:				//24c64
						{
						operate_type=2;
						break;
						}
					default:
						{
						operate_type=0;
						break;
						}
				}//end of switch
			}//end of if
			else
			{
				GenEpBuf[0]=0xaa;
				GenEpBuf[1]=0x55;
				bEPPflags.bits.command=0;
			}
			D12_WriteEndpoint(3, 2, GenEpBuf);
			bEPPflags.bits.timer=0;
		}//end of if
		else
		{
			ComEpBuf[0]=GenEpBuf[0];
			ComEpBuf[1]=GenEpBuf[1];
			ComEpBuf[2]=GenEpBuf[2];
			ComEpBuf[3]=GenEpBuf[3];
			bEPPflags.bits.command=0;
			bEPPflags.bits.timer=1;
		}//end of else
	}//end of if

	//Read operate
	if ((ComEpBuf[0]=='R') && (bEPPflags.bits.command)) 
	{
		bEPPflags.bits.command=0;
		rwrom_addr.word=(ComEpBuf[4] <<8)+ComEpBuf[3];
		rwlen.byte.high=0;
		rwlen.byte.low=ComEpBuf[5];
		if (rwlen.byte.low>64) rwlen.byte.low=64;
		if ((rwrom_addr.word+rwlen.byte.low)>rom_size[rwrom_type.byte.low])
		{
			rwlen.word=rom_size[rwrom_type.byte.low]-rwrom_addr.word;
			if (rwrom_addr.word>rom_size[rwrom_type.byte.low])
			{
				operate_type=0;
			}
		}
		
		if ((operate_type==1) || (operate_type==2))
		{
			read_24cxx();
		}

		//default operate
		if (operate_type==0) 
		{
			D12_WriteEndpoint(5, 0, EpBuf);
		}
	}//end of read

	//write operate
	if ((bEPPflags.bits.ep2_rxdone) && (bEPPflags.bits.command) && (ComEpBuf[0]=='W'))
	{
		bEPPflags.bits.command=0;
		bEPPflags.bits.ep2_rxdone=0;
		if (ComEpBuf[5]>64) ComEpBuf[5]=64;
		rwrom_addr.word=(ComEpBuf[4] <<8)+ComEpBuf[3];
		rwlen.byte.high=0;
		rwlen.byte.low=((~rwrom_addr.byte.low) & i2crom_mask[rwrom_type.byte.low])+1;
		rwcount=0;
	
		if ((operate_type==1) || (operate_type==2))
		{
			write_24cxx();
		}//end of write 24cxx
		
	}//end of ep2_rxd

}//end of sub


void write_24cxx(void)
{
	do
	{
		if (ComEpBuf[5]>rwlen.byte.low)
		{
			ComEpBuf[5]=ComEpBuf[5]-rwlen.byte.low;
		}
		else
		{
			rwlen.byte.low=ComEpBuf[5];
			ComEpBuf[5]=0;
		}
		if ((rwrom_addr.word+rwlen.byte.low)>rom_size[rwrom_type.byte.low])
		{
			rwlen.word=rom_size[rwrom_type.byte.low]-rwrom_addr.word;
			if (rwrom_addr.word>rom_size[rwrom_type.byte.low])
			{
				operate_type=0;
			}
			ComEpBuf[5]=0;
		}
		if (operate_type==1) 
		{
			do
			{
				i=Iwcheck(0xa0);
			}while (i==0);
			eprom_sla=0xa0 | rwrom_addr.byte.high;
			i=ISendStr(eprom_sla, rwrom_addr.byte.low, &(EpBuf[rwcount]), rwlen.byte.low);
		}
		if (operate_type==2) 
		{
			do
			{
				i=Iwcheck(0xa0);
			}while (i==0);
			eprom_sub=&(rwrom_addr.byte.high);
			i=ISendStr2(0xa0, eprom_sub, &(EpBuf[rwcount]), rwlen.byte.low);
		}
		rwrom_addr.word=rwrom_addr.word+rwlen.byte.low;
		rwcount=rwcount+rwlen.byte.low;
		rwlen.byte.low=i2crom_mask[rwrom_type.byte.low]+1;
		rwlen.byte.high=0;
	}while (ComEpBuf[5]!=0);//end of do
}//end of write_24cxx sub

void read_24cxx(void)
{
	if (operate_type==1) 
	{
		eprom_sla=0xa0 | rwrom_addr.byte.high;
		i=IRcvStr(eprom_sla, rwrom_addr.byte.low, EpBuf, rwlen.byte.low);
		D12_WriteEndpoint(5, rwlen.byte.low, EpBuf);
	}//end of read 24c01,02,04,08,
	if (operate_type==2) 
	{
		eprom_sub=&(rwrom_addr.byte.high);
		i=IRcvStr2(0xa0, eprom_sub, EpBuf, rwlen.byte.low);
		D12_WriteEndpoint(5, rwlen.byte.low, EpBuf);
	}//end of read 24c64
}//end of read_24cxx sub



⌨️ 快捷键说明

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