发表于
2007-8-28 18:50:39
看到头都大了,虽然不是全都明白,但起码走了一遍程序,附上我读完主程序涉及的所有注释.直接一句句往下读就行了,函数都在程序的后面的,找不到就用查找功能找一下.
void main(void)
{
unsigned short ID;
unsigned char high,low;
init_port();
init_special_interrupts();
init_flags();
ID=D12_ReadChipID();
high=(unsigned char)(ID>>8);
low=(unsigned char)ID;
reconnect_USB();
while( TRUE )
{
if (bEPPflags.bits.bus_reset) //总线复位处理
{
DISABLE;
bEPPflags.bits.bus_reset = 0; //清总线复位标志
ENABLE;
// D12SUSPD = 1; //释放 PDIUSBD12 挂起控制
}
/* if (bEPPflags.bits.suspend) //挂起改变处理
{
DISABLE;
bEPPflags.bits.suspend= 0; //清除挂起改变标志
ENABLE;
if(D12SUSPD == 1) //进入挂起处理
{
D12SUSPD = 0; //唤醒 PDIUSBD12,使得USB器件在
//MCU进入低功耗模式后再进入挂起
P0 = 0xFF;
P1 = 0xFF;
P2 = 0xFF;
P3 = 0xFF;
D12SUSPD = 1; //释放挂起控制
PCON |= 0x02; //进入掉电模式
while (1); //芯片进入死循环,因为标志51进入掉电
} //后,只有复位才可以唤醒芯片
} // if suspend change*/
if (bEPPflags.bits.setup_packet) //Setup 包处理
{
DISABLE;
bEPPflags.bits.setup_packet = 0;
ENABLE;
control_handler(); //调用请求处理子程序
// D12SUSPD = 1; //释放挂起控制
} // if setup_packet
if(bEPPflags.bits.configuration)
IspControl();
} // Main Loop
}
void init_port()
{
P0 = 0xFF;
P1 = 0xFF;
P2 = 0xFF;
P3 = 0xFF;
// D12SUSPD = 0;
}
void init_special_interrupts(void)
{
EA=1;
IT1=0;
EX1=1;
PX1=1;
}
void init_flags()
{
bEPPflags.bits.bus_reset=0;
bEPPflags.bits.suspend=0;
bEPPflags.bits.setup_packet=0;
bEPPflags.bits.remote_wakeup=0;
bEPPflags.bits.in_isr=0;
bEPPflags.bits.control_state=0;
bEPPflags.bits.configuration=0;
bEPPflags.bits.ep1_rxdone=0;
bEPPflags.bits.main_rxdone=0;
}
/*
//*************************************************************************
// structure and union definitions
//*************************************************************************
*/
typedef union _epp_flags
{
struct _flags
{
// unsigned char timer : 1; //时间溢出
unsigned char bus_reset : 1; //总线复位标志
unsigned char suspend : 1; //挂起改变标志
unsigned char setup_packet : 1; //收到 setup 包
unsigned char remote_wakeup : 1; //远程唤醒标志(未使用)
unsigned char in_isr : 1; //USB中断标志
unsigned char control_state : 2; //控制端点处理状态
//0: 空闲
//1: 数据发送
//2: 数据接收
unsigned char configuration : 1; //配置标志(0:未配置;1:已经配置)
// unsigned char verbose : 1;
unsigned char ep1_rxdone : 1; //端点1收到数据标志
unsigned char main_rxdone : 1; //主端点收到数据标志
unsigned char setup_dma : 2; // V2.3
// unsigned char dma_state : 2;
// unsigned char power_down : 1; // Smart Board
} bits;
unsigned short value;
} EPPFLAGS;
unsigned short D12_ReadChipID(void)
{
unsigned short i,j;
if(bEPPflags.bits.in_isr == 0)
DISABLE;
outportb(D12_COMMAND, 0xFD); // #define D12_COMMAND 0x03
i=inportb(D12_DATA); // #define D12_DATA 0x02
j=inportb(D12_DATA);
i += (j<<8);
if(bEPPflags.bits.in_isr == 0)
ENABLE;
return i;
}
//向PDIUSBD12发送数据或命令的子程序
void outportb(unsigned char port,unsigned char val)
{
unsigned char xdata *ext_address;
MCU_D12CS=0; //片选信号,低有效
ext_address=0xff00 + port;
*ext_address = val;
MCU_D12CS=1;
}
//从PDIUSBD12读取数据
unsigned char inportb(unsigned char port)
{
unsigned char c;
unsigned char xdata *ext_address;
MCU_D12CS=0;
ext_address=0xff00 + port;
c = *ext_address ;
MCU_D12CS=1;
return c;
}
void reconnect_USB(void)
{
// D12SUSPD = 0; //唤醒 PDIUSBD12
disconnect_USB(); //断开芯片与USB总线连接
connect_USB();
}
void disconnect_USB(void)
{
// 初始化 PDIUSBD12 工作状态(断开 Soft Connet 上拉电阻)
D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M); //#define D12_NOLAZYCLOCK 0x02
} //#define D12_SETTOONE 0x40
//#define D12_CLOCK_12M 0x03
/*设置模式命令:F3H*/
void D12_SetMode(unsigned char bConfig, unsigned char bClkDiv)
{
if(bEPPflags.bits.in_isr == 0)
DISABLE;
outportb(D12_COMMAND, 0xF3);
outportb(D12_DATA, bConfig);
outportb(D12_DATA, bClkDiv);
if(bEPPflags.bits.in_isr == 0)
ENABLE;
}
void connect_USB(void)
{
D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE); //#define D12_ENDP4INTENABLE 0x40
//#define D12_ENDP5INTENABLE 0x80
D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
//#define D12_SOFTCONNECT 0x10
}
/*设置DMA命令:FBH*/
void D12_SetDMA(unsigned char bMode)
{
if(bEPPflags.bits.in_isr == 0)
DISABLE;
outportb(D12_COMMAND, 0xFB);
outportb(D12_DATA, bMode);
if(bEPPflags.bits.in_isr == 0)
ENABLE;
}
while( TRUE )
{
if (bEPPflags.bits.bus_reset) //总线复位处理
{
DISABLE;
bEPPflags.bits.bus_reset = 0; //清总线复位标志
ENABLE;
// D12SUSPD = 1; //释放 PDIUSBD12 挂起控制
}
/* if (bEPPflags.bits.suspend) //挂起改变处理
{
DISABLE;
bEPPflags.bits.suspend= 0; //清除挂起改变标志
ENABLE;
if(D12SUSPD == 1) //进入挂起处理
{
D12SUSPD = 0; //唤醒 PDIUSBD12,使得USB器件在
//MCU进入低功耗模式后再进入挂起
P0 = 0xFF;
P1 = 0xFF;
P2 = 0xFF;
P3 = 0xFF;
D12SUSPD = 1; //释放挂起控制
PCON |= 0x02; //进入掉电模式
while (1); //芯片进入死循环,因为标志51进入掉电
} //后,只有复位才可以唤醒芯片
} // if suspend change*/
if (bEPPflags.bits.setup_packet) //Setup 包处理
{
DISABLE;
bEPPflags.bits.setup_packet = 0;
ENABLE;
control_handler(); //调用请求处理子程序
// D12SUSPD = 1; //释放挂起控制
} // if setup_packet
if(bEPPflags.bits.configuration)
IspControl();
} // Main Loop
}
void control_handler()
{
unsigned char type, req;
//读取请求类型,保留bit5和bit6
//#define USB_REQUEST_TYPE_MASK (unsigned char)0x60
//#define USB_REQUEST_MASK (unsigned char)0x0F
type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
////读取请求代码,保留低4位
req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
if (type == USB_STANDARD_REQUEST) //标准请求处理
(*StandardDeviceRequest[req])();
else
stall_ep0(); //无效请求,返回STALL
}
//USB设备请求寄存器
typedef struct _device_request
{
unsigned char bmRequestType; //请求类型(数据传输方向,类型,接收器)
unsigned char bRequest; //USB请求
unsigned short wValue; //USB请求值
unsigned short wIndex; //USB请求索引
unsigned short wLength; //计数长度
} DEVICE_REQUEST;
extern CONTROL_XFER ControlData;
#define MAX_CONTROLDATA_SIZE 8
//Setup 包数据缓冲区
typedef struct _control_xfer
{
DEVICE_REQUEST DeviceRequest; //USB设备请求结构体,8个字节
unsigned short wLength; //传输数据的总字节数
unsigned short wCount; //传输字节数统计
unsigned char * pData; //传输数据的指针
unsigned char dataBuffer[MAX_CONTROLDATA_SIZE]; //请求的数据
} CONTROL_XFER;
/************************************************************
USB标准设备请求子程序入口地址表
************************************************************/
//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
};
#define NUM_ENDPOINTS 4
#define CONFIG_DESCRIPTOR_LENGTH sizeof(USB_CONFIGURATION_DESCRIPTOR) \
+ sizeof(USB_INTERFACE_DESCRIPTOR) \
+ (NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR))
extern CONTROL_XFER ControlData;
//extern IO_REQUEST idata ioRequest;
extern EPPFLAGS bEPPflags;
/*
USB 标准请求程序调用到的子程序
*/
//保留子程序
void reserved(void)
{
stall_ep0();
}
void stall_ep0(void)
{
D12_SetEndpointStatus(0, 1);
D12_SetEndpointStatus(1, 1);
}
/*设置端点状态命令:40~45H*/
void D12_SetEndpointStatus(unsigned char bEndp, unsigned char bStalled)
{
if(bEPPflags.bits.in_isr == 0) //USB 中断服务标志
DISABLE;
outportb(D12_COMMAND, 0x40 + bEndp);
outportb(D12_DATA, bStalled);
if(bEPPflags.bits.in_isr