📄 mp3.lst
字号:
201 1 }
202
203 void Get_Status()
204 {
205 1 printu("Get_Status ");
206 1 }
207
208 void Clear_Feature()
209 {
210 1 printu("Clear_Feature ");
211 1 }
212
213 void Set_Feature()
214 {
215 1 printu("Set_Feature ");
216 1 }
217
218 void Set_Address(unsigned char EpNum)
219 {
220 1 // unsigned char Test[]={0};
221 1 WriteEp(0, 0, 0);//在Status阶段过后才能改变设备地址
222 1
223 1 USBADDR |= EpNum;//设置地址
224 1 USBADDR |= FEN;//地址使能
225 1 USBCON |= FADDEN;
226 1
227 1 // printuf("\nSet_Address:%x\n",USBADDR);
228 1 }
229 void Get_Descriptor(unsigned char DesType, unsigned char nLength)
230 {
231 1 if (DesType == 0x01)
232 1 {
233 2 WriteEp(0, 18, Device_Descriptor);//提供设备描述符
234 2 }
235 1
236 1 if ((DesType == 0x02) && (nLength == 0x09))
237 1 {
238 2 WriteEp(0, 9, Configuration_Descriptor_All);//提供配置描述符
239 2 }
240 1 //提供全部描述符
241 1
C51 COMPILER V7.50 MP3 03/16/2006 09:11:14 PAGE 5
242 1 if ((DesType == 0x02) && (nLength == 0xff))
243 1 {
244 2 WriteEp(0, 32, Configuration_Descriptor_All);
245 2 WriteEp(0, 2, &Device_Descriptor[4]);
246 2 }
247 1 //提供全部描述符
248 1
249 1 if ((DesType == 0x02) && (nLength == 0x20))
250 1 {
251 2 WriteEp(0, 32, Configuration_Descriptor_All);
252 2 }
253 1
254 1 // printu("Get_Descriptor\n");
255 1 }
256
257 void Get_Configuration()
258 {
259 1 printu("Get_Configuration");
260 1 }
261
262 void Set_Configuration(unsigned char wValue)
263 {
264 1
265 1 if (wValue == 0)
266 1 {
267 2 /* put device in unconfigured state */
268 2 /* Disable all endpoints but EPP0. *///init_unconfig
269 2
270 2 UEPNUM = 0x00;//Ep0 as control Endpoint
271 2 UEPCONX = 0x80;
272 2
273 2 UEPNUM = 0x01;//Ep1 as Bulk-in Endpoint
274 2 UEPCONX = 0x86;
275 2
276 2 UEPNUM = 0x02;//Ep2 as Bulk-out Endpoint
277 2 UEPCONX = 0x82;
278 2
279 2 // WriteEp(0,&Device_Descriptor[4],2);
280 2 USBCON &= (~CONFG);
281 2 WriteEp(0, 0, 0);//状态传送阶段之前完成指定操作
282 2
283 2 }
284 1 else if (wValue == 1)
285 1 {
286 2 /* Configure device */
287 2 /* Enable generic/iso endpoints. init_config*/
288 2
289 2 UEPNUM = 0x00;//Ep0 as control Endpoint
290 2 UEPCONX = 0x80;
291 2
292 2 UEPNUM = 0x01;//Ep1 as Bulk-in Endpoint
293 2 UEPCONX = 0x86;
294 2
295 2 UEPNUM = 0x02;//Ep2 as Bulk-out Endpoint
296 2 UEPCONX = 0x82;
297 2
298 2
299 2 USBCON |= CONFG;
300 2 WriteEp(0, 0, 0);//状态传送阶段之前完成指定操作
301 2
302 2 }
303 1 // printu("Set_Configuration ");
C51 COMPILER V7.50 MP3 03/16/2006 09:11:14 PAGE 6
304 1 }
305
306 void Get_Interface()
307 {
308 1 printu("Get_Interface");
309 1 }
310
311 void Set_Interface()
312 {
313 1 WriteEp(0, 0, 0);
314 1 printu("Set_Interface");
315 1 }
316
317 void Ep0Int()
318 {
319 1 unsigned char i, j;
320 1 unsigned char ControlData[32] = {0, };
321 1 i = ReadEp(0, ControlData);//读端点0
322 1 P3_5 = 0;//USB通信指示灯点亮
323 1 j = ControlData[0] & 0x60;//过滤端点0数据
324 1
325 1 if ((j == 0) && i)
326 1 {//如果为标准USB请求
327 2 switch (ControlData[1])
328 2 {//分别按请求类别进行处理
329 3 case get_status : Get_Status(); break;
330 3 case clear_feature : Clear_Feature(); break;
331 3
332 3 case set_feature : Set_Feature(); break;
333 3
334 3 case set_address : Set_Address(ControlData[2]); break;
335 3 case get_descriptor : Get_Descriptor(ControlData[3], ControlData[6]); break;
336 3
337 3 case get_configuration : Get_Configuration(); break;
338 3 case set_configuration : Set_Configuration(ControlData[2]); break;
339 3 case get_interface : Get_Interface(); break;
340 3 case set_interface : Set_Interface(); break;
341 3 default : Reserved(); break;
342 3 }
343 2 }
344 1 else if (ControlData[0] == 0xa1)
345 1 {//特殊请求,特殊处理,直接返回Status
346 2 WriteEp(0, 0, 0);
347 2 }
348 1
349 1 P3_5 = 1;//USB通信指示灯关闭
350 1
351 1 }
352
353 //Bulk-In端点处理
354 void main_txdone()
355 {
356 1 // printuf("Bulk_State:%x\n",bulk_state);
357 1 P3_5 = 0;////USB通信指示灯点亮
358 1
359 1 UEPSTAX &= (~(TXCMP));//清中断标志位clear TXCMP
360 1 switch (bulk_state)
361 1 {//按不同的传输状态,进行不同的后续处理
362 2 case BULK_DATA_TRANS :
363 2 TransDataGoOn();
364 2 break;
365 2 case BULK_DATA_END :
C51 COMPILER V7.50 MP3 03/16/2006 09:11:14 PAGE 7
366 2 TransmitCSW();
367 2 break;
368 2 case BULK_REQEST_TRANS :
369 2 TransRequestGoOn();
370 2 break;
371 2 case BULK_CSW_END :
372 2 break;
373 2 default: return;
374 2 }
375 1 P3_5 = 1;//USB通信指示灯关闭
376 1 }
377
378 //Bulk-Out端点处理
379 void main_rxdone()
380 {
381 1 // printu("\nmain_rxdone ");
382 1 P3_5 = 0;//USB通信指示灯点亮
383 1 ReadEp(2, Bulk_Out_Buf);//读取端点2
384 1
385 1 if ((bulk_state != BULK_DATA_RECIEVE) && (Bulk_Out_Buf[0] == 0x55))
386 1 InterpretCBW();//判断是否为命令数据
387 1 else
388 1 Trans_Data2PC(); //为普通数据时转向数据接收处理程序
389 1
390 1 P3_5 = 1;//USB通信指示灯关闭
391 1
392 1 }
393
394 void Reserved()
395 {
396 1 printuf("Undefined Interrupt Occured : %x\n", UEPINT);
397 1 }
398 //END OF USB DISK
399 //---------Edit by kent-------------------------------------------------------------
400 void MP3FsInit(unsigned char NDIV, unsigned int RDIV, unsigned char MPCD, unsigned char AUCD)
401 { //!!!!!!!!!!!!!!!先清零!!!!!!!!!这个问题在调试的时候碰到了很多麻烦!!!!!!!!!!!!!!!!!!
402 1 //例如先置5后置11时发现变成了0f,因为0101|1011=1111=F,因此总是不能改歌
403 1 PLLNDIV = 0;
404 1 PLLRDIV = 0;
405 1 MP3CLK = 0;
406 1 AUDCLK = 0;
407 1 //PLL时钟的频率计算方法
408 1 // PLLclk=(OSCclk*(RDIV+1))/(int)(NDIV+1);
409 1 //set PLL CLK
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -