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

📄 isr.lst

📁 usb开发资料,外围设备实现
💻 LST
📖 第 1 页 / 共 2 页
字号:
 211   1      }
 212          
 213          //USB中断处理
 214          usb_isr() interrupt 0
 215          {
 216   1      	DISABLE;
 217   1      	fn_usb_isr();
 218   1      	ENABLE;
 219   1      
 220   1      }
 221          
 222          //USB中断服务子程序
 223          void fn_usb_isr()
 224          {
 225   1      	unsigned int i_st;
 226   1      
 227   1      
 228   1      	bEPPflags.bits.in_isr = 1;
 229   1      
 230   1      	i_st = D12_ReadInterruptRegister();//读取中断寄存器
 231   1      
 232   1      	if(i_st != 0) {
 233   2      		if(i_st & D12_INT_BUSRESET) {
 234   3      			bus_reset();//USB总线服务
 235   3      			bEPPflags.bits.bus_reset = 1;
 236   3      		}
 237   2      
 238   2      		if(i_st & D12_INT_EOT)
 239   2      			dma_eot();//DMA传输结束
 240   2      
 241   2      		if(i_st & D12_INT_SUSPENDCHANGE)
C51 COMPILER V6.12  ISR                                                                    10/08/2003 08:56:04 PAGE 5   

 242   2      			bEPPflags.bits.suspend = 1;//挂起改变
 243   2      
 244   2      		if(i_st & D12_INT_ENDP0IN)
 245   2      			ep0_txdone();//端点0IN中断
 246   2      		if(i_st & D12_INT_ENDP0OUT)
 247   2      			ep0_rxdone();//端点0OUT中断
 248   2      		if(i_st & D12_INT_ENDP1IN)
 249   2      			ep1_txdone();//端点1IN中断
 250   2      		if(i_st & D12_INT_ENDP1OUT)
 251   2      			ep1_rxdone();//端点1OUT中断
 252   2      		if(i_st & D12_INT_ENDP2IN)
 253   2      			main_txdone();//端点2IN中断
 254   2      		if(i_st & D12_INT_ENDP2OUT)
 255   2      			main_rxdone();//端点2OUT中断
 256   2      	}
 257   1      
 258   1      	bEPPflags.bits.in_isr = 0;
 259   1      }
 260          
 261          //总线复位处理子程序
 262          void bus_reset(void)
 263          {
 264   1      }
 265          
 266          //端点0OUT中断
 267          void ep0_rxdone(void)
 268          {
 269   1      	unsigned char ep_last, i;
 270   1      
 271   1      	ep_last = D12_ReadLastTransactionStatus(0); //清中断标志
 272   1      
 273   1      	if (ep_last & D12_SETUPPACKET) {
 274   2      		//接收到SETUP包
 275   2      		ControlData.wLength = 0;
 276   2      		ControlData.wCount = 0;
 277   2      
 278   2      		if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
 279   2      			(unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) {
 280   3      			//SETUP包出错,返回
 281   3      			D12_SetEndpointStatus(0, 1);
 282   3      			D12_SetEndpointStatus(1, 1);
 283   3      			bEPPflags.bits.control_state = USB_IDLE;
 284   3      			return;
 285   3      		}
 286   2      
 287   2      		ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
 288   2      		ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
 289   2      		ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);
 290   2      
 291   2      		//对控制端点的输入/输出进行应答
 292   2      		D12_AcknowledgeEndpoint(0);
 293   2      		D12_AcknowledgeEndpoint(1);
 294   2      
 295   2      		ControlData.wLength = ControlData.DeviceRequest.wLength;
 296   2      		ControlData.wCount = 0;
 297   2      
 298   2      		if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) {
 299   3      			//从主机传输数据
 300   3      			bEPPflags.bits.setup_packet = 1;
 301   3      			bEPPflags.bits.control_state = USB_TRANSMIT;		/* get command */
 302   3      		}
 303   2      		else {
C51 COMPILER V6.12  ISR                                                                    10/08/2003 08:56:04 PAGE 6   

 304   3      			if (ControlData.DeviceRequest.wLength == 0) {
 305   4      				bEPPflags.bits.setup_packet = 1;
 306   4      				bEPPflags.bits.control_state = USB_IDLE;		/* set command */
 307   4      			}
 308   3      			else {
 309   4      				if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) {
 310   5      					//接收数据长度为0
 311   5      					bEPPflags.bits.control_state = USB_IDLE;
 312   5      					D12_SetEndpointStatus(0, 1);
 313   5      					D12_SetEndpointStatus(1, 1);
 314   5      				}
 315   4      				else {
 316   5      					bEPPflags.bits.control_state = USB_RECEIVE;	//设置接收状态
 317   5      				}
 318   4      			} // set command with data
 319   3      		} // else set command
 320   2      	} // if setup packet
 321   1      
 322   1      	else if (bEPPflags.bits.control_state == USB_RECEIVE) {
 323   2      		//接收数据
 324   2      		i =	D12_ReadEndpoint(0, EP0_PACKET_SIZE,
 325   2      			ControlData.dataBuffer + ControlData.wCount);
 326   2      		ControlData.wCount += i;
 327   2      		if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) {
 328   3      			//数据接收完毕
 329   3      			bEPPflags.bits.setup_packet = 1;
 330   3      			bEPPflags.bits.control_state = USB_IDLE;
 331   3      		}
 332   2      	}
 333   1      	else {
 334   2      		bEPPflags.bits.control_state = USB_IDLE;//进入等待状态
 335   2      	}
 336   1      }
 337          
 338          //端点0IN处理
 339          void ep0_txdone(void)
 340          {
 341   1      	short i = ControlData.wLength - ControlData.wCount;
 342   1      	D12_ReadLastTransactionStatus(1); //清中断标志位
 343   1      	if (bEPPflags.bits.control_state != USB_TRANSMIT) 
 344   1      		return;//非发送状态,返回
 345   1      
 346   1      	if( i >= EP0_PACKET_SIZE) {
 347   2      		//剩下数据大于16字节,发送16字节
 348   2      		D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
 349   2      		ControlData.wCount += EP0_PACKET_SIZE;
 350   2      		bEPPflags.bits.control_state = USB_TRANSMIT;
 351   2      	}
 352   1      	else if( i != 0) {
 353   2      		//发送剩下数据
 354   2      		D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
 355   2      		ControlData.wCount += i;
 356   2      		bEPPflags.bits.control_state = USB_IDLE;
 357   2      	}
 358   1      	else if (i == 0){
 359   2      		D12_WriteEndpoint(1, 0, 0); //发送完毕,发送0字节
 360   2      		bEPPflags.bits.control_state = USB_IDLE;
 361   2      	}
 362   1      }
 363          
 364          //DMA结束处理
 365          void dma_eot(void)
