Isr.c
上传用户:lyfy_2008
上传日期:2014-07-13
资源大小:3016k
文件大小:6k
源码类别:

USB编程

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <reg51.h>                /* special function register declarations   */
  4. //#include "epphal.h"
  5. #include "d12ci.h"
  6. #include "mainloop.h"
  7. #include "usb100.h"
  8. #include"address.h"
  9. //#include"24C00.H"
  10. extern void bus_reset(void);
  11. extern void ep0_txdone(void);
  12. extern void ep0_rxdone(void);
  13. extern void ep1_txdone(void);
  14. extern void ep1_rxdone(void);
  15. extern void main_txdone(void);
  16. extern void main_rxdone(void);
  17. extern void dma_eot(void);
  18. /*
  19. //*************************************************************************
  20. //  Public static data
  21. //*************************************************************************
  22. */
  23. #define uchar unsigned char 
  24. EPPFLAGS bEPPflags;
  25. /* Control endpoint TX/RX buffers */
  26. extern CONTROL_XFER ControlData;
  27. /* ISR static vars */
  28. unsigned char idata GenEpBuf[EP1_PACKET_SIZE];
  29. unsigned char idata EpBuf[EP2_PACKET_SIZE];
  30. unsigned char idata mainbuflen;
  31. IO_REQUEST idata ioRequest;
  32. unsigned char ioSize, ioCount;
  33. unsigned long ClockTicks = 0;
  34. extern BOOL bNoRAM;
  35. //定时器0中断处理
  36. timer_isr() interrupt 1
  37. {
  38. DISABLE;
  39. ClockTicks++;
  40. bEPPflags.bits.timer = 1;
  41. ENABLE;
  42. }
  43. //USB中断处理
  44. usb_isr() interrupt 2
  45. {
  46. DISABLE;
  47. fn_usb_isr();
  48. ENABLE;
  49. }
  50. //USB中断服务子程序
  51. void fn_usb_isr()
  52. {
  53. unsigned int i_st;
  54. bEPPflags.bits.in_isr = 1;
  55. i_st = D12_ReadInterruptRegister();//读取中断寄存器
  56. if(i_st != 0) {
  57. if(i_st & D12_INT_BUSRESET) {
  58. bus_reset();//USB总线服务
  59. bEPPflags.bits.bus_reset = 1;
  60. }
  61. if(i_st & D12_INT_EOT)
  62. dma_eot();//DMA传输结束
  63. if(i_st & D12_INT_SUSPENDCHANGE)
  64. bEPPflags.bits.suspend = 1;//挂起改变
  65. if(i_st & D12_INT_ENDP0IN)
  66. ep0_txdone();//端点0IN中断
  67. if(i_st & D12_INT_ENDP0OUT)
  68. ep0_rxdone();//端点0OUT中断
  69. if(i_st & D12_INT_ENDP1IN)
  70. ep1_txdone();//端点1IN中断
  71. if(i_st & D12_INT_ENDP1OUT)
  72. ep1_rxdone();//端点1OUT中断
  73. if(i_st & D12_INT_ENDP2IN)
  74. main_txdone();//端点2IN中断
  75. if(i_st & D12_INT_ENDP2OUT)
  76. main_rxdone();//端点2OUT中断
  77. }
  78. bEPPflags.bits.in_isr = 0;
  79. }
  80. //总线复位处理子程序
  81. void bus_reset(void)
  82. {
  83. }
  84. //端点0 OUT中断
  85. void ep0_rxdone(void)
  86. {
  87. unsigned char ep_last, i;
  88. ep_last = D12_ReadLastTransactionStatus(0); //清中断标志
  89. if (ep_last & D12_SETUPPACKET) 
  90. {
  91. //接收到SETUP包(命令相位)
  92. ControlData.wLength = 0;
  93. ControlData.wCount = 0;
  94. if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
  95. (unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) )
  96. {
  97. //SETUP包出错,返回
  98. D12_SetEndpointStatus(0, 1);
  99. D12_SetEndpointStatus(1, 1);
  100. bEPPflags.bits.control_state = USB_IDLE;
  101. return;
  102. }
  103. ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
  104. ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
  105. ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);
  106. //对控制端点的输入/输出进行应答
  107. D12_AcknowledgeEndpoint(0);
  108. D12_AcknowledgeEndpoint(1);
  109. ControlData.wLength = ControlData.DeviceRequest.wLength;
  110. ControlData.wCount = 0;
  111. if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
  112. {
  113. //向主机传输数据
  114. bEPPflags.bits.setup_packet = 1;
  115. bEPPflags.bits.control_state = USB_TRANSMIT; /* get command */
  116. }
  117. else
  118. {  //从主机接收数据
  119. if (ControlData.DeviceRequest.wLength == 0) //如果接收长度是0
  120. {
  121. bEPPflags.bits.setup_packet = 1;
  122. bEPPflags.bits.control_state = USB_IDLE; /* set command */
  123. }
  124. else 
  125. {
  126. if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) 
  127. {
  128. bEPPflags.bits.control_state = USB_IDLE;
  129. D12_SetEndpointStatus(0, 1);
  130. D12_SetEndpointStatus(1, 1);
  131. }
  132. else 
  133. {
  134. bEPPflags.bits.control_state = USB_RECEIVE; //设置接收状态
  135. }
  136. } // set command with data
  137. } // else set command
  138. } // if setup packet
  139. else if (bEPPflags.bits.control_state == USB_RECEIVE) 
  140. {
  141. //接收数据 (数据相位)
  142. i = D12_ReadEndpoint(0, EP0_PACKET_SIZE,
  143. ControlData.dataBuffer + ControlData.wCount);
  144. ControlData.wCount += i;
  145. if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) 
  146. {
  147. //数据接收完毕
  148. bEPPflags.bits.setup_packet = 1;
  149. bEPPflags.bits.control_state = USB_IDLE;
  150. }
  151. }
  152. else 
  153. {
  154. bEPPflags.bits.control_state = USB_IDLE;//进入等待状态
  155. }
  156. }
  157. //端点0IN处理
  158. void ep0_txdone(void)
  159. {
  160. short i = ControlData.wLength - ControlData.wCount;
  161. D12_ReadLastTransactionStatus(1); //清中断标志位
  162. if (bEPPflags.bits.control_state != USB_TRANSMIT) 
  163. return;//非发送状态,返回
  164. if( i >= EP0_PACKET_SIZE) 
  165. {
  166. //剩下数据大于16字节,发送16字节
  167. D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
  168. ControlData.wCount += EP0_PACKET_SIZE;
  169. bEPPflags.bits.control_state = USB_TRANSMIT;
  170. }
  171. else if( i != 0) 
  172. {
  173. //发送剩下数据
  174. D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
  175. ControlData.wCount += i;
  176. bEPPflags.bits.control_state = USB_IDLE;
  177. }
  178. else if (i == 0){
  179. D12_WriteEndpoint(1, 0, 0); //发送完毕,发送0字节
  180. bEPPflags.bits.control_state = USB_IDLE;
  181. }
  182. }
  183. //DMA结束处理
  184. void dma_eot(void)
  185. {
  186. }
  187. //端点1IN处理
  188. void ep1_txdone(void)
  189. {
  190. D12_ReadLastTransactionStatus(3); //清中断标志位
  191. }
  192. //端点1OUT处理
  193. void ep1_rxdone(void)
  194. {  //控制LED/数码管/
  195. unsigned char len;
  196. D12_ReadLastTransactionStatus(2); //清中断标志位
  197. len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);//读取数据
  198. if(len != 0)
  199. bEPPflags.bits.ep1_rxdone = 1;//标志接收到数据
  200. }
  201. //主端点IN控制
  202. void main_txdone(void)
  203. {
  204. D12_ReadLastTransactionStatus(5); //清中断标志位
  205. }
  206. //主端点OUT控制
  207. void main_rxdone(void)
  208. {
  209. unsigned char len,epstatus;
  210. D12_ReadLastTransactionStatus(4); //清中断标志位
  211. //接收数据
  212. len = D12_ReadEndpoint(4, 64, EpBuf);
  213. epstatus=D12_ReadEndpointStatus(4);
  214. epstatus &= 0x60;
  215. if (epstatus == 0x60)
  216. len = D12_ReadEndpoint(4, 64, EpBuf);//读取双缓冲区数据
  217. if(len != 0)
  218. {
  219. bEPPflags.bits.main_rxdone = 1;//标志接收到数据
  220. mainbuflen=len;
  221. }
  222. }