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

📄 bulk_test.c

📁 CY7C68013跟ADNS-3080通信SPI接口通信;
💻 C
字号:
#pragma NOIV                    // Do not generate interrupt vectors
//-----------------------------------------------------------------------------
//   File:      portcstb.c
//   Contents:  Hooks required to implement USB peripheral function.
//              Code written for FX2 100-pin REVD...
//              This firmware is used to demonstrate the PORTC STROBE FEATURE
//   Copyright (c) 2001 Cypress Semiconductor All rights reserved
//-----------------------------------------------------------------------------
#include "fx2.h"
#include "fx2regs.h"
#include "fx2sdly.h"            // SYNCDELAY macro

extern BOOL GotSUD;             // Received setup data flag
extern BOOL Sleep;
extern BOOL Rwuen;
extern BOOL Selfpwr;

int count;//A3080固件字节计数
bit s_down;//下载固件的控制标识

BOOL Init_DownloadSROM();
BOOL Write(BYTE data0,BYTE add);

BYTE Configuration;             // Current configuration
BYTE AlternateSetting;          // Alternate settings

// EZUSB FX2 PORTA i/o...
//sbit LATRIGWR = IOA ^ 0;        // alt. func., INT0#
//sbit LATRIGRD = IOA ^ 1;        // alt. func., INT1#
sbit NPD  = IOA ^ 2;//PA2
sbit RST  = IOA ^ 3;//PA3            
sbit NCS  = IOA ^ 4;//PA4
sbit MISO = IOA ^ 5;//PA5
sbit SCLK = IOA ^ 6;//PA6
sbit MOSI = IOA ^ 7;//PA7
sbit LEN = IOB ^ 7;//PB7
// EZUSB FX2 PORTE is not bit-addressable...

// use this global variable when (de)asserting debug LEDs...

//-----------------------------------------------------------------------------
// Task Dispatcher hooks
//   The following hooks are called by the task dispatcher.
//-----------------------------------------------------------------------------

void TD_Init( void )              
{ // Called once at startup
  CPUCS = 0x10 ;
  IFCONFIG = 0xC0;
  EP1OUTCFG = 0xB0;
  EP1INCFG = 0xB0;
  SYNCDELAY;                    

  count=0;//A3080固件字节计数 清零
  s_down=0;

  OEA = 0xFC;   //使能读写允许的引脚PA2、PA3、PA4、PA5、PA6、PA7、
  OEB = 0x80;   //PB7

  Rwuen = TRUE;                 // Enable remote-wakeup

  Init_DownloadSROM();//完成A3080下载固件前的初始化工作
}

void TD_Poll( void )              
{ // Called repeatedly while the device is idle
  char i;
 
   //Download the A3080SROM (1986*8 bit)
   if( !( EP1OUTCS & 0x02 ) && EP1OUTBC )//BUSY=0,OUT的缓冲区数据有效;若
  {
    if(s_down)
    {
       //OEA = 0xFC;   //使能读写允许的引脚PA2、PA3、PA4、PA5、PA6、PA7、
	   //OEB = 0x80;   //PB7
	 
      for(i=0;i<EP1OUTBC;i++) 
	  {
	   if(count<1986)
		 {
		/* 
	  LEN=1;
      EZUSB_Delay(50);
      LEN=0;
      EZUSB_Delay(50);
    	 */
		  Write(EP1OUTBUF[ i ],0x60);//脉冲模式写数据至寄存器0x60,下载SROM1986个字节
		  EZUSB_Delay1ms();//Delay(>=10usTload);
		  count++;
       	 }
       if(count>=1986)
	     {
		  NCS=1;//中断数据下载
		  EZUSB_Delay1ms();//Delay(>=4usTbexit)
		  s_down=0;
		  LEN=1;//提示数据传输达1986,终止传输
		 // OEA = 0x00; 
	     // OEB = 0x00;
		  EZUSB_Delay(1000);
		  break;
		 }
      }
	 
     
    }
	if(EP1OUTBUF[0]==0x11 && EP1OUTBUF[1]==0x22)
      {
	   s_down=1;
	   LEN=1;
       EZUSB_Delay(50);
       LEN=0;
       EZUSB_Delay(50);
	   }
	EP1OUTBC = 0x00;            // 设置端点为OUT传输,BUSY位自动置1

       
  }
// t_data = Read();      // Read next byte from PortC, strobe RD#
//		EP2BCL = 1;
//        EP2BCL = 0x40; 
//		 EP2BCL = 0x40; 
//		 SYNCDELAY;

}


