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

📄 mainloop.c

📁 51+PDIUSBD12源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
   //*************************************************************************           
   // File Name:	MainLoop.c
   // Author:		JerryYoung
   // Created:		20 March 04
   // Modified:
   // Revision:		1.0
   //*************************************************************************
*/

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

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

#include "epphal.h"
#include "d12ci.h"
#include "mainloop.h"
#include "usb100.h"
#include "chap_9.h"
#include "protodma.h"

/********************************************************************************************
P89C51RD2
初始化串口,我用的是24M,9600BAUD,gechars()...
初始化定时器
****************************************************************************************/
/*
//*************************************************************************
// USB protocol function pointer arrays
//*************************************************************************
*/
///
#define RX_BUF_SIZE 10                       //接收缓存
#define TX_BUF_SIZE 1                      //发送缓存
unsigned char rx_buf[RX_BUF_SIZE],tx_buf[TX_BUF_SIZE];   //发送和接收各设置16字节队列缓冲区
unsigned char rx_rd_index=0,rx_wr_index=0,rx_counter=0;
unsigned char tx_rd_index=0,tx_wr_index=0,tx_counter=0;

//unsigned char code testdata[64]={"1234567890abcdefdhi098745612301234567890abcdefdhi098745612304444"};
//USB标准请求
code void (*StandardDeviceRequest[])(void) =
{
	get_status,
	clear_feature,
	reserved,
	set_feature,
	reserved,
	set_address,
	get_descriptor,
	reserved,
	get_configuration,
	set_configuration,
	get_interface,
	set_interface,
	reserved,
	reserved,
	reserved,
	reserved
};

//用户厂商请求
code void (*VendorDeviceRequest[])(void) =
{
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	reserved,
	read_write_register,
	reserved,
	reserved,
	reserved
};

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

extern EPPFLAGS bEPPflags;
extern unsigned long ClockTicks;
extern unsigned char idata GenEpBuf[];
extern IO_REQUEST idata ioRequest;

extern unsigned char ioSize, ioCount;
extern unsigned char idata EpBuf[];

CONTROL_XFER ControlData;
BOOL bNoRAM;

code char * _NAME_USB_REQUEST_DIRECTION[] =
{
"Host_to_device",
"Device_to_host"
};

code char * _NAME_USB_REQUEST_RECIPIENT[] =
{
"Device",
"Interface",
"Endpoint(0)",
"Other"
};

code char * _NAME_USB_REQUEST_TYPE[] =
{
"Standard",
"Class",
"Vendor",
"Reserved"
};

code char * _NAME_USB_STANDARD_REQUEST[] =
{
"GET_STATUS",
"CLEAR_FEATURE",
"RESERVED",
"SET_FEATURE",
"RESERVED",
"SET_ADDRESS",
"GET_DESCRIPTOR",
"SET_DESCRIPTOR",
"GET_CONFIGURATION",
"SET_CONFIGURATION",
"GET_INTERFACE",
"SET_INTERFACE",
"SYNC_FRAME"
};

void help_devreq(unsigned char typ, unsigned char req)
{
	typ >>= 5;

	if(typ == USB_STANDARD_REQUEST) {
	}
	else {
		if(bEPPflags.bits.verbose)
			printf("Request Type = %s, bRequest = 0x%bx.\n", _NAME_USB_REQUEST_TYPE[typ],
				req);
	}
}
/*****************************************************************************/
/*中断完成实际传入传出SBUF动作。*/
/*****************************************************************************/
void serial() interrupt 4                           
{
if(RI&&(rx_counter<RX_BUF_SIZE))
	{
	rx_buf[rx_wr_index]=SBUF;
	if(++rx_wr_index==RX_BUF_SIZE) 
		rx_wr_index=0;
	
	++rx_counter;
	RI=0;
	}
else if(TI&&(tx_counter>0))
	{
	
   SBUF=tx_buf[tx_rd_index];
	TI=0;
   if (++tx_rd_index == TX_BUF_SIZE) tx_rd_index=0;
	
	--tx_counter;
	}

}
/*****************************************************************************/
/* 发送缓冲区*/
/*****************************************************************************/
/*
void putchar(unsigned char c)
{
if(tx_counter!=TX_BUF_SIZE)
{
if(tx_counter&&(tx_counter!=TX_BUF_SIZE)&&(TI==0))            
    {
	tx_buf[tx_wr_index]=c;
	if(++tx_wr_index==TX_BUF_SIZE) tx_wr_index=0;
	++tx_counter;
	}
else if(tx_counter==0) SBUF=c;                      
}
}
*/
/*****************************************************************************/
/*接收缓冲区*/
/*****************************************************************************/

