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

📄 d12sub.c

📁 用at89s52访问PDIUSBD12(USB协议)
💻 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 + -