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

📄 gpiflongxfr.c

📁 本人自己编的usb数据采集固件,对四路信号进行采集
💻 C
📖 第 1 页 / 共 2 页
字号:
		  {
          }
	      XGPIFSGLDATLX = 0xA3;				// Trigger GPIF 
          *EP0BUF = 0xA3;
          EP0BCH = 0;
          EP0BCL = 1;         				// Arm endpoint with # bytes to transfer
          EP0CS |= bmHSNAK;   				// Acknowledge handshake phase of device request
          break;
      }
      case VX_A7:
      {   // Setup peripheral for high speed FIFO xfr(s), TC=8 bytes
          EP6GPIFTCH = 0x00;  				// setup transaction count
          EP6GPIFTCL = 0x40;  				// set EP8GPIFTC = 8
          *EP0BUF = 0xA7;
          EP0BCH = 0;
          EP0BCL = 1;         				// Arm endpoint with # bytes to transfer
          EP0CS |= bmHSNAK;   				// Acknowledge handshake phase of device request
		  break;
      }
	  case VX_A8:
      {   									// Do a FIFO Rd transaction w/TC=8 into EP8
          if( !( EP2468STAT & 0x20 ) )
          { 								// EP8FF=0, when buffer is available...
            								// trigger FIFO read transaction(s), using SFR
            while( !( GPIFTRIG & 0x80 ) )	// Poll GPIFTRIG.7 Done bit
		    {
            }
	        GPIFTRIG = GPIFTRIGRD | GPIF_EP6; // R/W=1, EP[1:0]=FIFO_EpNum for EPx read(s)
            *EP0BUF = 0xA8;   				// return that there was a buffer available
          }
          else
          {  								// If EP busy then host is behind...
             *EP0BUF = 0x00;  				// Buffer space wasn't available and we still have
             				  				// two buffers containing data 
          }
          EP0BCH = 0;
          EP0BCL = 1;         				// Arm endpoint with # bytes to transfer
          EP0CS |= bmHSNAK;   				// Acknowledge handshake phase of device request
		  break;
      }
	  case VX_AC:
      {  									// manually commit IN data to host...
         									// GPIF needs to still be pointing to EP8, last FIFO accessed
         if( EP2468STAT & 0x20 )   
         { 									// EP6F=1 when buffer is not available
            *EP0BUF = 0x00;   				// buffer wasn't available 
         }
         else
         { // EP8F=0 when buffer is available
            INPKTEND = 0x06;    			// 8051 commits pkt by writing #8 to INPKTEND
            *EP0BUF = 0xAC;
         }
            EP0BCH = 0;
            EP0BCL = 1;         			// Arm endpoint with # bytes to transfer
            EP0CS |= bmHSNAK;   			// Acknowledge handshake phase of device request
			break;
      }
    case VX_C5:
    { // read REVCTL register
	  HighAddr=0xAAAA;
	  EP0BUF[0]=LSB(HighAddr>>3);
      EP0BUF[1]=MSB(HighAddr>>3);
	  EP0BCH = 0;
      EP0BCL = 2;                   // Arm endpoint with # bytes to transfer
      EP0CS |= bmHSNAK;
	  return( FALSE ); 
      break;
    }
    case VX_D0:
    { // read live GPIF address
      EP0BUF[0] = VX_D0;
	  SYNCDELAY; 
	  EP0BUF[3]=GPIFADRH;
	  SYNCDELAY; 
	  EP0BUF[4]=GPIFADRL;
	  EP0BUF[2]=IOD;
	  EP0BUF[1]=IOE;
      EP0BCH = 0;
      EP0BCL = 5;                   // Arm endpoint with # bytes to transfer
      EP0CS |= bmHSNAK;             // Acknowledge handshake phase of device request
  
	    return( FALSE );              // no error; command handled OK
      break;
    }
    case VX_D1:
    { // setup GPIF transaction count
      xfrvia_TD_Poll = 1;
      in_token_event=0;
		  //ledX_rdvar = LED0_ON;				// LED0 is ON: GPIF triggered in TD_POll 
          *EP0BUF = 0xD1;
          EP0BCH = 0;
          EP0BCL = 1;         				// Arm endpoint with # bytes to transfer
          EP0CS |= bmHSNAK;   				// Acknowledge handshake phase of device request
		  break;
    }
    case VX_D2:
    { 
      xfrvia_TD_Poll = 0;
	  in_token_event=1;
		  //ledX_rdvar = LED0_OFF;			// LED0 is OFF: GPIF not triggered in TD_Poll 
          *EP0BUF = 0xD2;
          EP0BCH = 0;
          EP0BCL = 1;         				// Arm endpoint with # bytes to transfer
          EP0CS |= bmHSNAK;   				// Acknowledge handshake phase of device request
		  break;
    }
	case VX_E0://握手
	{
	*EP0BUF=VX_E0;
	break;
	}
	case VX_E1://电子开关 EP0BUF[1]=0x00关闭,EP0BUF【1】=0x01打开
	{
	if(EP0BUF[1]&0x01)
		IOA &=0xF7;//IOA.3=0
	else
		IOA |=0x08;//IOA.3=1
	*EP0BUF=VX_E1;
	break;
	}
	case VX_E2:
	//电机行进,四个字节命令,EP0BUF【0】为原始命令,EP0BUF【1】存储设置信息,
	//EP0BUF【2】控制电机速度(延时参数),EP0BUF【3】为行进步数
	//EP0BUF【1】.0设置方向O_DIR,EP0BUF【1】。1设置电子开关O_SWITCH,SWITCH=0关闭,SWITCH=1打开
	{
	R_SETTING=EP0BUF[1];
	R_SPEED=EP0BUF[2];
	R_STEP1=EP0BUF[3];
	R_STEP2=0xFA;//=250
	R_STEP3=0xC8;//=200
	SUB_SETTING();
	SUB_STEPIN();
	*EP0BUF=VX_E2;
	break;
	}
	case VX_E3://长周期光栅的制作
	{
	R_SETTING=EP0BUF[1];
	R_SPEED=EP0BUF[2];
	R_STEP1=EP0BUF[3];
	R_STEP2=0xFA;//250
	R_LENGTH=EP0BUF[4];
	R_TIME1=EP0BUF[5];
	R_TIME2=EP0BUF[6];
	SUB_SETTING();
	SUB_F1();
	*EP0BUF=VX_E3;
	break;
	}
