📄 d12sub.c
字号:
#include <reg52.h>
#include <d12config.h>
#include <D12main.h>
#include "Descriptor.h"
#include "Chap_9.h"
EPPFLAGS bEPPflags;
void D12_SetMode(INT8U bConfig,INT8U bClkDiv)
{
D12_COMMAND_PORT = 0xF3;
D12_DATA_PORT = bConfig;
D12_DATA_PORT = bClkDiv;
}
void Disconnect(void)
{
D12_SetMode(D12_NOLazyClock,D12_SETTOONE | D12_CLOCK_12M);
}
void Connect(void)
{
D12_SetDMA(0x0);
D12_SetMode( D12_NOLazyClock | D12_SOFTCONNECT,D12_SETTOONE | D12_CLOCK_12M);
}
void delay(INT16U count0)
{
INT8U i;
while ((count0--))
{
for (i=0;i<125;i++) {};
}
}
void Reconnect(void)
{
Disconnect();
delay(2);
Connect();
}
INT8U Init_D12(void)
{
MCU_D12CS = True;
MCU_D12CS = False;
MCU_D12RST = False;
delay(1);
MCU_D12RST = True;
delay(2000);
MCU_D12SUSPD = False;
Reconnect();
if ( D12_Read_ID()!=0x1012 ) return(1);
return(0);
}
void D12_SetDMA(INT8U bMode)
{
D12_COMMAND_PORT = 0xFB;
D12_DATA_PORT = bMode;
}
INT16U D12_Read_ID(void)
{
INT16U i,j;
D12_COMMAND_PORT = 0xFD;
i = D12_DATA_PORT;
j = D12_DATA_PORT;
//TXD_pc(i);
//TXD_pc(j);
i += (j<<8);
return i;
}
/****************************************/
/*************向计算机发数据*************/
/****************************************/
void TXD_pc(INT8U icode)
{
//uchar count1; /* 接收等待时间 */
//uchar i;
//RS485 = False;
EA = 0;
ES = 0;
SBUF = icode;
while (!TI);
TI = 0; /* 发数据请求 */
//RS485 = True;
EA = True;
ES = True;
}
/***********************************************************************
** 函数名称: void Usb_Exception(void)
** 功能描述: D12中断服务程序
*************************************************************************/
void Usb_Exception(void) interrupt 0
{
INT16U i_st;
INT8U i,j;
DISABLE(); //进入D12中断服务程序时关中断
bEPPflags.bits.in_isr = 1;
D12_COMMAND_PORT=0xF4; //读取中断寄存器命令
i=D12_DATA_PORT; //读取低8位字节
j=D12_DATA_PORT; //读取高8位字节
TXD_pc(i);
TXD_pc(j);
if(i_st != 0) {
if(i_st & D12_INT_BUSRESET)
bEPPflags.bits.bus_reset = True; //USB总线复位标志
if(i_st & D12_INT_EOT)
dma_eot(); //DMA传输技术处理
if(i_st & D12_INT_SUSPENDCHANGE)
bEPPflags.bits.suspend = 1; //挂起改变标志置1
if(i_st & D12_INT_ENDP0IN)
ep0_txdone(); //控制端点发送数据处理
if(i_st & D12_INT_ENDP0OUT)
ep0_rxdone(); //控制端点接收数据处理
if(i_st & D12_INT_ENDP1IN)
ep1_txdone(); //端点 1发送数据处理
if(i_st & D12_INT_ENDP1OUT)
ep1_rxdone(); //端点 1接收数据处理
if(i_st & D12_INT_ENDP2IN)
ep2_txdone(); //端点 2发送数据处理
if(i_st & D12_INT_ENDP2OUT)
ep2_rxdone(); //端点 2接收数据处理
}
bEPPflags.bits.in_isr = 0;
ENABLE(); //退出D12中断服务程序时开中断
}
void Usbserve()
{
if (bEPPflags.bits.setup_packet){ //Setup包处理
DISABLE();
bEPPflags.bits.setup_packet = 0;
control_handler(); //调用请求处理子程序
ENABLE();
}//if setup_packet
if (bEPPflags.bits.bus_reset){
DISABLE();
bEPPflags.bits.bus_reset = False;
ENABLE();
d12_busreset();
}
}
void d12_busreset(void)
{
//在此添加总线复位处理代码
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -