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

USB编程

开发平台:

Visual C++

  1. #include <reg51.h>                /* special function register declarations   */
  2. #include "mainloop.h"
  3. #include "d12ci.h" 
  4. #include "absacc.h"
  5. //#include "epphal.h"
  6. #define D12_DATA  0xEFF0  //偶数是数据地址
  7. #define D12_COMMAND 0xEFF1  //奇数是命令地址
  8. extern EPPFLAGS bEPPflags;
  9. //设置地址使能
  10. void D12_SetAddressEnable(unsigned char bAddress, unsigned char bEnable)
  11. {
  12. if(bEPPflags.bits.in_isr == 0)
  13. DISABLE;
  14. outportb(D12_COMMAND, 0xD0);//输出指令
  15. if(bEnable)
  16. bAddress |= 0x80;
  17. outportb(D12_DATA, bAddress);//设置地址
  18. if(bEPPflags.bits.in_isr == 0)
  19. ENABLE;
  20. }
  21. //设置端点使能
  22. void D12_SetEndpointEnable(unsigned char bEnable)
  23. {
  24. if(bEPPflags.bits.in_isr == 0)
  25. DISABLE;
  26. outportb(D12_COMMAND, 0xD8);//输出指令
  27. if(bEnable)
  28. outportb(D12_DATA, 1);//设置端点允许
  29. else
  30. outportb(D12_DATA, 0);//设置端点禁止
  31. if(bEPPflags.bits.in_isr == 0)
  32. ENABLE;
  33. }
  34. //模式设置
  35. void D12_SetMode(unsigned char bConfig, unsigned char bClkDiv)
  36. {
  37. if(bEPPflags.bits.in_isr == 0)
  38. DISABLE;
  39. outportb(D12_COMMAND, 0xF3);//设置模式
  40. outportb(D12_DATA, bConfig);
  41. outportb(D12_DATA, bClkDiv);
  42. if(bEPPflags.bits.in_isr == 0)
  43. ENABLE;
  44. }
  45. //DMA工作方式设置
  46. void D12_SetDMA(unsigned char bMode)
  47. {
  48. if(bEPPflags.bits.in_isr == 0)
  49. DISABLE;
  50. outportb(D12_COMMAND, 0xFB);//设置DMA工作方式
  51. outportb(D12_DATA, bMode);
  52. if(bEPPflags.bits.in_isr == 0)
  53. ENABLE;
  54. }
  55. //读取中断寄存器
  56. unsigned short D12_ReadInterruptRegister(void)
  57. {
  58. unsigned char b1;
  59. unsigned int j;
  60. outportb(D12_COMMAND, 0xF4);//读取中断寄存器
  61. b1 = inportb(D12_DATA);
  62. j = inportb(D12_DATA);
  63. j <<= 8;
  64. j += b1;
  65. return j;
  66. }
  67. //端点选择
  68. unsigned char D12_SelectEndpoint(unsigned char bEndp)
  69. {
  70. unsigned char c;
  71. if(bEPPflags.bits.in_isr == 0)
  72. DISABLE;
  73. outportb(D12_COMMAND, bEndp);//端点选择
  74. c = inportb(D12_DATA);
  75. if(bEPPflags.bits.in_isr == 0)
  76. ENABLE;
  77. return c;
  78. }
  79. //读取最后传输状态
  80. unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp)
  81. {
  82. outportb(D12_COMMAND, 0x40 + bEndp);//返回最后传输状态
  83. return inportb(D12_DATA);
  84. }
  85. //读取端点状态
  86. unsigned char D12_ReadEndpointStatus(unsigned char bEndp)
  87. {
  88. unsigned char c;
  89. if(bEPPflags.bits.in_isr == 0)
  90. DISABLE;
  91. outportb(D12_COMMAND, 0x80 + bEndp);//读取端点状态
  92. c = inportb(D12_DATA);
  93. if(bEPPflags.bits.in_isr == 0)
  94. ENABLE;
  95. return c;
  96. }
  97. //设置端点状态
  98. void D12_SetEndpointStatus(unsigned char bEndp, unsigned char bStalled)
  99. {
  100. if(bEPPflags.bits.in_isr == 0)
  101. DISABLE;
  102. outportb(D12_COMMAND, 0x40 + bEndp);//设置端点状态
  103. outportb(D12_DATA, bStalled);
  104. if(bEPPflags.bits.in_isr == 0)
  105. ENABLE;
  106. }
  107. unsigned short D12_ReadChipID(void)
  108. {
  109. unsigned short i,j;
  110. if(bEPPflags.bits.in_isr == 0)
  111. DISABLE;
  112. outportb(D12_COMMAND, 0xFD);
  113. i=inportb(D12_DATA);
  114. j=inportb(D12_DATA);
  115. i += (j<<8);
  116. if(bEPPflags.bits.in_isr == 0)
  117. ENABLE;
  118. return i;
  119. }
  120. //读取端点数据
  121. unsigned char D12_ReadEndpoint(unsigned char endp, unsigned char len, unsigned char * buf)
  122. {
  123. unsigned char i, j;
  124. if(bEPPflags.bits.in_isr == 0)
  125. DISABLE;
  126. outportb(D12_COMMAND, endp);
  127. if((inportb(D12_DATA) & D12_FULLEMPTY) == 0) {
  128. if(bEPPflags.bits.in_isr == 0)
  129. ENABLE;
  130. return 0;
  131. }
  132. outportb(D12_COMMAND, 0xF0);
  133. j = inportb(D12_DATA);
  134. j = inportb(D12_DATA);
  135. if(j > len)
  136. j = len;
  137. for(i=0; i<j; i++)
  138. *(buf+i) = inportb(D12_DATA);
  139. outportb(D12_COMMAND, 0xF2);
  140. if(bEPPflags.bits.in_isr == 0)
  141. ENABLE;
  142. return j;
  143. }
  144. //写端点
  145. unsigned char D12_WriteEndpoint(unsigned char endp, unsigned char len, unsigned char * buf)
  146. {
  147. unsigned char i;
  148. if(bEPPflags.bits.in_isr == 0)
  149. DISABLE;
  150. outportb(D12_COMMAND, endp);
  151. i = inportb(D12_DATA);
  152. outportb(D12_COMMAND, 0xF0);
  153. outportb(D12_DATA, 0);
  154. outportb(D12_DATA, len);
  155. for(i=0; i<len; i++)
  156. outportb(D12_DATA, *(buf+i));
  157. outportb(D12_COMMAND, 0xFA);
  158. if(bEPPflags.bits.in_isr == 0)
  159. ENABLE;
  160. return len;
  161. }
  162. //设置端点应答
  163. void D12_AcknowledgeEndpoint(unsigned char endp)
  164. {
  165. outportb(D12_COMMAND, endp);
  166. outportb(D12_COMMAND, 0xF1);
  167. if(endp == 0)
  168. outportb(D12_COMMAND, 0xF2);
  169. }
  170. //输出数据
  171. void outportb(unsigned int Addr, unsigned char Data)
  172. {
  173. *((unsigned char xdata *) Addr) = Data;
  174. }
  175. //输入数据
  176. unsigned char inportb(unsigned int Addr)
  177. {
  178. return *((unsigned char xdata *) Addr);
  179. }