/*	case VX_E4:
	{
if( EP68FIFOFLGS & 0x01 )
      { // EP6FF=1, when fifo "full"
		SYNCDELAY;              // 
        INPKTEND = 0x06;        // ...skip pkt.
      }
      else
      { // EP6FF=0, when fifo "not full", buffer available...
        // setup GPIF transaction count
        SYNCDELAY;          // 
        EP6GPIFTCH = 0x02;    
        SYNCDELAY;
        EP6GPIFTCL = 0x00;             
        // trigger FIFO read transaction(s), using SFR
        // R/W=1, EP[1:0]=FIFO_EpNum for EPx read(s)
        SYNCDELAY;
        GPIFTRIG = GPIFTRIGRD | GPIF_EP6;         
        // NOTE: 512 bytes transfers in ~75usec on 8-bit async bus ;64 bytes transfers in ~10usec on 8-bit async bus        
        // wait for the transaction to terminate naturally...
        SYNCDELAY;                // 
        while( !( GPIFTRIG & 0x80 ) )
        	{   // should take <75usec @ 8-bit async.
          	; // poll GPIFTRIG.7, DONE bit...
        	}        
      }
	  *EP0BUF=VX_E4;	
	break;
	//电子开关,按存储器数据运行
	{
	if(EP0BUF[1]&0x02)
	{
	IOA&=0xF7;//CLR O_SWTICH
	}
	else
	{
	}
	IOA&=0xFD;//CLR O_DIR
	R_COEF=EP0BUF[2];
	ReadFlag=1;
	IOD=0x00;
	IOE=0x00;
	AUTOPTRSETUP = 0x07;
	while(ReadFlag)
{
	AUTOPTRH2 = 0xF8;
  	AUTOPTRL2 = 0x00;//EP6BUFFER
	//if ep6full is full then do work;close switch;skip packet;ep6full=0;ReadFlag=1;
	  // Handle IN data... 
  // is the peripheral interface idle...
  if( GPIFTRIG & 0x80 )
  {    // check if peripheral "not empty"...
      if( EP68FIFOFLGS & 0x01 )
      { // EP6FF=1, when fifo "full"
		BYTE i,j,k,l,delay;
		for(l=2;l>0;l--)
		{
			for(i=256;i>0;i--)
			{
				IOA^=0x01;
				delay=EXTAUTODAT2;	   
		 		if(!delay)
				{
				ReadFlag=0;
				IOA|=0x08;
				i=0;
				j=0;
				}
				IOA^=0x01;
				for(j=R_COEF;j>0;j--)//延时
				{
					for(k=delay;k>0;k--);
				}
        	}
		}
		IOD+=1;
		if(PSW&0x80)
		{
		IOE+=1;
		}
		SYNCDELAY;              // 
        INPKTEND = 0x16;        // ...skip pkt.
      }
      else
      { // EP6FF=0, when fifo "not full", buffer available...
        // setup GPIF transaction count
        SYNCDELAY;          // 
        EP6GPIFTCH = 0x02;    
        SYNCDELAY;
        EP6GPIFTCL = 0x00;             
        // trigger FIFO read transaction(s), using SFR
        // R/W=1, EP[1:0]=FIFO_EpNum for EPx read(s)
        SYNCDELAY;
        GPIFTRIG = GPIFTRIGRD | GPIF_EP6;         
        // NOTE: 512 bytes transfers in ~75usec on 8-bit async bus ;64 bytes transfers in ~10usec on 8-bit async bus        
        // wait for the transaction to terminate naturally...
        SYNCDELAY;                // 
        while( !( GPIFTRIG & 0x80 ) )
        	{   // should take <75usec @ 8-bit async.
          	; // poll GPIFTRIG.7, DONE bit...
        	}        
      }
    
  }
  else
  { // peripheral interface busy...
  }
}
	IOA|=0x08;
	*EP0BUF=VX_E4;	
	break;
	}
*/	case VX_E5:
	//数据传输的初始化工作
	{
	IOD=0x00;
	IOE=0x00;
	*EP0BUF=VX_E5;
	break;
	}
	case VX_EE:
	{
		// GPIF address pins update when GPIFADRH/L written
  		SYNCDELAY;                    // 
  		GPIFADRH = 0x00;    // bits[7:1] always 0
  		SYNCDELAY;                    // 
  		GPIFADRL = 0x00;    // point to PERIPHERAL address 0x0000
		IOD=0x00;
		IOE=0x00;
		HighAddr=0x0000;
  		*EP0BUF = 0xEE;
        EP0BCH = 0;
        EP0BCL = 1;         				// Arm endpoint with # bytes to transfer
        EP0CS |= bmHSNAK;  				// Acknowledge handshake phase of device request
		break;
	}
	////////////////////////////////////////////////////////////////////////////////////////////
    default:
    {
      //ledX_rdvar = LED3_ON;     // debug visual, stuck "ON" to warn developer...
	    return( FALSE );          // no error; command handled OK
    }
	}
  
  EP0BCH = 0;
  EP0BCL = 1;                   // Arm endpoint with # bytes to transfer
  EP0CS |= bmHSNAK;             // Acknowledge handshake phase of device request
  
	return( FALSE );              // no error; command handled OK
}

