📄 mainloop.c
字号:
/*
//*************************************************************************
// 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 + -