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

📄 int.c

📁 运行于c51单片机上的用keil c创建的C源程序,采用PDIUSBD12接口。
💻 C
字号:
#include <reg51.h>
#include <string.h>

#include "macro.h"
#include "varmain.h"
#include "varint.h"

void P_InterruptInt0(void) interrupt 0   	//调用D12中断服务子程序
{
  unsigned int W_Reg;
  SETBIT(B_D12_Lb,INT_ISR);//define INT_ISR  0  //1:表示处于中断程序中
  W_Reg = D12_ReadInterruptRegister();
  if(W_Reg != 0)
  {
    if(W_Reg & D12_INT_BUSRESET)  bus_reset();// define D12_INT_BUSRESET  0x40

    if(W_Reg & D12_INT_EOT)  dma_eot();//define D12_INT_EOT   0x0100

    if(W_Reg & D12_INT_SUSPENDCHANGE)  supend_change();//define D12_INT_SUSPENDCHANGE  0x80

    if(W_Reg & D12_INT_ENDP0IN)   ep0_txdone();//define D12_INT_ENDP0IN   0x02

    if(W_Reg & D12_INT_ENDP0OUT)  ep0_rxdone();//define D12_INT_ENDP0OUT  0x01

    if(W_Reg & D12_INT_ENDP1IN)   ep1_txdone();//define D12_INT_ENDP1IN   0x08

    if(W_Reg & D12_INT_ENDP1OUT)  ep1_rxdone();//define D12_INT_ENDP1OUT  0x04

    if(W_Reg & D12_INT_ENDP2IN)   ep2_txdone();//define D12_INT_ENDP2IN   0x20

    if(W_Reg & D12_INT_ENDP2OUT)  ep2_rxdone();//define D12_INT_ENDP2OUT  0x10
  }  
  CLRBIT(B_D12_Lb,INT_ISR);
}


//总线复位中断服务子程序
void bus_reset(void)
{
//可添加用户代码(进行检测到总线复位的操作)
}

//DMA操作结束中断服务子程序
void dma_eot(void)
{
//可添加用户代码(进行检测DMA操作结束的操作)
}

//设备挂起改变
void supend_change(void)
{
  
}

//端点1输出中断操作
void ep1_txdone(void)
{
  D12_ReadLastTransactionStatus(3);//复位中断寄存器
  //可添加用户代码(进行检测端点号3IN令牌的操作)
}

//端点1输入中断操作
void ep1_rxdone(void)
{
  unsigned char len;
  D12_ReadLastTransactionStatus(2);//复位中断寄存器
  len = D12_ReadEndpoint(2, sizeof(B_BufRdEnd1), &B_BufRdEnd1[0]);//读取端点1接收数据
  if (len != 0)  SETBIT(B_CommFlg,B_ReceEP1);//标志端点1接收到数据
}

//端点2输出中断操作
void ep2_txdone(void)
{
  D12_ReadLastTransactionStatus(5);//复位中断寄存器
  //可添加用户代码(进行检测端点号5IN令牌的操作)
}

//端点2输入中断操作
void ep2_rxdone(void)
{
  unsigned char len;
  D12_ReadLastTransactionStatus(4);//复位中断寄存器
  len = D12_ReadEndpoint(4, sizeof(B_BufRdEnd2), &B_BufRdEnd2[0]);//读取端点2接收数据
  if (len != 0)  SETBIT(B_CommFlg,B_ReceEP2);//标志端点2接收到数据
}

void ep0_rxdone(void)
{
  unsigned char ep_last, i;

  ep_last = D12_ReadLastTransactionStatus(0); // Clear interrupt flag

  if (ep_last & D12_SETUPPACKET)	      //是一个建立包 define D12_SETUPPACKET   0x20
  {
    ControlData.wLength = 0;
    ControlData.wCount = 0;
    i = D12_ReadEndpoint(0,sizeof(ControlData.DeviceRequest),(unsigned char *)(&ControlData.DeviceRequest));
    if(i != sizeof(DEVICE_REQUEST))//not done read 
    {
      D12_SetEndpointStatus(0, 1);
      D12_SetEndpointStatus(1, 1);
      B_Conrol_Stat = USB_IDLE;			
      return;
    }
    // Acknowledge setup here to unlock in/out endp
    D12_AcknowledgeEndpoint(0);
    D12_AcknowledgeEndpoint(1);
    ControlData.wLength = ControlData.DeviceRequest.wLength;
    ControlData.wCount = 0;
    
    if (ControlData.DeviceRequest.bmRequestType & USB_ENDPOINT_DIRECTION_MASK) //0x80
    {
      SETBIT(B_D12_Lb,SETUP);//if is 0x80,B_D12_Lb 2th bit set 1
      B_Conrol_Stat = USB_TRANSMIT;		/* get command */
    }
    else
    {
      if (ControlData.DeviceRequest.wLength == 0) 
      {
			SETBIT(B_D12_Lb,SETUP);			/* set command */
			B_Conrol_Stat = USB_IDLE;
      }
      else
      {
        if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE)  //有问题:应该是EP0_PACKET_SIZE  MAX_CONTROLDATA_SIZE=8
		{
	  		B_Conrol_Stat = USB_IDLE;
	  		D12_SetEndpointStatus(0, 1);
	 		D12_SetEndpointStatus(1, 1);
		}
		else 
          	B_Conrol_Stat = USB_RECEIVE;
      }
    }//

  }
  else if(B_Conrol_Stat == USB_RECEIVE)						
  {
    i =	D12_ReadEndpoint(0, EP0_PACKET_SIZE,ControlData.dataBuffer + ControlData.wCount);
    ControlData.wCount += i;
    if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) 
    {
      SETBIT(B_D12_Lb,SETUP);
      B_Conrol_Stat = USB_IDLE;
    }
  }
  else
    B_Conrol_Stat = USB_IDLE;
}


void ep0_txdone(void)
{
  short i = ControlData.wLength - ControlData.wCount;
  D12_ReadLastTransactionStatus(1); // Clear interrupt flag

  if (B_Conrol_Stat != USB_TRANSMIT) 
  {
   single_transmit(0, 0);	//send done must be transmit 0		
   return;
  }
  if( i >= EP0_PACKET_SIZE) 
  {
    D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
    ControlData.wCount += EP0_PACKET_SIZE;
    B_Conrol_Stat = USB_TRANSMIT;
  }
  else if( i != 0) 
  {
    D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
    ControlData.wCount += i;
    B_Conrol_Stat = USB_IDLE;
  }
  else if (i == 0)
  {
    D12_WriteEndpoint(1, 0, 0); // Send zero packet at the end ???
    B_Conrol_Stat = USB_IDLE;
  }
}

⌨️ 快捷键说明

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