main.c
Upload User: lyfy_2008
Upload Date: 2014-07-13
Package Size: 3016k
Code Size: 7k
Category:

USB develop

Development Platform:

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 "chap_9.h"
  9. //#include "protodma.h"
  10. #include"address.h"
  11. //#include"2-16.h"
  12. //#include"24C00.H"
  13. /*
  14. //*************************************************************************
  15. // USB protocol function pointer arrays
  16. //*************************************************************************
  17. */
  18. #define uchar unsigned char 
  19. unsigned char code Tab[]=
  20. { //数码管数据0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
  21. 0x12,0x9F,0x31,0x15,0x9C,0x54,0x50,0x1F,
  22. 0x10,0x14,0x18,0xD0,0x72,0x91,0x70,0x78
  23. };
  24. void send(uchar buf1,uchar buf2); //数码管显示程序
  25. void EndpointII();//处理  2*16LCD和IIC
  26. //USB标准请求
  27. code void (*StandardDeviceRequest[])(void) =
  28. {
  29. get_status,
  30. clear_feature,
  31. reserved,
  32. set_feature,
  33. reserved,
  34. set_address,
  35. get_descriptor,
  36. reserved,
  37. get_configuration,
  38. set_configuration,
  39. get_interface,
  40. set_interface,
  41. reserved,
  42. reserved,
  43. reserved,
  44. reserved
  45. };
  46. //用户厂商请求
  47. code void (*VendorDeviceRequest[])(void) =
  48. {
  49. reserved,
  50. reserved,
  51. reserved,
  52. reserved,
  53. reserved,
  54. reserved,
  55. reserved,
  56. reserved,
  57. reserved,
  58. reserved,
  59. reserved,
  60. reserved,
  61. reserved,
  62. reserved,
  63. reserved,
  64. reserved
  65. };
  66. /*
  67. //*************************************************************************
  68. //  Public static data
  69. //*************************************************************************
  70. */
  71. extern EPPFLAGS bEPPflags;
  72. extern unsigned long ClockTicks;
  73. extern unsigned char idata GenEpBuf[];
  74. extern IO_REQUEST idata ioRequest;
  75. extern unsigned char ioSize, ioCount;
  76. extern unsigned char idata EpBuf[];
  77. extern unsigned char idata mainbuflen;
  78. CONTROL_XFER ControlData;
  79. BOOL bNoRAM;
  80. //定时器0初始化程序
  81. //定时器用来定时检测按键状态
  82. void init_timer0(void)
  83. {
  84. TMOD &= 0XF0;                    /* clear Timer 0   */
  85. TMOD  |= 0X1;
  86. TL0 = 0X0;                   /* value set by user    */
  87. TH0 = 0X0;                  /* value set by user  */
  88. ET0 = 1;        /* IE.1*/
  89. TR0 = 1;                /* TCON.4 start timer  */
  90. PT0 = 1;
  91. EA = 1;
  92. }
  93. //中断设置
  94. void init_special_interrupts(void)
  95. {
  96. IT1 = 0;
  97. EX1 = 1;
  98. PX1 = 0;
  99. }
  100. //I/O口初始化程序
  101. void init_port()
  102. {
  103. P0 = 0xFF;
  104. P1 = 0xFF;
  105. P2 = 0xFF;
  106. P3 = 0xFF;
  107. }
  108. void init()
  109. {
  110.  send(0xff,0xff);//数码管关
  111.  LEDDATA=0x00;//LED关
  112. }
  113. void main(void)
  114. {
  115. init_port();//初始化I/O口
  116. // initlcd();
  117. // printscreen("Hello!!" ,"Wellcome to USB");
  118. init_timer0();//初始化定时器0
  119. init_special_interrupts();//设置中断
  120. init();
  121. bEPPflags.value = 0;
  122. reconnect_USB();//重新连接USB
  123. /* Main program loop */
  124. while( TRUE )
  125. {
  126. if (bEPPflags.bits.timer)
  127. {
  128. DISABLE;//定时器溢出,检测按键状态
  129. bEPPflags.bits.timer = 0;
  130. ENABLE;
  131. if(bEPPflags.bits.configuration)//设备未配置返回
  132. check_key_LED(); //检测键盘
  133. }
  134. if (bEPPflags.bits.bus_reset) 
  135. {//设备复位处理
  136. DISABLE;
  137. bEPPflags.bits.bus_reset = 0;
  138. ENABLE;
  139. } // if bus reset
  140. if(bEPPflags.bits.ep1_rxdone)  //端点1输出
  141. {  //控制LED/数码管/
  142. /*
  143.   GenEpBuf[0]    操作对象  
  144.   1    LED
  145.   2    数码管
  146.   3    锋鸣器
  147.   0x55    读IIC
  148. */
  149.  DISABLE;
  150.  bEPPflags.bits.ep1_rxdone=0;
  151.  ENABLE;
  152.  if(GenEpBuf[0]==1) P1 = GenEpBuf[1]; //LEDDATA=GenEpBuf[1];
  153.  if(GenEpBuf[0]==2)send(Tab[GenEpBuf[1]],Tab[GenEpBuf[2]]);
  154.  if(GenEpBuf[0]==3)BEEB=GenEpBuf[1]&0x01;
  155.  if(GenEpBuf[0]==0x55)
  156.  {
  157. //   Read24c02_nByte(GenEpBuf[1],10,EpBuf) ;
  158.   D12_WriteEndpoint(5, 10, EpBuf);
  159.  }
  160.  GenEpBuf[0]=0;
  161. }
  162. if (bEPPflags.bits.setup_packet)
  163. {//Setup包处理
  164. DISABLE;
  165. bEPPflags.bits.setup_packet = 0;
  166. ENABLE;
  167. control_handler();//调用请求处理子程序
  168. } // if setup_packet
  169. if(bEPPflags.bits.main_rxdone) //端点2输出
  170. {
  171. DISABLE;
  172. bEPPflags.bits.main_rxdone=0;
  173. ENABLE;
  174. EndpointII();//操作LCD和I2C
  175. } //if main_rxdone
  176. } // Main Loop
  177. }
  178. //返回stall应答
  179. void stall_ep0(void)
  180. {
  181. D12_SetEndpointStatus(0, 1);
  182. D12_SetEndpointStatus(1, 1);
  183. }
  184. //断开USB总线
  185. void disconnect_USB(void)
  186. {
  187. // Initialize D12 configuration
  188. D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
  189. }
  190. //连接USB总线
  191. void connect_USB(void)
  192. {
  193. // reset event flags
  194. DISABLE;
  195. bEPPflags.value = 0;//清除所有状态
  196. ENABLE;
  197. // V2.1 enable normal+sof interrupt
  198. D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE);
  199. // Initialize D12 configuration
  200. D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
  201. }
  202. //重新连接到USB总线
  203. void reconnect_USB(void)
  204. {
  205. unsigned long clk_cnt;
  206. disconnect_USB();
  207. clk_cnt = ClockTicks;
  208. while(ClockTicks < clk_cnt + 20);
  209. connect_USB();
  210. }
  211. //恢复到未配置状态
  212. void init_unconfig(void)
  213. {
  214. D12_SetEndpointEnable(0); /* Disable all endpoints but EPP0. */
  215. }
  216. //设置配置状态
  217. void init_config(void)
  218. {
  219. D12_SetEndpointEnable(1); /* Enable  generic/iso endpoints. */
  220. }
  221. //从端点号1发送数据
  222. void single_transmit(unsigned char * buf, unsigned char len)
  223. {
  224. if( len <= EP0_PACKET_SIZE) {
  225. D12_WriteEndpoint(1, len, buf);
  226. }
  227. }
  228. //发送端点号1建立代码
  229. void code_transmit(unsigned char code * pRomData, unsigned short len)
  230. {
  231. ControlData.wCount = 0;
  232. if(ControlData.wLength > len)
  233. ControlData.wLength = len;
  234. ControlData.pData = pRomData;
  235. if( ControlData.wLength >= EP0_PACKET_SIZE) {
  236. D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData);//发送16字节数据
  237. ControlData.wCount += EP0_PACKET_SIZE;
  238. DISABLE;
  239. bEPPflags.bits.control_state = USB_TRANSMIT;
  240. ENABLE;
  241. }
  242. else {
  243. D12_WriteEndpoint(1, ControlData.wLength, pRomData);//发送16字节内数据
  244. ControlData.wCount += ControlData.wLength;
  245. DISABLE;
  246. bEPPflags.bits.control_state = USB_IDLE;
  247. ENABLE;
  248. }
  249. }
  250. //LED和按键处理子程序
  251. void check_key_LED(void)
  252. {
  253. static unsigned char c ;
  254. c =KEYDATA;
  255. D12_WriteEndpoint(3,1,&c);    //输入键盘数据
  256. }
  257. //数码管显示程序,左buf1,右buf2
  258. void send(uchar buf1,uchar buf2)
  259. {
  260.  uchar i;
  261.  uchar temp=buf2;
  262.  for(i=0;i!=8;i++)
  263.  { 
  264.  if(temp&0x01)SPIDATA=1;
  265.  else SPIDATA=0;
  266.  SPICLK=0;SPICLK=1;
  267.  temp>>=1;
  268.  }
  269.   temp=buf1;
  270.  for(i=0;i!=8;i++)
  271.  { 
  272.  if(temp&0x01)SPIDATA=1;
  273.  else SPIDATA=0;
  274.  SPICLK=0;SPICLK=1;
  275.  temp>>=1;
  276.  }
  277.  SPILatch=0;
  278.  SPILatch=1;
  279. }
  280. void EndpointII()//2*16LCD/IIC
  281. {
  282. // if(EpBuf[0]==1)  PrintUsb(EpBuf+2,EpBuf[1]); //LCD
  283. // if(EpBuf[0]==2)  Write24c02_nByte(EpBuf[2],EpBuf[1],EpBuf+3);//IIC
  284.  EpBuf[0]=0;
  285. }
  286. //请求处理子程序 处理Setup包
  287. void control_handler()
  288. {
  289. unsigned char type, req;
  290. type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
  291. req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
  292. if (type == USB_STANDARD_REQUEST)
  293. (*StandardDeviceRequest[req])();//调用标准请求
  294. else if (type == USB_VENDOR_REQUEST)
  295. (*VendorDeviceRequest[req])();//调用厂商请求
  296. else
  297. stall_ep0();
  298. }