电路原理图如下:
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
单片机源程序如下:
1. /*
2. * MP3模块测试程序
3. *
4. * 用途:MP3模块测试程序
5. * vs1003 的硬件测试程序,主控芯片为STC12LE5A60S2
6. * 其他的微处理器(带SPI接口的)只需稍加修改即可适用
7. * 对于不带硬SPI接口的微处理器可以用IO进行SPI的时序模拟
8. *
9. * 作者 日期 备注
10. * Huafeng Lin 20010/09/10 新增
11. * Huafeng Lin 20010/09/10 修改
12. *
13. */
14.
15. #include "vs1003.h"
16. #include "MusicDataMP3.c"
17.
18.
19. #include <intrins.h>
20.
21. #define uchar unsigned char
22. #define uint unsigned int
23. #define ulong unsigned long
24. #define bool bit
25. #define true 1
26. #define flase 0
27.
28.
29. //针对SD卡读写板调整引脚
30. #define uint8 unsigned char
31.
32. sbit MP3_XRESET = P3^2;
33.
34. #define Mp3PutInReset() { MP3_XRESET = 0; }
35.
36. #define Mp3ReleaseFromReset() { MP3_XRESET =1; }
37.
38. sbit MP3_XCS = P3^3;
39.
40. #define Mp3SelectControl() { MP3_XCS = 0; }
41.
42. #define Mp3DeselectControl() { MP3_XCS = 1; }
43.
44. sbit MP3_XDCS = P3^4;
45.
46. #define Mp3SelectData() { MP3_XDCS = 0; }
47.
48. #define Mp3DeselectData() { MP3_XDCS = 1; }
49.
50. sbit MP3_DREQ = P3^5;
51.
52. sbit c_SPI_SI = P1^5;
53. sbit c_SPI_SO = P1^6;
54. sbit c_SPI_CLK = P1^7;
55.
56. #define Macro_Set_SI_High() c_SPI_SI = 1
57. #define Macro_Set_SI_Low() c_SPI_SI = 0
58. #define Macro_Set_CLK_High() c_SPI_CLK = 1
59. #define Macro_Set_CLK_Low() c_SPI_CLK = 0
60.
61. void LCD_write_english_string(unsigned char X,unsigned char Y,char *s);
62.
63. //#define SPIWait() { while((S0SPSR & 0x80) == 0); }//等待SPI将数据发送完毕
64.
65. //#define SPI_RESULT_BYTE S0SPDR
66.
67. //extern long volatile timeval; //用于延时的全局变量
68. //1ms Delayfunction
69. //void Delay(uchar ucDelayCount)
70. void wait(uchar ucDelayCount)
71. {
72. uchar ucTempCount;
73. uchar uci;
74.
75. for(ucTempCount=0; ucTempCount<ucDelayCount; ucTempCount++)
76. {
77. // uci = 200; //Err
78. // uci = 250; //OK
79. uci = 230;
80. while(uci--)
81. {
82. _nop_();
83. }
84. }
85. }
86.
87. //#define wait(x) Delay(x)
88. /**********************************************************/
89. /* 函数名称 : MSPI_Init */
90. /* 函数功能 : 初始化SPI接口,设置为主机。 */
91. /* 参数 : 无 */
92. /* 返回值 : 无 */
93. /*--------------------------------------------------------*/
94. void MSPI_Init(void)
95. {
96. /*
97. PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00005500; //选择 SPI
98. S0SPCCR = 0x08; // SPI 时钟设置
99. S0SPCR = (0 << 3) | // CPHA = 0,
100. (0 << 4) | // CPOL = 0,
101. (1 << 5) | // MSTR = 1,
102. (0 << 6) | // LSBF = 0,
103. (0 << 7); // SPIE = 0,
104. */
105. c_SPI_SO = 1;
106. MP3_DREQ = 1;
107.
108. }
109.
110. /**********************************************************/
111. /* 函数名称 : InitPortVS1003 */
112. /* 函数功能 : MCU与vs1003接口的初始化 */
113. /* 参数 : 无 */
114. /* 返回值 : 无 */
115. /*--------------------------------------------------------*/
116. void InitPortVS1003(void)
117. {
118. MSPI_Init();//SPI口的初始化
119. // IODIR &= 0xfffeffff; //其他接口线的设置,其中dreq 为输入口
120. // IODIR |= MP3_XRESET | MP3_XCS | MP3_XDCS;//xRESET,xCS,xDS均为输出口
121. // IOSET |= MP3_XRESET | MP3_XCS | MP3_XDCS;//xRESET,xCS,xDS默认输出高电平
122. MP3_DREQ = 1; //置为输入
123.
124. MP3_XRESET = 1;
125. MP3_XCS = 1;
126. MP3_XDCS = 1;
127. }
128.
129. //uint8 SD_SPI_ReadByte(void);
130. //void SD_SPI_WriteByte(uint8 ucSendData);
131.
132. //#define SPI_RecByte() SD_SPI_ReadByte()
133. //#define SPIPutChar(x) SD_SPI_WriteByte(x)
134.
135. #if 1
136. /**********************************************************/
137. /* 函数名称 : SPIPutChar */
138. /* 函数功能 : 通过SPI发送一个字节的数据 */
139. /* 参数 : 待发送的字节数据 */
140. /* 返回值 : 无 */
141. /*--------------------------------------------------------*/
142. void SPIPutChar(unsigned char ucSendData)
143. {
144. // S0SPDR = c;
145. // while((S0SPSR & 0x80) == 0); //等待SPI将数据发送完毕
146. uchar ucCount;
147. uchar ucMaskCode;
148.
149. ucMaskCode = 0x80;
150. for(ucCount=0; ucCount<8; ucCount++)
151. {
152. Macro_Set_CLK_Low();
153.
154. if(ucMaskCode & ucSendData)
155. {
156. Macro_Set_SI_High();
157. }
158. else
159. {
160. Macro_Set_SI_Low();
161. }
162.
163. Macro_Set_CLK_High();
164. ucMaskCode >>= 1;
165.
166. }
167. }
168.
169. /*******************************************************************************************************************
170. ** 函数名称: INT8U SPI_RecByte() Name: INT8U SPI_RecByte()
171. ** 功能描述: 从SPI接口接收一个字节 Function: receive a byte from SPI interface
172. ** 输 入: 无 Input: NULL
173. ** 输 出: 收到的字节 Output: the byte that be received
174. ********************************************************************************************************************/
175. static uchar SPI_RecByte(void)
176. {
177. uchar ucReadData;
178. uchar ucCount;
179.
180. ucReadData = 0;
181. Macro_Set_SI_High();
182.
183. for(ucCount=0; ucCount<8; ucCount++)
184. {
185. ucReadData <<= 1;
186. //降低时钟频率
187. Macro_Set_CLK_Low();
188.
189.
190. if(c_SPI_SO)
191. {
192. ucReadData |= 0x01;
193. }
194. Macro_Set_CLK_High();
195.
196. }
197.
198. return(ucReadData);
199. }
200.
201. #endif
202.
203. /*************************************************************/
204. /* 函数名称 : Mp3WriteRegister */
205. /* 函数功能 : 写vs1003寄存器 */
206. /* 参数 : 寄存器地址,待写数据的高8位,待写数据的低8位 */
207. /* 返回值 : 无 */
208. /*-----------------------------------------------------------*/
209. void Mp3WriteRegister(unsigned char addressbyte, unsigned char highbyte, unsigned char lowbyte)
210. {
211. Mp3DeselectData();
212. Mp3SelectControl();//XCS = 0
213. SPIPutChar(VS_WRITE_COMMAND); //发送写寄存器命令
214. SPIPutChar(addressbyte); //发送寄存器的地址
215. SPIPutChar(highbyte); //发送待写数据的高8位
216. SPIPutChar(lowbyte); //发送待写数据的低8位
217. Mp3DeselectControl();
218. }
219.
220. /*************************************************************/
221. /* 函数名称 : Mp3ReadRegister */
222. /* 函数功能 : 写vs1003寄存器 */
223. /* 参数 : 寄存器地址 */
224. /* 返回值 : vs1003的16位寄存器的值 */
225. /*-----------------------------------------------------------*/
226. unsigned int Mp3ReadRegister(unsigned char addressbyte)
227. {
228. unsigned int resultvalue = 0;
229. uchar ucReadValue;
230.
231. Mp3DeselectData();
232. Mp3SelectControl();//XCS = 0
233. SPIPutChar(VS_READ_COMMAND); //发送读寄存器命令
234. SPIPutChar((addressbyte)); //发送寄存器的地址
235.
236. // SPIPutChar(0xff); //发送读时钟
237. // resultvalue = (SPI_RESULT_BYTE) << 8;//读取高8位数据
238. ucReadValue = SPI_RecByte();
239. resultvalue = ucReadValue<<8;
240. // SPIPutChar(0xff); //发送读时钟
241. // resultvalue |= (SPI_RESULT_BYTE); //读取低8位数据
242. ucReadValue = SPI_RecByte();
243. resultvalue |= ucReadValue;
244.
245. Mp3DeselectControl();
246. return resultvalue; //返回16位寄存器的值
247. }
248.
249. /**********************************************************/
250. /* 函数名称 : Mp3SoftReset */
251. /* 函数功能 : vs1003软件复位 */
252. /* 参数 : 无 */
253. /* 返回值 : 无 */
254. /*--------------------------------------------------------*/
255. void Mp3SoftReset(void)
256. {
257. Mp3WriteRegister (SPI_MODE, 0x08, 0x04); //软件复位
258.
259. wait(1); //延时1ms
260. while (MP3_DREQ == 0); //等待软件复位结束
261. Mp3WriteRegister(SPI_CLOCKF, 0x98, 0x00);//设置vs1003的时钟,3倍频
262. Mp3WriteRegister (SPI_AUDATA, 0xBB, 0x81); //采样率48k,立体声
263. Mp3WriteRegister(SPI_BASS, 0x00, 0x55);//设置重音
264. Mp3SetVolume(10,10);//设置音量
265. wait(1); //延时1ms
266.
267. //向vs1003发送4个字节无效数据,用以启动SPI发送
268. Mp3SelectData();
269. SPIPutChar(0);
270. SPIPutChar(0);
271. SPIPutChar(0);
272. SPIPutChar(0);
273. Mp3DeselectData();
274.
275. }
276. /**********************************************************/
277. /* 函数名称 : Mp3Reset */
278. /* 函数功能 : vs1003硬件复位 */
279. /* 参数 : 无 */
280. /* 返回值 : 无 */
281. /*--------------------------------------------------------*/
282. void Mp3Reset(void)
283. {
284. Mp3PutInReset();//xReset = 0 复位vs1003
285. wait(200);//延时100ms
286. SPIPutChar(0xff);//发送一个字节的无效数据,启动SPI传输
287. Mp3DeselectControl(); //xCS = 1
288. Mp3DeselectData(); //xDCS = 1
289. Mp3ReleaseFromReset(); //xRESET = 1
290. wait(200); //延时100ms
291. while (MP3_DREQ == 0);//等待DREQ为高
292.
293. wait(200); //延时100ms
294. Mp3SetVolume(50,50);
295. Mp3SoftReset();//vs1003软复位
296. }
297.
298.
299. bool CheckVS1003B_DRQ(void)
300. {
301. bool bResult;
302.
303. bResult =MP3_DREQ;
304. return(bResult);
305. }
306.
307. /***********************************************************/
308. /* 函数名称 : VsSineTest */
309. /* 函数功能 : vs1003正弦测试,将该函数放在while循环中, */
310. /* 如果能持续听到一高一低的声音,证明测试通过 */
311. /* 参数 : 无 */
312. /* 返回值 : 无 */
313. /*---------------------------------------------------------*/
314. void VsSineTest(void)
315. {
316. Mp3PutInReset(); //xReset = 0 复位vs1003
317. wait(200); //延时100ms
318. SPIPutChar(0xff);//发送一个字节的无效数据,启动SPI传输
319. Mp3DeselectControl();
320. Mp3DeselectData();
321. Mp3ReleaseFromReset();
322. wait(200);
323. Mp3SetVolume(50,50);
324.
325. Mp3WriteRegister(SPI_MODE,0x08,0x20);//进入vs1003的测试模式
326. while (MP3_DREQ == 0); //等待DREQ为高
327. Mp3SelectData(); //xDCS = 1,选择vs1003的数据接口
328.
329. //向vs1003发送正弦测试命令:0x53 0xef 0x6e n 0x00 0x00 0x00 0x00
330. //其中n = 0x24, 设定vs1003所产生的正弦波的频率值,具体计算方法见vs1003的datasheet
331. SPIPutChar(0x53);
332. SPIPutChar(0xef);
333. SPIPutChar(0x6e);
334. SPIPutChar(0x24);
335. SPIPutChar(0x00);
336. SPIPutChar(0x00);
337. SPIPutChar(0x00);
338. SPIPutChar(0x00);
339. // wait(500);
340. wait(250);
341. wait(250);
342. Mp3DeselectData();//程序执行到这里后应该能从耳机听到一个单一频率的声音
343.
344. //退出正弦测试
345. Mp3SelectData();
346. SPIPutChar(0x45);
347. SPIPutChar(0x78);
348. SPIPutChar(0x69);
349. SPIPutChar(0x74);
350. SPIPutChar(0x00);
351. SPIPutChar(0x00);
352. SPIPutChar(0x00);
353. SPIPutChar(0x00);
354. // wait(500);
355. wait(250);
356. wait(250);
357.
358. Mp3DeselectData();
359.
360. //再次进入正弦测试并设置n值为0x44,即将正弦波的频率设置为另外的值
361. Mp3SelectData();
362. SPIPutChar(0x53);
363. SPIPutChar(0xef);
364. SPIPutChar(0x6e);
365. SPIPutChar(0x44);
366. SPIPutChar(0x00);
367. SPIPutChar(0x00);
368. SPIPutChar(0x00);
369. SPIPutChar(0x00);
370. // wait(500);
371. wait(250);
372. wait(250);
373.
374. Mp3DeselectData();
375.
376. //退出正弦测试
377. Mp3SelectData();
378. SPIPutChar(0x45);
379. SPIPutChar(0x78);
380. SPIPutChar(0x69);
381. SPIPutChar(0x74);
382. SPIPutChar(0x00);
383. SPIPutChar(0x00);
384. SPIPutChar(0x00);
385. SPIPutChar(0x00);
386. // wait(500);
387. wait(250);
388. wait(250);
389.
390. Mp3DeselectData();
391. }
392.
393. void test_1003_PlayMP3File();
394.
395. void TestVS1003B(void)
396. {
397. Mp3Reset();
398. VsSineTest();
399. Mp3SoftReset();
400. test_1003_PlayMP3File();
401. }
402.
403. //写寄存器,参数,地址和数据
404. void VS1003B_WriteCMD(unsigned char addr, unsigned int dat)
405. {
406. /*
407. VS1003B_XDCS_H();
408. VS1003B_XCS_L();
409. VS1003B_WriteByte(0x02);
410. //delay_Nus(20);
411. VS1003B_WriteByte(addr);
412. VS1003B_WriteByte(dat>>8);
413. VS1003B_WriteByte(dat);
414. //delay_Nus(200);
415. VS1003B_XCS_H();
416. */
417. Mp3WriteRegister(addr,dat>>8,dat);
418. }
419.
420. //读寄存器,参数 地址 返回内容
421. unsigned int VS1003B_ReadCMD(unsigned char addr)
422. {
423. /*
424. unsigned int temp;
425. unsigned char temp1;
426. VS1003B_XDCS_H();
427. VS1003B_XCS_L();
428. VS1003B_WriteByte(0x03);
429. //delay_Nus(20);
430. VS1003B_WriteByte(addr);
431. temp= VS1003B_ReadByte();
432. temp=temp<<8;
433. temp1= VS1003B_ReadByte();
434. temp=temp|temp1;;
435. VS1003B_XCS_H();
436. return temp;
437. */
438. return(Mp3ReadRegister(addr));
439. }
440.
441. //写数据,音乐数据
442. void VS1003B_WriteDAT(unsigned char dat)
443. {
444. // VS1003B_XDCS_L();
445. // VS1003B_WriteByte(dat);
446. // VS1003B_XDCS_H();
447. // VS1003B_XCS_H();
448.
449. Mp3SelectData();
450. SPIPutChar(dat);
451. Mp3DeselectData();
452. Mp3DeselectControl();
453.
454. }
455.
456. //开启环绕声
457. void VS1003B_SetVirtualSurroundOn(void)
458. {
459. uchar ucRepeatCount;
460. uint uiModeValue;
461.
462. ucRepeatCount =0;
463.
464. while(1)//写时钟寄存器
465. {
466. uiModeValue = VS1003B_ReadCMD(0x00);
467. if(uiModeValue & 0x0001)
468. {
469. break;
470. }
471. else
472. {
473. uiModeValue |= 0x0001;
474. VS1003B_WriteCMD(0,uiModeValue);
475. }
476. ucRepeatCount++;
477. if(ucRepeatCount++ >10 )break;
478. }
479.
480. }
481.
482. //关闭环绕声
483. void VS1003B_SetVirtualSurroundOff(void)
484. {
485. uchar ucRepeatCount;
486. uint uiModeValue;
487.
488. ucRepeatCount =0;
489.
490. while(1)//写时钟寄存器
491. {
492. uiModeValue = VS1003B_ReadCMD(0x00);
493. if(uiModeValue & 0x0001)
494. {
495. break;
496. }
497. else
498. {
499. uiModeValue |= 0x0001;
500. VS1003B_WriteCMD(0,uiModeValue);
501. }
502. ucRepeatCount++;
503. if(ucRepeatCount++ >10 )break;
504. }
505.
506. }
507.
508. //增强重音
509. //入口参数 1.强度0-15
510. // 2.频率0-15 (X10Hz)
511. void VS1003B_SetBassEnhance(uchar ucValue, ucFrequencyID)
512. {
513. uchar ucRepeatCount;
514. uint uiWriteValue;
515. uint uiReadValue;
516.
517. ucRepeatCount =0;
518.
519. uiWriteValue = VS1003B_ReadCMD(0x02);
520.
521. uiWriteValue &= 0xFF00;
522. uiWriteValue |= ucValue<<4;
523. uiWriteValue &= (ucFrequencyID & 0x0F);
524.
525. while(1)//写时钟寄存器
526. {
527.
528. VS1003B_WriteCMD(2,uiWriteValue);
529. uiReadValue = VS1003B_ReadCMD(0x02);
530.
531. if(uiReadValue == uiWriteValue)
532. {
533. break;
534. }
535. ucRepeatCount++;
536. if(ucRepeatCount++ >10 )break;
537. }
538.
539. }
540.
541.
542. uint uiVolumeCount; //当前音量值
543.
544. //VS1003初始化,0成功 1失败
545. unsigned char VS1003B_Init()
546. {
547. unsigned char retry;
548. /*
549. PORT_INI();
550. DDRB|=0xa0;
551. VS1003B_DDR &=~(1<<VS1003B_DREQ);
552. //delay_Nus(50);
553. VS1003B_XCS_H();
554. VS1003B_XDCS_H();
555. VS1003B_XRESET_L();
556. VS1003B_Delay(0xffff);
557. VS1003B_XRESET_H();//使能芯片
558. VS1003B_SPI_Low();//先以低频操作
559. VS1003B_Delay(0xffff);//延时
560. */
561. Mp3Reset();
562.
563. retry=0;
564. while(VS1003B_ReadCMD(0x00) != 0x0800)//写mode寄存器
565. {
566. VS1003B_WriteCMD(0x00,0x0800);
567. if(retry++ >10 )break;//{PORTB|=_BV(PB1);break;}
568. }
569. retry=0;
570. /*while(VS1003B_ReadCMD(0x02) != 0x75)//写mode寄存器
571. {
572. VS1003B_WriteCMD(0x02,0x75);
573. if(retry++ >10 )break;//{PORTB|=_BV(PB1);break;}
574. }*/
575. retry=0;
576. while(VS1003B_ReadCMD(0x03) != 0x9800)//写时钟寄存器
577. {
578. VS1003B_WriteCMD(0x03,0x9800);
579. if(retry++ >10 )break;
580. }
581. ……………………
582.
583. …………限于本文篇幅 余下代码请从51黑下载附件…………
584.