📄 mainloop.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 + -