unsigned char getchars(void)
{
char tempdata,save;
if(rx_counter==0) return 0xff;          //if empty,then return 0xff             
if(rx_counter>0)		                           
{
tempdata=rx_buf[rx_rd_index];
if (++rx_rd_index == RX_BUF_SIZE) rx_rd_index=0;
save=IE;
IE=0;
--rx_counter;
IE=save;
return tempdata;
}
}

/******************************************************************/
/* Configure Timer 0
   - Mode                  = 1
   - Interrupt                   = ENABLED
   - Clock Source                = INTERNAL
   - Enable Gating Control    = DISABLED
*/
//定时器0初始化程序
//定时器用来定时检测按键状态
void init_timer0(void)
{
	TMOD &= 0XF0;                    /* clear Timer 0   */
	TMOD  |= 0X1;
	TL0 = 0Xe0;                   /* value set by user    *///////////////
	TH0 = 0Xb1;                  /* value set by user  */////////////////////////
	ET0 = 1;                  /* IE.1*/
	TR0 = 1;                /* TCON.4 start timer  */
	PT0 = 1;

	EA = 1;
}

/* Interrupt Control Unit */
/*   ****  Enabled interrupts in Interrupt Enable Register ****
	 ****  GLOBAL INTERRUPT MUST BE ENABLED FOR ANY OTHER
	 ****  INTERRUPT TO WORK!
*/
/*                  GLOBAL INTERRUPT DISABLED ALL INTERRUPTS
					ARE DISABLED          */
/*                    External interrupt 0      */
/*                        Priority Level = 0    */
/*                        Timer 0 interrupt     */
/*                       Priority Level = 0     */
//中断设置
void init_special_interrupts(void)
{
	IT0 = 0;
	EX0 = 1;
	PX0 = 0;
	//EA  = 1;/////////
	ES=1;
	ET0=1;

	
}

//I/O口初始化程序
void init_port()
{
	P0 = 0xFF;
	P1 = 0xFF;
	P2 = 0xFF;
	P3 = 0xFF;
	MCU_D12CS = 0x0;
	D12SUSPD = 0;
}

/*Serial Port */
/*Mode            = 1  /8-bit UART
  Serial Port Interrupt    = Disabled         */
/*Receive         = Enabled   */
/*Auto Addressing    = Disabled   */
//串行口设置
//方式一的波特率=2^SMOD * (定时器1的溢出率)/32
//XTAL = 24 MHZ
//for example:TH1=TL1=0XF3;SO baudrate=2*24M/12/(0XFF-0XF3)/32  =  9600Bps
//SMOD 为PCON 的 Bit 7
void init_serial(void)
{
	SCON = 0X52;
	PCON =  0X80 | PCON;//SET SMOD=1;
	TMOD = 0X20;
	TCON = 0x69;    // TCON 
	TH1 = 0xF3;
	TL1 = 0xF3;
}


void main(void)
{
	unsigned char key, i,temp[8];
	//unsigned char xdata buff[32];
	init_port();//初始化I/O口
	init_serial();//初始化串行口
	//注:串行口是用来外扩LCD和键盘,用于查询显示当前的工作状态
	//在USB Smart Board标准配置中并未带该LCD和键盘,这里给出的程序仅供参考

	init_timer0();//初始化定时器0
	init_special_interrupts();//设置中断

	MCU_D12CS = 0x1;
	
	MCU_D12CS = 0x0;
	printf("program starts running...\n");

	D12_ReadChipID();

	if(MCU_SWM0 == 0 && MCU_SWM1 == 0) {
		MCU_D12RST = 0;//DMA设置
		MCU_D12RST = 1;
		D12_SetDMA(0x0);
	}

	bEPPflags.value = 0;
	reconnect_USB();//重新连接USB
/*
	if((i = D12_GetDMA()) == 0xC3) {
		D12_SendResume();//发送恢复处理
	}
	else {
		bEPPflags.value = 0;

⌨️ 快捷键说明

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