📄 32musb.lst
字号:
224 void Get_Configuration()
225 {
226 1 printu("Get_Configuration");
227 1 }
228
229 void Set_Configuration(unsigned char wValue)
230 {
231 1
232 1 if (wValue == 0)
233 1 {
234 2 /* put device in unconfigured state */
235 2 /* Disable all endpoints but EPP0. *///init_unconfig
236 2
237 2 UEPNUM = 0x00;//Ep0 as control Endpoint
238 2 UEPCONX = 0x80;
239 2
240 2 UEPNUM = 0x01;//Ep1 as Bulk-in Endpoint
241 2 UEPCONX = 0x86;
C51 COMPILER V7.20 32MUSB 03/21/2007 13:33:19 PAGE 5
242 2
243 2 UEPNUM = 0x02;//Ep2 as Bulk-out Endpoint
244 2 UEPCONX = 0x82;
245 2
246 2 // WriteEp(0, &Device_Descriptor[4], 2);
247 2 USBCON &= (~CONFG);
248 2 WriteEp(0, 0, 0);//状态传送阶段之前完成指定操作
249 2
250 2 }
251 1 else if (wValue == 1) {
252 2 /* Configure device */
253 2 /* Enable generic/iso endpoints. init_config*/
254 2
255 2 UEPNUM = 0x00;//Ep0 as control Endpoint
256 2 UEPCONX = 0x80;
257 2
258 2 UEPNUM = 0x01;//Ep1 as Bulk-in Endpoint
259 2 UEPCONX = 0x86;
260 2
261 2 UEPNUM = 0x02;//Ep2 as Bulk-out Endpoint
262 2 UEPCONX = 0x82;
263 2
264 2
265 2 USBCON |= CONFG;
266 2 WriteEp(0, 0, 0);//状态传送阶段之前完成指定操作
267 2
268 2 }
269 1 // printu("Set_Configuration ");
270 1 }
271
272 void Get_Interface()
273 {
274 1 printu("Get_Interface");
275 1 }
276
277 void Set_Interface()
278 {
279 1 WriteEp(0, 0, 0);
280 1 printu("Set_Interface ");
281 1 }
282
283 void Ep0Int()
284 {
285 1 unsigned char i, j;
286 1 unsigned char ControlData[32] = {0, };
287 1
288 1 i = ReadEp(0, ControlData);//读端点0
289 1 P3_5 = 0;//USB通信指示灯点亮
290 1 j = ControlData[0] & 0x60;//过滤端点0数据
291 1 if ((j == 0) && i)
292 1 {//如果为标准USB请求
293 2 switch (ControlData[1])
294 2 {//分别按请求类别进行处理
295 3 case get_status : Get_Status(); break;
296 3 case clear_feature : Clear_Feature(); break;
297 3
298 3 case set_feature : Set_Feature(); break;
299 3
300 3 case set_address : Set_Address(ControlData[2]); break;
301 3 case get_descriptor : Get_Descriptor(ControlData[3], ControlData[6]); break;
302 3
303 3 case get_configuration : Get_Configuration(); break;
C51 COMPILER V7.20 32MUSB 03/21/2007 13:33:19 PAGE 6
304 3 case set_configuration : Set_Configuration(ControlData[2]); break;
305 3 case get_interface : Get_Interface(); break;
306 3 case set_interface : Set_Interface(); break;
307 3 default : Reserved(); break;
308 3 }
309 2 }
310 1 else if (ControlData[0] == 0xa1)
311 1 {//特殊请求,特殊处理,直接返回Status
312 2 WriteEp(0, 0, 0);
313 2 }
314 1
315 1 P3_5 = 1;//USB通信指示灯关闭
316 1
317 1 }
318
319 //Bulk-In端点处理
320 void main_txdone()
321 {
322 1 unsigned char i;
323 1
324 1 // printuf("Bulk_State : %x\n", bulk_state);
325 1 P3_5 = 0;////USB通信指示灯点亮
326 1
327 1 UEPSTAX &= (~(TXCMP));//清中断标志位clear TXCMP
328 1 switch (bulk_state)
329 1 {//按不同的传输状态,进行不同的后续处理
330 2 case BULK_DATA_TRANS :
331 2 TransDataGoOn();
332 2 break;
333 2 case BULK_DATA_END :
334 2 UEPNUM = 1;//指向相应端点
335 2 UEPSTAX |= DIR;//设置方向为写Set for status of a Control In transaction
336 2
337 2 for (i=0; i<13; i++)
338 2 {
339 3 UEPDATX = bulk_CSW[i];//将数据写入端点
340 3 }
341 2
342 2 UEPSTAX |= TXRDY;//发送数据Sending the data,this action will switch between bank0 and bank1
343 2
344 2 bulk_state = BULK_CSW_END; //置传输状态。
345 2
346 2 break;
347 2 case BULK_REQEST_TRANS :
348 2 TransRequestGoOn();
349 2 break;
350 2 case BULK_CSW_END :
351 2 break;
352 2 default : return;
353 2 }
354 1
355 1 P3_5 = 1;//USB通信指示灯关闭
356 1 }
357
358 //Bulk-Out端点处理
359 void main_rxdone()
360 {
361 1
362 1 unsigned char nLength;
363 1 // printu("\nmain_rxdone ");
364 1 // P3_5 = 0;//USB通信指示灯点亮
365 1 //ReadEp(2, Bulk_Out_Buf);//读取端点2
C51 COMPILER V7.20 32MUSB 03/21/2007 13:33:19 PAGE 7
366 1 // ReadEp(2, BulkPoint);//读取端点2
367 1
368 1
369 1 UEPNUM = 2;//指向相应端点
370 1 BulkStartPoint = BulkPoint;
371 1 nLength = UBYCTX;//读取端点数据长度
372 1
373 1 while (nLength--)
374 1 {
375 2 *(BulkPoint++) = UEPDATX;
376 2 }
377 1
378 1 // UEPSTAX &= ~(RXOUTB0 | RXOUTB1 | RXSETUP);//清中断标志
379 1 UEPSTAX &= 0xb9;//清中断标志
380 1
381 1 //printuf("%x", *BulkStartPoint);
382 1 if ((bulk_state != BULK_DATA_RECIEVE) && (*BulkStartPoint == 0x55))
383 1 {
384 2 InterpretCBW();//判断是否为命令数据
385 2 BulkPoint = BulkStartPoint;
386 2 }
387 1 else if (BulkPoint == Page_Buf + 512)
388 1 {
389 2 Trans_Data2PC();//为普通数据时转向数据接收处理程序
390 2 }
391 1 // P3_5 = 1;//USB通信指示灯关闭
392 1
393 1 }
394
395 void Reserved()
396 {
397 1 printuf("Undefined Interrupt Occured : %x\n", UEPINT);
398 1 }
399 //END OF USB DISK
400
401 void main()
402 {
403 1
404 1 // int i, j;
405 1 printu("UP-TECH MP3 USB Disk test!\n");
406 1 P4_4 |= 1;//USBLED off
407 1 P4_5 &= 0; //P3_3=0 LCD Power off, P3_3=1 LCD Power on
408 1
409 1 printu("Entering USB...\n");//输出进入U盘功能的信息
410 1 AtmelUSBInit(4, 11, 0);//PLL时钟配置,
411 1 EpEnable();//端点初始化
412 1 UEPNUM = 0;//指向端点0
413 1 BulkPoint = Page_Buf;
414 1
415 1 while (1)
416 1 {//轮询,检查相应端点是否有中断产生
417 2 //if(){BulkPoint=Page_Buf;i=0;}
418 2 if (UEPINT & EP1INT)
419 2 {
420 3 main_txdone();//Bulk-Out端点处理
421 3 }
422 2
423 2 if (UEPINT & EP2INT)
424 2 {
425 3 main_rxdone();//Bulk-In端点处理
426 3 }
427 2
C51 COMPILER V7.20 32MUSB 03/21/2007 13:33:19 PAGE 8
428 2 if (UEPINT & EP0INT)
429 2 {
430 3 Ep0Int();//端点0处理
431 3 }
432 2
433 2 UEPINT=0;//清中断状态寄存器
434 2 }
435 1
436 1 }
437
438
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 939 ----
CONSTANT SIZE = 245 ----
XDATA SIZE = 93 42
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -