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

📄 main.c

📁 44b0中USB slave端程序
💻 C
字号:
#include "datatype.h"
#include "console.h"
#include "ctrl_set.h"
#include "D12Def.h"
#include "D12op.h"
#include "Chap_9.h"
#include "debug.h"
#include "rtl8019.h"

extern U32 MCLK;

void __irq Timer5_Exception(void);
void __irq EXT_Exception(void);
void __irq USB_Exception(void);
void __irq ETH_Exception(void);
void UsbIntProc(U16 i);

U8 eth_data[1500];
U32 eth_len;

struct send_data
{
	U16 len;
	U16 cnt;
	U8 *pdata;
	U16 *init_data;
	U8 buff[2100];
};
struct send_data SEND_BUFF; 

TIME_STRUC SysTime;
U16	SERIAL_BAUD = 57600;
char table_begin[] = "/***************************************************************/\n";

/*********************************************************************
*****LED灯控制,输入1:灯1亮;2:灯2亮;3:灯3亮;
*********************************************************************/
void LEDON(char i)
{
	if(i==1)
	{
		rPDATC&=0xfff1;
		rPDATC|=2;
	}
	if(i==2)
	{
		rPDATC&=0xfff1;
		rPDATC|=4;
	}
	if(i==3)
	{
		rPDATC&=0xfff1;
		rPDATC|=8;
	}
}

/*********************************************************************
*****初始化定时器5
*********************************************************************/
void Time5IntTest(void)
{
	unsigned long int prescaler,mux5,timer5control;
	pISR_TIMER5	=(int)Timer5_Exception;
	rINTCON=1;

	rINTMOD&=~BIT_TIMER5;//set timer5 as irq interrupt mode
	//rINTMSK=~(BIT_TIMER5|BIT_GLOBAL); //timer5 interrupt enable
	prescaler=255;
	prescaler<<=16;

	rTCFG0&=0xfffff0ff;
	rTCFG0|=prescaler; //seting  timer5 prescaler

	mux5=0  ;//0  1/2  
	mux5<<=20;
	rTCFG1&=0xff0fffff;
	rTCFG1|=mux5;
	rTCNTB5=65535/4;
	timer5control=2;  //
	timer5control<<=24;

	rTCON=timer5control;
	timer5control=5;  //
	timer5control<<=24;
	rTCON=timer5control;  
}


/*********************************************************************
*****外部中断初始化
*********************************************************************/
void Test_Eint(void)
{
	rINTCON=1;//irq interrupt

	pISR_EINT4567=(int)EXT_Exception;
	pISR_EINT0 = (int) USB_Exception;
	pISR_EINT1 = (int) ETH_Exception;
	rSPUCR=4;
	//rPCONG=0x0000;
	rPCONG=0xffff;	//EINT7~4
	rPUPG=0x0;		//pull up enable
	rEXTINT=0x10; //low level interrupt 

	//  rI_ISPC=BIT_EINT4567;
	rINTMOD&=~(BIT_EINT4567|BIT_GLOBAL|BIT_EINT0|BIT_EINT1);
 
	//rINTMSK=~(BIT_EINT4567|BIT_GLOBAL);
}


/*********************************************************************
*****外部中断处理程序
*********************************************************************/
U8 led_display = 1;
void __irq EXT_Exception(void)
{
	static int i;   
	//DisableInt();	 

	rEXTINTPND=0xf;

	if(led_display == 1)
		led_display = 0;
	else
		led_display = 1;
	//EnableInt();
	rI_ISPC=BIT_EINT4567;
}

void __irq USB_Exception(void)
{
	int i;
	puts("\nirq in the d12...");
	i = D12_ReadInterruptRegister();
	UsbIntProc(i);
	rI_ISPC = BIT_EINT0;
}

void __irq ETH_Exception(void)
{
	puts("\nirq in the 8019...");
	rI_ISPC = BIT_EINT1;
}

/*********************************************************************
*****定时器5中断处理程序
*********************************************************************/
void __irq Timer5_Exception(void)
{
	static int i = 0;   
	 
	//DisableInt();
	if(led_display)
	{
		if(i==0)
			LEDON(1);
		else if(i == 1)
			LEDON(2);
		else if(i == 2)
			LEDON(3);
	}
	if(i++ == 2)
		i = 0;
	//EnableInt();
	rI_ISPC=BIT_TIMER5;
}


////////////////////////////////////////////////////////////
void UsbIntProc(U16 i)
{
	U8 tmp;
	U16 xmit_left;
	static U8 xmit_flag = 1;

	//***************************************
	//****ep0 out中断 处理*****************
	//***************************************
	if(i&D12_INT_ENDP0OUT) {
		ep0_rxdone();
	}

	//***************************************
	//****ep0 in中断 处理******************
	//***************************************
	if(i&D12_INT_ENDP0IN) {
		ep0_txdone();
	}

	//***************************************
	//****ep1 out中断 处理******************
	//***************************************
	if(i&D12_INT_ENDP1OUT) {
		printf("\n,in EP2 and EP2's function now reserved...");
		D12_ReadLastTransactionStatus(2);	
		D12_ClearBuff(2);
	}

	//***************************************
	//****ep1 in中断 处理******************
	//***************************************
	if(i&D12_INT_ENDP1IN) {
		printf("\n in EP3 and EP3's function now reserved...");
		tmp = D12_ReadLastTransactionStatus(3);
	}

	//***************************************
	//****ep2 out中断 处理******************
	//***************************************
	if(i&D12_INT_ENDP2OUT) {
		printf("\n,in EP4 and EP4's function now reserved...");
		tmp = D12_ReadLastTransactionStatus(4);
		D12_ClearBuff(4);
	}

	//***************************************
	//****ep2 in中断 处理******************
	//***************************************
	if(i&D12_INT_ENDP2IN) {
		printf("\n,in EP5");
		tmp = D12_ReadLastTransactionStatus(5);
		xmit_left = SEND_BUFF.len - SEND_BUFF.cnt;
		printf("\n++++++xmit_len  = %d",SEND_BUFF.len);
		printf("\n++++++xmit_cnt  = %d",SEND_BUFF.cnt);
		printf("\n++++++xmit_left = %d",xmit_left);
		if(xmit_left >0) {
			if(xmit_left >64)
				xmit_left = 64;
			D12_WriteEndpoint(5, xmit_left, SEND_BUFF.pdata + SEND_BUFF.cnt);
			SEND_BUFF.cnt += xmit_left;
		} else {
			SEND_BUFF.len = 2000;
			SEND_BUFF.cnt = 0;
			SEND_BUFF.pdata = SEND_BUFF.buff;
			SEND_BUFF.init_data = (U16*)SEND_BUFF.pdata;
			for(i = 0; i < 1000; i++) {
				*(SEND_BUFF.init_data) = (((i<<8)|(xmit_flag<<4))|(i>>8));
				SEND_BUFF.init_data++;
			}
			SEND_BUFF.init_data = (U16*)SEND_BUFF.pdata;
			if(xmit_flag++ == 0x0f)
				xmit_flag = 0;
		}
	}

	//***************************************
	//****reset中断 处理******************
	//***************************************
	if(i&D12_INT_BUSRESET) {
		printf("\n,in D12_INT_BUSRESET and D12_INT_BUSRESET now reserved...");
	}

	//***************************************
	//****suspend中断 处理*****************
	//***************************************
	if(i&D12_INT_SUSPENDCHANGE) {
		printf("\n,in D12_INT_SUSPENDCHANGE and D12_INT_SUSPENDCHANGE now reserved...");
	}

}

void ShowSysClock(int argc, char *argv[])
{
	printf("System is running @%dHz\n", MCLK);	
}


int Main(void)
{
	int i;
	int flag;
		
	//ChangePllValue(24, 6, 1);	//修改系统主频为2倍频
	ChangePllValue(120, 8, 1);	//修改系统主频为6.4倍频
	PortInit();
	console_init(57600);	

	rINTMSK=0xffffffff;	
	initIRQ();//enable irq

	Time5IntTest();
	Test_Eint();
	rINTMSK=~(BIT_EINT4567|BIT_GLOBAL|BIT_TIMER5|BIT_EINT0);

	next_line();
	puts(table_begin);	
	puts("USB_ETH for S3C44B0x\n");
	ShowSysClock(0, NULL);	
	printf("Serial Baud rate is %d\n", SERIAL_BAUD);
	puts("Build date:");
	puts(__DATE__);
	putch('-');
	puts(__TIME__);
	next_line();
	puts(table_begin);			

	s3c44b0_eth_init();

	if(readchipid()==0x1210)
	{
		puts("\nFind Pdiusbd12, chip id = 0x1210");
		UsbInit();
	}

	SEND_BUFF.len = 2000;
	SEND_BUFF.cnt = 0;
	SEND_BUFF.pdata = SEND_BUFF.buff;
	SEND_BUFF.init_data = (U16*)SEND_BUFF.pdata;
	for(i = 0; i < 1000; i++) {
		*(SEND_BUFF.init_data) = ((i<<8)|(i>>8));
		SEND_BUFF.init_data++;
	}
	SEND_BUFF.init_data = (U16*)SEND_BUFF.pdata;

	puts("\nSystem Initialized.");		

	while(1) 
	{
		flag=s3c44b0_eth_rcv(eth_data,&eth_len);
		if(flag)
		{
			U8 k=0;
			printf("\n");
			for(i=0;i<eth_len;i++)
			{
				printf(" %2x",eth_data[i]);
				k++;
				if(k==16&&i!=eth_len) 
				{
					printf("\n");
					k=0;
				}
			}
             
          printf("\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n");
		}
	}
}

⌨️ 快捷键说明

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