//-----------------------------------------------------------------------------
// USB Interrupt Handlers
//   The following functions are called by the USB interrupt jump table.
//-----------------------------------------------------------------------------

// Setup Data Available Interrupt Handler
void ISR_Sudav( void ) interrupt 0
{
   GotSUD = TRUE;         // Set flag
   EZUSB_IRQ_CLEAR( );
   USBIRQ = bmSUDAV;      // Clear SUDAV IRQ
}

// Setup Token Interrupt Handler
void ISR_Sutok( void ) interrupt 0
{
   EZUSB_IRQ_CLEAR( );
   USBIRQ = bmSUTOK;      // Clear SUTOK IRQ
}

void ISR_Sof( void ) interrupt 0
{
   EZUSB_IRQ_CLEAR( );
   USBIRQ = bmSOF;        // Clear SOF IRQ
}

void ISR_Ures( void ) interrupt 0
{
   if ( EZUSB_HIGHSPEED( ) )
   {
      pConfigDscr = pHighSpeedConfigDscr;
      pOtherConfigDscr = pFullSpeedConfigDscr;
   }
   else
   {
      pConfigDscr = pFullSpeedConfigDscr;
      pOtherConfigDscr = pHighSpeedConfigDscr;
   }
   
   EZUSB_IRQ_CLEAR( );
   USBIRQ = bmURES;       // Clear URES IRQ
}

