32musb.lst
来自「这个是一个完整的MP3项目」· LST 代码 · 共 941 行 · 第 1/4 页
LST
941 行
222 2 UEPDATX = Data[i];//将数据写入端点
223 2 }
224 1
225 1 UEPSTAX |= TXRDY;//发送数据Sending the data,this action will switch between bank0 and bank1
226 1
227 1 }
228
229 void Get_Status()
230 {
231 1 printu("Get_Status");
232 1 }
233
234 void Clear_Feature()
235 {
236 1 printu("Clear_Feature");
237 1 }
238
239 void Set_Feature()
240 {
241 1 printu("Set_Feature");
C51 COMPILER V7.20 32MUSB 03/21/2007 13:34:25 PAGE 5
242 1 }
243
244 void Set_Address(unsigned char EpNum)
245 {
246 1 // unsigned char Test[] = {0};
247 1 WriteEp(0, 0, 0);//在Status阶段过后才能改变设备地址
248 1
249 1 USBADDR |= EpNum;//设置地址
250 1 USBADDR |= FEN;//地址使能
251 1 USBCON |= FADDEN;
252 1
253 1 // printuf("\nSet_Address : %x\n", USBADDR);
254 1 }
255
256 void Get_Descriptor(unsigned char DesType, unsigned char nLength)
257 {
258 1 if (DesType == 0x01)
259 1 {
260 2 WriteEp(0, 18, Device_Descriptor);//提供设备描述符
261 2 }
262 1 if ((DesType == 0x02) && (nLength == 0x09))
263 1 {
264 2 WriteEp(0, 9, Configuration_Descriptor_All);//提供配置描述符
265 2 }
266 1 //提供全部描述符
267 1 if ((DesType == 0x02) && (nLength == 0xff))
268 1 {
269 2 WriteEp(0, 32, Configuration_Descriptor_All);
270 2 WriteEp(0, 2, &Device_Descriptor[4]);
271 2 }
272 1 //提供全部描述符
273 1 if ((DesType == 0x02) && (nLength == 0x20))
274 1 {
275 2 WriteEp(0, 32, Configuration_Descriptor_All);
276 2 }
277 1
278 1 // printu("Get_Descriptor\n");
279 1 }
280
281 void Get_Configuration()
282 {
283 1 printu("Get_Configuration");
284 1 }
285
286 void Set_Configuration(unsigned char wValue)
287 {
288 1
289 1 if (wValue == 0)
290 1 {
291 2 /* put device in unconfigured state */
292 2 /* Disable all endpoints but EPP0. *///init_unconfig
293 2
294 2 UEPNUM = 0x00;//Ep0 as control Endpoint
295 2 UEPCONX = 0x80;
296 2
297 2 UEPNUM = 0x01;//Ep1 as Bulk-in Endpoint
298 2 UEPCONX = 0x86;
299 2
300 2 UEPNUM = 0x02;//Ep2 as Bulk-out Endpoint
301 2 UEPCONX = 0x82;
302 2
303 2 // WriteEp(0, &Device_Descriptor[4], 2);
C51 COMPILER V7.20 32MUSB 03/21/2007 13:34:25 PAGE 6
304 2 USBCON &= (~CONFG);
305 2 WriteEp(0, 0, 0);//状态传送阶段之前完成指定操作
306 2
307 2 }
308 1 else if (wValue == 1) {
309 2 /* Configure device */
310 2 /* Enable generic/iso endpoints. init_config*/
311 2
312 2 UEPNUM = 0x00;//Ep0 as control Endpoint
313 2 UEPCONX = 0x80;
314 2
315 2 UEPNUM = 0x01;//Ep1 as Bulk-in Endpoint
316 2 UEPCONX = 0x86;
317 2
318 2 UEPNUM = 0x02;//Ep2 as Bulk-out Endpoint
319 2 UEPCONX = 0x82;
320 2
321 2
322 2 USBCON |= CONFG;
323 2 WriteEp(0, 0, 0);//状态传送阶段之前完成指定操作
324 2
325 2 }
326 1 // printu("Set_Configuration ");
327 1 }
328
329 void Get_Interface()
330 {
331 1 printu("Get_Interface");
332 1 }
333
334 void Set_Interface()
335 {
336 1 WriteEp(0, 0, 0);
337 1 printu("Set_Interface ");
338 1 }
339
340 void Ep0Int()
341 {
342 1 unsigned char i, j;
343 1 unsigned char ControlData[32] = {0, };
344 1
345 1 i = ReadEp(0, ControlData);//读端点0
346 1 P3_5 = 0;//USB通信指示灯点亮
347 1 j = ControlData[0] & 0x60;//过滤端点0数据
348 1 if ((j == 0) && i)
349 1 {//如果为标准USB请求
350 2 switch (ControlData[1])
351 2 {//分别按请求类别进行处理
352 3 case get_status : Get_Status(); break;
353 3 case clear_feature : Clear_Feature(); break;
354 3
355 3 case set_feature : Set_Feature(); break;
356 3
357 3 case set_address : Set_Address(ControlData[2]); break;
358 3 case get_descriptor : Get_Descriptor(ControlData[3], ControlData[6]); break;
359 3
360 3 case get_configuration : Get_Configuration(); break;
361 3 case set_configuration : Set_Configuration(ControlData[2]); break;
362 3 case get_interface : Get_Interface(); break;
363 3 case set_interface : Set_Interface(); break;
364 3 default : Reserved(); break;
365 3 }
C51 COMPILER V7.20 32MUSB 03/21/2007 13:34:25 PAGE 7
366 2 }
367 1 else if (ControlData[0] == 0xa1)
368 1 {//特殊请求,特殊处理,直接返回Status
369 2 WriteEp(0, 0, 0);
370 2 }
371 1
372 1 P3_5 = 1;//USB通信指示灯关闭
373 1
374 1 }
375
376 //Bulk-In端点处理
377 void main_txdone()
378 {
379 1 unsigned char i;
380 1
381 1 // printuf("Bulk_State : %x\n", bulk_state);
382 1 P3_5 = 0;////USB通信指示灯点亮
383 1
384 1 UEPSTAX &= (~(TXCMP));//清中断标志位clear TXCMP
385 1 switch (bulk_state)
386 1 {//按不同的传输状态,进行不同的后续处理
387 2 case BULK_DATA_TRANS :
388 2 TransDataGoOn();
389 2 break;
390 2 case BULK_DATA_END :
391 2 UEPNUM = 1;//指向相应端点
392 2 UEPSTAX |= DIR;//设置方向为写Set for status of a Control In transaction
393 2
394 2 for (i=0; i<13; i++)
395 2 {
396 3 UEPDATX = bulk_CSW[i];//将数据写入端点
397 3 }
398 2
399 2 UEPSTAX |= TXRDY;//发送数据Sending the data,this action will switch between bank0 and bank1
400 2
401 2 bulk_state = BULK_CSW_END; //置传输状态。
402 2
403 2 break;
404 2 case BULK_REQEST_TRANS :
405 2 TransRequestGoOn();
406 2 break;
407 2 case BULK_CSW_END :
408 2 break;
409 2 default : return;
410 2 }
411 1
412 1 P3_5 = 1;//USB通信指示灯关闭
413 1 }
414
415 //Bulk-Out端点处理
416 void main_rxdone()
417 {
418 1
419 1 unsigned char nLength;
420 1 // printu("\nmain_rxdone ");
421 1 // P3_5 = 0;//USB通信指示灯点亮
422 1 //ReadEp(2, Bulk_Out_Buf);//读取端点2
423 1 // ReadEp(2, BulkPoint);//读取端点2
424 1
425 1
426 1 UEPNUM = 2;//指向相应端点
427 1 BulkStartPoint = BulkPoint;
C51 COMPILER V7.20 32MUSB 03/21/2007 13:34:25 PAGE 8
428 1 nLength = UBYCTX;//读取端点数据长度
429 1
430 1 while (nLength--)
431 1 {
432 2 *(BulkPoint++) = UEPDATX;
433 2 }
434 1
435 1 // UEPSTAX &= ~(RXOUTB0 | RXOUTB1 | RXSETUP);//清中断标志
436 1 UEPSTAX &= 0xb9;//清中断标志
437 1
438 1 //printuf("%x", *BulkStartPoint);
439 1 if ((bulk_state != BULK_DATA_RECIEVE) && (*BulkStartPoint == 0x55))
440 1 {
441 2 InterpretCBW();//判断是否为命令数据
442 2 BulkPoint = BulkStartPoint;
443 2 }
444 1 else if (BulkPoint == Page_Buf + 512)
445 1 {
446 2 Trans_Data2PC();//为普通数据时转向数据接收处理程序
447 2 }
448 1 // P3_5 = 1;//USB通信指示灯关闭
449 1
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?