BOOL Init_DownloadSROM()
{
	//初始化
	NPD = 0;//NPD->0 ->1供电
	NPD=1;

	RST=1;//Reset->1 ->0复位
	EZUSB_Delay1ms();//Delay(>=10us);
	RST=0;
	
	SCLK=1;//时钟闲置时上拉

	NCS=1;//NCS->1 ->0芯片选择
	NCS=0;

	Write(0x44,0x22);//第一个参数为数据,第二个参数为地址
	Write(0x07,0x23);
	Write(0x88,0x24);
	EZUSB_Delay(10);//Delay(>=1Frame Period);
	Write(0x18,0x14);//SROM写允许,SROM_Enable

    return(TRUE);
}


BOOL Write(BYTE data0,BYTE add)
{
	char a_add[9];
	char a_data[9];
	char i;
	//1、写地址0x02
	a_add[0]=1;//写数据标志位
	a_add[1]=(add & 0x40)>>6;
	a_add[2]=(add & 0x20)>>5;
	a_add[3]=(add & 0x10)>>4;
	a_add[4]=(add & 0x08)>>3;
	a_add[5]=(add & 0x04)>>2;
	a_add[6]=(add & 0x02)>>1;
	a_add[7]=add & 0x01;
	for(i=0;i<8;i++)
	{
		SCLK=0;
		EZUSB_Delay1ms();
		MOSI=a_add[i];//写地址
		EZUSB_Delay1ms();
		SCLK=1;
		EZUSB_Delay1ms();
		//SCLK=0;
	}
	//2、写数据
	a_data[0]=(data0 & 0x80)>>7;
	a_data[1]=(data0 & 0x40)>>6;
	a_data[2]=(data0 & 0x20)>>5;
	a_data[3]=(data0 & 0x10)>>4;
	a_data[4]=(data0 & 0x08)>>3;
	a_data[5]=(data0 & 0x04)>>2;
	a_data[6]=(data0 & 0x02)>>1;
	a_data[7]=data0 & 0x01;
	for(i=0;i<8;i++)
	{
		SCLK=0;
		EZUSB_Delay1ms();
		MOSI=a_data[i];//写数据
		EZUSB_Delay1ms();
		SCLK=1;
		EZUSB_Delay1ms();
		//SCLK=0;
	}

	  LEN=1;
      EZUSB_Delay(50);
      LEN=0;
      EZUSB_Delay(50);

	return(TRUE);
}


BOOL TD_Suspend(void)          // Called before the device goes into suspend mode
{
   return(TRUE);
}

BOOL TD_Resume(void)          // Called after the device resumes
{
   return(TRUE);
}

//-----------------------------------------------------------------------------
// Device Request hooks
//   The following hooks are called by the end point 0 device request parser.
//-----------------------------------------------------------------------------

BOOL DR_GetDescriptor(void)
{
   return(TRUE);
}

BOOL DR_SetConfiguration(void)   // Called when a Set Configuration command is received
{
   Configuration = SETUPDAT[2];
   return(TRUE);            // Handled by user code
}

BOOL DR_GetConfiguration(void)   // Called when a Get Configuration command is received
{
   EP0BUF[0] = Configuration;
   EP0BCH = 0;
   EP0BCL = 1;
   return(TRUE);            // Handled by user code
}

BOOL DR_SetInterface(void)       // Called when a Set Interface command is received
{
   AlternateSetting = SETUPDAT[2];
   return(TRUE);            // Handled by user code
}

BOOL DR_GetInterface(void)       // Called when a Set Interface command is received
{
   EP0BUF[0] = AlternateSetting;
   EP0BCH = 0;
   EP0BCL = 1;
   return(TRUE);            // Handled by user code
}

BOOL DR_GetStatus(void)
{
   return(TRUE);
}

BOOL DR_ClearFeature(void)
{
   return(TRUE);
}

BOOL DR_SetFeature(void)
{
   return(TRUE);
}



BOOL DR_VendorCmnd( void )
{
        return(TRUE);
}

//-----------------------------------------------------------------------------
// 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
{
}

⌨️ 快捷键说明

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