C51 COMPILER V6.12  ISR                                                                    10/08/2003 08:56:04 PAGE 7   

 366          {
 367   1      }
 368          
 369          //端点1OUT处理
 370          void ep1_txdone(void)
 371          {
 372   1      	D12_ReadLastTransactionStatus(3); //清中断标志位
 373   1      }
 374          
 375          //端点1IN处理
 376          void ep1_rxdone(void)
 377          {
 378   1      	unsigned char len;
 379   1      
 380   1      	D12_ReadLastTransactionStatus(2); //清中断标志位
 381   1      	len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);//读取数据
 382   1      	if(len != 0)
 383   1      		bEPPflags.bits.ep1_rxdone = 1;//标志接收到数据
 384   1      }
 385          
 386          //主端点OUT控制
 387          void main_txdone(void)
 388          {
 389   1      //	unsigned char len,epstatus;
 390   1      
 391   1      	D12_ReadLastTransactionStatus(5); //清中断标志位
 392   1      }
 393          
 394          //主端点IN控制
 395          void main_rxdone(void)
 396          {
 397   1      	unsigned char len,epstatus;
 398   1      	unsigned char i;
 399   1      	//////////////////////////////
 400   1      	D12_ReadLastTransactionStatus(4); //清中断标志位
 401   1      
 402   1      	//接收数据
 403   1      	len = D12_ReadEndpoint(4, 64, EpBuf);
 404   1      	epstatus=D12_ReadEndpointStatus(4);
 405   1      	epstatus &= 0x60;
 406   1      	if (epstatus == 0x60)
 407   1      		len = D12_ReadEndpoint(4, 64, EpBuf);//读取双缓冲区数据
 408   1      
 409   1      
 410   1      }
*** WARNING C280 IN LINE 398 OF .\ISR.C: 'i': unreferenced local variable
 411          
 412          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1288    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     13      11
   IDATA SIZE       =     86    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  1 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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