void ISR_Susp( void ) interrupt 0
{
   Sleep = TRUE;
   EZUSB_IRQ_CLEAR( );
   USBIRQ = bmSUSP;
}

void ISR_Highspeed( void ) interrupt 0
{
   if ( EZUSB_HIGHSPEED( ) )
   {
      pConfigDscr = pHighSpeedConfigDscr;
      pOtherConfigDscr = pFullSpeedConfigDscr;
   }
   else
   {
      pConfigDscr = pFullSpeedConfigDscr;
      pOtherConfigDscr = pHighSpeedConfigDscr;
   }

   EZUSB_IRQ_CLEAR( );
   USBIRQ = bmHSGRANT;
}
void ISR_Ep0ack( void ) interrupt 0
{
}
void ISR_Stub( void ) interrupt 0
{
}
void ISR_Ep0in( void ) interrupt 0
{
}
void ISR_Ep0out( void ) interrupt 0
{
}
void ISR_Ep1in( void ) interrupt 0
{
}
void ISR_Ep1out( void ) interrupt 0
{
}
void ISR_Ep2inout( void ) interrupt 0
{
}
void ISR_Ep4inout( void ) interrupt 0
{
}
void ISR_Ep6inout( void ) interrupt 0
{
}
void ISR_Ep8inout( void ) interrupt 0
{
}
void ISR_Ibn( void ) interrupt 0
{
}
void ISR_Ep0pingnak( void ) interrupt 0
{
}
void ISR_Ep1pingnak( void ) interrupt 0
{
}
void ISR_Ep2pingnak( void ) interrupt 0
{
}
void ISR_Ep4pingnak( void ) interrupt 0
{
}
void ISR_Ep6pingnak( void ) interrupt 0
{
}
void ISR_Ep8pingnak( void ) interrupt 0
{
}
void ISR_Errorlimit( void ) interrupt 0
{
}
void ISR_Ep2piderror( void ) interrupt 0
{
}
void ISR_Ep4piderror( void ) interrupt 0
{
}
void ISR_Ep6piderror( void ) interrupt 0
{
}
void ISR_Ep8piderror( void ) interrupt 0
{
}
void ISR_Ep2pflag( void ) interrupt 0
{
}
void ISR_Ep4pflag( void ) interrupt 0
{
}
void ISR_Ep6pflag( void ) interrupt 0
{
}
void ISR_Ep8pflag( void ) interrupt 0
{
}
void ISR_Ep2eflag( void ) interrupt 0
{
}
void ISR_Ep4eflag( void ) interrupt 0
{
}
void ISR_Ep6eflag( void ) interrupt 0
{
}
void ISR_Ep8eflag( void ) interrupt 0
{
}
void ISR_Ep2fflag( void ) interrupt 0
{
}
void ISR_Ep4fflag( void ) interrupt 0
{
}
void ISR_Ep6fflag( void ) interrupt 0
{
}
void ISR_Ep8fflag( void ) interrupt 0
{
}
void ISR_GpifComplete( void ) interrupt 0
{
}
void ISR_GpifWaveform( void ) interrupt 0
{  // FIFORd WF detected peripheral prematurely empty (less than max. pkt. size)

  GPIFABORT = 0xFF;             // abort to handle shortpkt
  
  SYNCDELAY;
	EXIF &=  ~0x40;
  INT4CLR = 0xFF;             // automatically enabled at POR
  SYNCDELAY;
}

⌨️ 快捷键说明

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