init.c
上传用户:ids068
上传日期:2013-04-04
资源大小:639k
文件大小:13k
源码类别:

USB编程

开发平台:

C/C++

  1. /****************************************Copyright (c)**************************************************
  2. **                               广州周立功单片机发展有限公司
  3. **                                     研    究    所
  4. **                                 http://www.zlgmcu.com
  5. **--------------当前版本修订------------------------------------------------------------------------------
  6. ** 修改人: 刘英斌
  7. ** 日 期:2003-03-13
  8. ** 描 述:ISP1581 V1.0
  9. **------------------------------------------------------------------------------------------------------
  10. ********************************************************************************************************/
  11. #include "standard.h"
  12. #include "Kernel.h"
  13. #include "D14.h"
  14. //***********************************************************************
  15. //*                *
  16. //*                  External Variable Definition      *
  17. //*                *
  18. //***********************************************************************
  19. extern void Start_mSEC_Timer(Data);
  20. extern void Start_SEC_Timer(Data);
  21. extern KERNEL Kernel_Flag;
  22. extern USB_INT_FLAG USB_Int_Flag;
  23. extern USB_DEVICE USB_Device;
  24. extern UI Temp,PIO_Count;
  25. extern UC Device_Config_Value;
  26. extern UC idata Endpt_FIFO[MAX_BUF];
  27. extern void DMA_Init(void);
  28. extern ULI bytecount;
  29. extern UC Address_Count;
  30. extern UC xdata Address[20];
  31. //***********************************************************************
  32. //*                *
  33. //*                  Prototype Routine Definition      *
  34. //*                *
  35. //***********************************************************************
  36. void Init_D14_SFR(void);
  37. void Init_Endpoint(void);
  38. void Init_Main(void);
  39. void Init_8051(void);
  40. void Init_D14(void);
  41. //***********************************************************************
  42. //*                *
  43. //*                      Variable Definition        *
  44. //*                *
  45. //***********************************************************************
  46. TIMER Timer;
  47. DATA_SWAP idata Data_Swap;
  48. DMA_INT_FLAG DMA_Int_Flag;
  49. UI count;
  50. UC Device_Config_Value;
  51. UC  Type;
  52. UI idata Init_Count;
  53. volatile D14_CNTRL_REG xdata D14_Cntrl_Reg _at_ 0x7000;
  54. D14_CNTRL_REG xdata *D14_Cntrl_Ptr = &D14_Cntrl_Reg;
  55. //***********************************************************************
  56. //*                     *
  57. //* Routine  : Init_Main                                           *
  58. //* Input : None                           *
  59. //* Output : None                                       *
  60. //* Function : To initialize the D14 and the 8051               *
  61. //*                *
  62. //***********************************************************************
  63. void Init_Main(void)
  64. {
  65. AUXR = 0x02;
  66. CKCON = 0x01;
  67. //disable ISP1581 chip select
  68. ISP1581_CS = 1; //关1581片选
  69. bytecount = 0;
  70. PIO_Count = 64;
  71.     Type = 0;
  72. USB_Device.BITS.DMA_Test_Mode = PIO_Test;
  73. //初始化8051
  74. Init_8051();
  75. ISP1581_CS = 0; //片选ISP1581
  76. D14_Cntrl_Reg.D14_MODE.BITS.SOFTCT = 0;
  77. //检查是否连接了ISP1581
  78. do
  79. {
  80. //reset ISP1581                  
  81. ISP1581_RESET = 0;
  82. Start_mSEC_Timer(100);
  83. ISP1581_RESET = 1;
  84. Start_mSEC_Timer(100);
  85. //读取接口器件是否ISP1581            
  86. if(D14_Cntrl_Ptr->D14_CHIP_ID_MBYTE == 0x81 && D14_Cntrl_Ptr->D14_CHIP_ID_MSB == 0x15)
  87. break;
  88. }while(1);
  89. //初始化标志寄存器
  90. USB_Int_Flag.VALUE = 0;//USB中断标志寄存器
  91. DMA_Int_Flag.VALUE = 0;//DMA中断标志寄存器
  92. Kernel_Flag.VALUE = 0;//ISP1581状态标志寄存器
  93. //设置为设备默认状态
  94. Kernel_Flag.BITS.HS_FS_State = FULL_SPEED;//设置为全速状态
  95. HS_FS_LED = FULL_SPEED_LED;
  96. //初始化ISP1581
  97. Init_D14();
  98. }
  99. //***********************************************************************
  100. //*                     *
  101. //* Routine  : Init 8051                                         *
  102. //* Input : 8051 Special Function Register                *
  103. //* Output : None                                      *
  104. //* Function : To initialize 8051                               *
  105. //*                *
  106. //***********************************************************************
  107. void Init_8051(void)
  108. {
  109. //定义定时器方式
  110. TMOD = 0x01;
  111. //初始化定时器时间
  112. Timer.mSEC_Scale = 2000;
  113. Timer.Hundred_mSEC_Scale = 20000;
  114. //reset timer control
  115. TCON = 0;     
  116. //disable all interrupt
  117. EA = 0;   
  118. //disable UART interrupt
  119. //disable timer 1 overflow interrupt
  120. //disable external interrupt 1
  121. //enable timer 0 overflow interrupt
  122. //enable external interrupt 0
  123. IE = 0x02;
  124. //reset interrupt priority
  125. IP = 0;
  126. PT1 = 1;
  127. PT0 = 1;
  128. // EX0 = 1; //开ISP1581中断
  129. //enable all interrupt
  130. EA = 1;
  131. //disable all power mode control
  132. //enable half/doble baud rate 
  133. PCON = 0x40;
  134. }
  135. //***********************************************************************
  136. //*                     *
  137. //* Routine  : Init D14                                          *
  138. //* Input : ISP1581 SFR                                   *
  139. //* Output : None                                      *
  140. //* Function : To initialize ISP1581                            *
  141. //*                *
  142. //***********************************************************************
  143. void Init_D14(void)
  144. {
  145. //初始化ISP1581寄存器
  146. Init_D14_SFR();
  147. //初始化ISP1581端点
  148. Init_Endpoint();
  149. //初始化ISP1581工作标志寄存器
  150. USB_Device.BITS.State = USB_Default;
  151. Device_Config_Value = 0;
  152. USB_Device.BITS.Alter_Interface = 0;
  153. USB_Device.BITS.Big_Endian = On;
  154. Kernel_Flag.BITS.Tx_Done = 0;
  155. EX0 = 1; //开ISP1581中断
  156. }
  157. //***********************************************************************
  158. //*                     *
  159. //* Routine  : Init D14 SFR                                      *
  160. //* Input : ISP1581 SFR                                   *
  161. //* Output : None                                      *
  162. //* Function : To initialize ISP1581                            *
  163. //*                *
  164. //***********************************************************************
  165. void Init_D14_SFR(void)
  166. {
  167. //enable Global Interrupt enable
  168. //enable soft connect and other feature
  169. //enable wakeup on chip select
  170. //disable soft connect
  171. //设置模式:时钟始终有效,全局中断使能,片选唤醒
  172. D14_Cntrl_Reg.D14_MODE.VALUE |= 0x8C;
  173. //set all interrupt source to mode 1
  174. //设置全部中断为模式1,电平触发,低电平有效
  175. D14_Cntrl_Reg.D14_INT_CONFIG.VALUE = 0x54;
  176. //设置中断使能寄存器
  177. //注释: D14_Cntrl_Reg.D14_INT_ENABLE.VALUE = 0x790D0000;先发送高字节
  178. //0x14(xdata)=0x79
  179. //0x15(xdata)=0x0D
  180. //0x16(xdata)=00
  181. //0x17(xdata0=00
  182. //使用端点0和端点2
  183. D14_Cntrl_Reg.D14_INT_ENABLE.VALUE = 0x39fd0000;
  184. }
  185. //***********************************************************************
  186. //*                     *
  187. //* Routine  : Init Endpoint                                     *
  188. //* Input : ISP1581 FIFO                                  *
  189. //* Output : None                                      *
  190. //* Function : To initialize ISP1581 endpoint FIFO              *
  191. //*                *
  192. //***********************************************************************
  193. void Init_Endpoint(void)
  194. {
  195. //设置全速端点
  196. if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
  197. {
  198. //设置全速端点FIFO大小
  199. //Interrupt Out MaxPacketSize Endpoint
  200. D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;//选择端点
  201. D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000; //FIFO=64bytes
  202. //Interrupt In MaxPacketSize Endpoint
  203. D14_Cntrl_Reg.D14_ENDPT_INDEX = 3;//选择端点
  204. D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
  205. //Bulk Out MaxPacketSize Endpoint
  206. D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;//选择端点
  207. D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
  208. //Bulk In MaxPacketSize Endpoint
  209. D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;//选择端点
  210. D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
  211. //Iso Out MaxPacketSize Endpoint
  212. D14_Cntrl_Reg.D14_ENDPT_INDEX = 6;//选择端点
  213. D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
  214. //Iso In MaxPacketSize Endpoint
  215. D14_Cntrl_Reg.D14_ENDPT_INDEX = 7;//选择端点
  216. D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
  217. //设置全速端点类型
  218. //Interrupt In Endpoint Type
  219. D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;//选择端点
  220. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1700;//设置为中断,使用双缓冲,禁止FIFO,禁止无空包
  221. //Interrupt Out Endpoint Type
  222. D14_Cntrl_Reg.D14_ENDPT_INDEX = 3;//选择端点
  223. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1700;//设置为中断,使用双缓冲,禁止FIFO,禁止无空包
  224. //Bulk Out Endpoint Type
  225. D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;//选择端点
  226. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1600;//设置为批量,使用双缓冲,禁止FIFO,禁止无空包
  227. //Bulk In Endpoint Type
  228. D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;//选择端点
  229. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1600;//设置为批量,使用双缓冲,禁止FIFO,禁止无空包
  230. //Iso Out Endpoint Type
  231. D14_Cntrl_Reg.D14_ENDPT_INDEX = 6;//选择端点
  232. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1500;//设置为同步,使用双缓冲,禁止FIFO,禁止无空包
  233. //Iso In Endpoint Type
  234. D14_Cntrl_Reg.D14_ENDPT_INDEX = 7;//选择端点
  235. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1500;//设置为同步,使用双缓冲,禁止FIFO,禁止无空包
  236. //端点使能
  237. //enable FIFO
  238. D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;//选择端点
  239. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
  240. //enable FIFO
  241. D14_Cntrl_Reg.D14_ENDPT_INDEX = 3;//选择端点
  242. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
  243. //enable FIFO
  244. D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;//选择端点
  245. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
  246. //enable FIFO
  247. D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;//选择端点
  248. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
  249. //enable FIFO
  250. D14_Cntrl_Reg.D14_ENDPT_INDEX = 6;//选择端点
  251. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
  252. //enable FIFO
  253. D14_Cntrl_Reg.D14_ENDPT_INDEX = 7;//选择端点
  254. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
  255. }
  256. //设置高速端点
  257. if(Kernel_Flag.BITS.HS_FS_State == HIGH_SPEED)
  258. {
  259. //设置全速端点FIFO大小
  260. //Interrupt Out MaxPacketSize Endpoint
  261. D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;//选择端点
  262. D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
  263. //Interrupt In MaxPacketSize Endpoint
  264. D14_Cntrl_Reg.D14_ENDPT_INDEX = 3;//选择端点
  265. D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
  266. //Bulk Out MaxPacketSize Endpoint
  267. D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;//选择端点
  268. D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x0002;//FIFO=64bytes
  269. //Bulk In MaxPacketSize Endpoint
  270. D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;//选择端点
  271. D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x0002;//FIFO=64bytes
  272. //Iso Out MaxPacketSize Endpoint
  273. D14_Cntrl_Reg.D14_ENDPT_INDEX = 6;//选择端点
  274. D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
  275. //Iso In MaxPacketSize Endpoint
  276. D14_Cntrl_Reg.D14_ENDPT_INDEX = 7;//选择端点
  277. D14_Cntrl_Reg.D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
  278. //设置高速端点类型
  279. //Interrupt In Endpoint Type
  280. D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;//选择端点
  281. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1700;
  282. //Interrupt Out Endpoint Type
  283. D14_Cntrl_Reg.D14_ENDPT_INDEX = 3;//选择端点
  284. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1700;
  285. //Bulk Out Endpoint Type
  286. D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;//选择端点
  287. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1600;
  288. //Bulk In Endpoint Type
  289. D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;//选择端点
  290. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1600;
  291. //Iso Out Endpoint Type
  292. D14_Cntrl_Reg.D14_ENDPT_INDEX = 6;//选择端点
  293. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1500;
  294. //Iso In Endpoint Type
  295. D14_Cntrl_Reg.D14_ENDPT_INDEX = 7;//选择端点
  296. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE = 0x1500;
  297. //端点使能
  298. //enable FIFO
  299. D14_Cntrl_Reg.D14_ENDPT_INDEX = 2;//选择端点
  300. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
  301. //enable FIFO
  302. D14_Cntrl_Reg.D14_ENDPT_INDEX = 3;//选择端点
  303. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
  304. //enable FIFO
  305. D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;//选择端点
  306. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
  307. //enable FIFO
  308. D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;//选择端点
  309. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
  310. //enable FIFO
  311. D14_Cntrl_Reg.D14_ENDPT_INDEX = 6;//选择端点
  312. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
  313. //enable FIFO
  314. D14_Cntrl_Reg.D14_ENDPT_INDEX = 7;//选择端点
  315. D14_Cntrl_Reg.D14_ENDPT_TYPE.VALUE |= 0x0800;
  316. }
  317. //设置默认地址有效
  318. D14_Cntrl_Reg.D14_ADDRESS.VALUE = 0x80;
  319. }