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

📄 main.c

📁 USB与FPGA接口的程序设计。里面是所有的源文件都经本人测试可以用
💻 C
📖 第 1 页 / 共 2 页
字号:
	    }	  else if (iIrqUsb & 0x20)	//EP2 IN	    {	      XmtBuff.pNum = 64;	      XmtBuff.in = 5;	      SETADDR = 0x45;	//读 in 最后状态	      tmp = SETDATA;	      XmtBuff.b[0] = 5;	      XmtBuff.wrLength = 1;	      XmtBuff.p = XmtBuff.b;	      rx_0 ();	    }	  else if (iIrqUsb & 0x80)	    {	    }	  else if (iIrqUsb & 0x40)	    {	    }	}    }}voidMLsup_StallEP0 (void){  // Give a needle hole for Setup Overwritten as well as ISR  SETADDR = 0x40;		// 0 端点停止(用于发送Stall包)  SETDATA = 0x01;  SETADDR = 0x41;		// 1 端点停止(用于发送Stall包)  SETDATA = 0x01;  SETADDR = 0xF1;		// 应答SETUP包,使能(清 OUT 缓冲区、使能 IN 缓冲区)命令}voidGetStatus (void){  XmtBuff.b[1] = 0x00;  switch (XmtBuff.b[0])    {    case 0x80:			//返回设备状态      //发送两个字节数据:第一字节D1为1支持远程唤醒,D0为0是总线供电,其它位为0;第二字节为0。      XmtBuff.b[0] = 0x03;      break;    case 0x81:			//返回接口状态      //发送两个字节数据:第一字节为0;第二字节为0。      //XmtBuff.b[5] 为接口号      XmtBuff.b[0] = 0x00;      break;    case 0x82:			//返回端点状态      //发送两个字节数据:第一字节D0为1端点处于暂停,否则D0为0,其它位为0;第二字节为0。      //XmtBuff.b[5] D7为方向,D3~0为端点号      XmtBuff.b[0] = 0x00;      break;    }  XmtBuff.wrLength = 2;  XmtBuff.p = XmtBuff.b;  rx_0 ();}voidClearFeature (void){  switch (XmtBuff.b[0])    {    case 0x00:			//清设备唤醒功能      break;    case 0x01:			//清接口状态      break;    case 0x02:			//启用端点      //XmtBuff.b[5] D7为方向,D3~0为端点号      if (XmtBuff.b[5] < 0x80)	{	  SETADDR = 0x40 + XmtBuff.b[5] * 2;	// 启用OUT端点	  SETDATA = 0x00;	}      else	{	  XmtBuff.b[5] = XmtBuff.b[5] & 0x0f;	  SETADDR = 0x41 + XmtBuff.b[5] * 2;	// 启用IN端点	  SETDATA = 0x00;	}      break;    }  XmtBuff.wrLength = 0;  rx_0 ();}voidSetFeature (void){  switch (XmtBuff.b[0])    {    case 0x00:			//设置设备唤醒功能      break;    case 0x01:			//设置接口状态      break;    case 0x02:			//停止端点      //XmtBuff.b[5] D7为方向,D3~0为端点号      if (XmtBuff.b[5] < 0x80)	{	  SETADDR = 0x40 + XmtBuff.b[5] * 2;	// 停止OUT端点	  SETDATA = 0x01;	}      else	{	  XmtBuff.b[5] = XmtBuff.b[5] & 0x0F;	  SETADDR = 0x41 + XmtBuff.b[5] * 2;	// 停止IN端点	  SETDATA = 0x01;	}      break;    }  XmtBuff.wrLength = 0;  rx_0 ();}voidSetAddress (void){  SETADDR = 0xD0;		//设置新地址使能  SETDATA = 0x80 | XmtBuff.b[2];  XmtBuff.wrLength = 0;  rx_0 ();}voidGetDescriptor (void){  unsigned int i = 0;  switch (XmtBuff.b[3])    {    case 0x01:			//USB_DEVICE      XmtBuff.wrLength = sizeof (device_descriptor);      XmtBuff.p = device_descriptor;      break;    case 0x02:			// USB_CONFIGURATION      i = XmtBuff.b[7];      i = ((i << 8) | XmtBuff.b[6]);      XmtBuff.wrLength = TotalConf[2];      XmtBuff.p = TotalConf;      if (i < 16)	XmtBuff.wrLength = XmtBuff.b[6];      break;    case 0x03:			//USB_STRING      switch (XmtBuff.b[2])	{	case 0x00:	  XmtBuff.wrLength = sizeof (USBStringLanguageDescription);	  XmtBuff.p = USBStringLanguageDescription;	  break;	case 0x01:	  XmtBuff.wrLength = sizeof (USBStringDescription1);	  XmtBuff.p = USBStringDescription1;	  break;	case 0x02:	  XmtBuff.wrLength = sizeof (USBStringDescription2);	  XmtBuff.p = USBStringDescription2;	  break;	default:	  MLsup_StallEP0 ();	  return;	}      break;//HID code start    case 0x21:      XmtBuff.wrLength = sizeof (HIDDscr);      XmtBuff.p = HIDDscr;      break;    case 0x22:      //HID Report descriptor      //Assumes there is one report descriptor.      //To do: add the ability to return a specific report descriptor.      //Can't use SUDPTRH and SUDPTRL because the report descriptor doesn't store       //its length in the first bytes.      //Instead, adapt code from the String descriptor rev D errata code (above).      //rdp holds the address of a REPORTDSCR structure.      XmtBuff.wrLength = sizeof (ReportDscr);      XmtBuff.p = ReportDscr;      //else       //      EZUSB_STALL_EP0();      // Stall End Point 0      break;//HID code end    default:      MLsup_StallEP0 ();      return;    }  rx_0 ();}voidGetConfiguration (void){  XmtBuff.b[0] = 1;		//返回是否被配置(非 0 为配置)  XmtBuff.wrLength = 1;  XmtBuff.p = XmtBuff.b;  rx_0 ();}voidSetConfiguration (void){  if (XmtBuff.b[0] == 0x00)    {      XmtBuff.wrLength = 0;      rx_0 ();      SETADDR = 0xD8;      if (XmtBuff.b[2] == 0x00)	{	  SETDATA = 0x00;	// 停止普通/同步端点	}      else if (XmtBuff.b[2] == 0x01)	{	  SETDATA = 0x01;	// 使能普通/同步端点	  SETADDR = 0x03;	  SETADDR = 0xFA;	// 设置 IN 缓冲区有效(满标志)	  SETADDR = 0x05;	  SETADDR = 0xFA;	// 设置 IN 缓冲区有效(满标志)	}    }  else    MLsup_StallEP0 ();}voidGetInterface (void){  XmtBuff.b[0] = 0;  XmtBuff.wrLength = 1;  XmtBuff.p = XmtBuff.b;  rx_0 ();}voidSetInterface (void){  XmtBuff.wrLength = 0;  rx_0 ();}voidInitD12 (){    int i = 0;    *(volatile unsigned char *)0x80000043 &= 0xf7;    *(volatile unsigned char *)0x80000003 &= 0xf7;    for (i=0; i<20000; i++) ;    *(volatile unsigned char *)0x80000003 |= 0x08;    *(volatile unsigned long *)0x80000180 |= 0x12000000;    *(volatile unsigned long *)0x80000180 &= 0x12ffffff;	SETADDR  = 0xD0;	SETDATA  = 0x80;	SETADDR  = 0xF3;	SETDATA  = 0x06;	SETDATA  = 0x03;		for (i=0; i<200000; i++);	SETADDR  = 0xF3;	SETDATA  = 0x16;}voidrx_0 (){  INT8 tmp;  if (XmtBuff.pNum > XmtBuff.wrLength)    {      XmtBuff.b[6] = XmtBuff.wrLength;    }  else    {      XmtBuff.b[6] = XmtBuff.pNum;      bIsOrig = 0;    }  tmp =  XmtBuff.in;  SETADDR = tmp;		// 选择 IN 端点(指针指向0位置)  SETADDR = 0xF0;		// 写缓冲区  SETDATA = 0x00;  tmp =  XmtBuff.b[6];  SETDATA = tmp;  for (XmtBuff.b[7] = 0; XmtBuff.b[7] < XmtBuff.b[6]; XmtBuff.b[7]++)    {      tmp = *(XmtBuff.p++);      SETDATA = tmp;    }  XmtBuff.wrLength -= XmtBuff.b[6];  if (XmtBuff.wrLength <= 0)    bIsOrig = 1;  SETADDR = 0xFA;		// 设置 IN 缓冲区有效(满标志)  tmp = XmtBuff.in;  SETADDR = tmp | 0x40;  tmp = SETDATA;}voidtx_0 (){  int i;  SETADDR = 0x00;  SETADDR = 0xF0;  XmtBuff.b[0] = SETDATA;  XmtBuff.b[1] = SETDATA;  for (i = 0; i < 8; i++)    {      XmtBuff.b[i] = SETDATA;    }  SETADDR = 0xF1;		// 应答SETUP包,使能(清 OUT 缓冲区、使能 IN 缓冲区)命令  SETADDR = 0xF2;		// 清 OUT 缓冲区  SETADDR = 0x01;		// 选择端点 1(指针指向0位置)  SETADDR = 0xF1;		// 应答SETUP包,使能(清 OUT 缓冲区、使能 IN 缓冲区)命令  if (XmtBuff.b[0] & 0x20)	//厂商请求跳转表    {      (*NonStandardDeviceRequest[XmtBuff.b[1]]) ();      return;    }  else    {      if (XmtBuff.b[1] <= 0x0B)	//标准请求跳转表	{	  (*StandardDeviceRequest[XmtBuff.b[1]]) ();	  return;	}    }}voidtx_1 (){  int i;  SETADDR = XmtBuff.out;	// 选择端点0(指针指向0位置)  SETADDR = 0xF0;		// 读标准控制码  XmtBuff.b[0] = SETDATA;  XmtBuff.b[1] = SETDATA;  for (i = 0; i < 8; i++)    {      XmtBuff.b[i] = SETDATA;    }  SETADDR = 0xF2;		// 清 OUT 缓冲区}voidread_out (){  INT8 i;  SETADDR = XmtBuff.out;	// 选择端点0(指针指向0位置)  SETADDR = 0xF0;		// 读标准控制码  XmtBuff.b[0] = SETDATA;  XmtBuff.b[1] = SETDATA;  for (i = 0; i < 8; i++)    {      XmtBuff.b[i] = SETDATA;    }  SETADDR = 0xF2;		// 清 OUT 缓冲区}voidSetReport (){  bSetReport = 1;}voidGetReport (){  XmtBuff.wrLength = sizeof (HIDData);  XmtBuff.p = HIDData;  rx_0 ();}voidSetIdle () {}voidGetIdle (){  idle = XmtBuff.b[2];}voidSetProtocol (){  protocol = XmtBuff.b[2];}voidGetProtocol (){  XmtBuff.wrLength = sizeof (protocol);  XmtBuff.p = &protocol;  rx_0();}

⌨️ 快捷键说明

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