專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

單片機(jī)實(shí)現(xiàn)MP3播放的方法

作者:周華   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年03月27日   【字體:

    有一個(gè)東西你一定聽(tīng)說(shuō)過(guò)或用過(guò),那就MP3播放器。MP3播放器以其小巧的體積、強(qiáng)大的功能、優(yōu)異的音質(zhì)倍受人們的青睞。如果把它嵌入到我們的單片機(jī)系統(tǒng)中,實(shí)現(xiàn)音頻輸出,那么對(duì)系統(tǒng)的增色是不言而喻的。單獨(dú)拿單片機(jī)來(lái)說(shuō),要解碼MP3文件,是不可能的,因?yàn)閺奶幚硭俣群唾Y源各個(gè)方面都是不能滿足要求的。所以要依賴于專用MP3解碼芯片,而單片機(jī)要作的就是對(duì)其進(jìn)行控制。這里我們圍繞芬蘭VLSI公司出品的VS1003來(lái)進(jìn)行解MP3的實(shí)現(xiàn)方法。

    1、VS1003芯片

       1)芯片簡(jiǎn)介

          VS1003是由荷蘭VLSI公司出品的一款單芯片的MP3/WMA/MIDI音頻解碼和ADPCM編碼芯片,其擁有一個(gè)高性能低功耗的DSP處理器核VS_DSP,5K的指令RAM,0.5K的數(shù)據(jù)RAM,串行的控制和數(shù)據(jù)輸入接口, 4個(gè)通用IO口,一個(gè)UART口;同時(shí)片內(nèi)帶有一個(gè)可變采樣率的ADC、一個(gè)立體聲DAC以及音頻耳機(jī)放大器。

          VS1003通過(guò)一個(gè)串行接口來(lái)接收輸入的比特流,它可以作為一個(gè)系統(tǒng)的從機(jī)。輸入的比特流被解碼,然后通過(guò)一個(gè)數(shù)字竟是控制器到達(dá)一個(gè)18位過(guò)采樣多位 ε-ΔDAC。通過(guò)串行總線控制解碼器。除了基本的解碼,在用戶RAM中它還可以做其他特殊應(yīng)用,例如DSP音效處理。

       2)芯片實(shí)物與SiriuS板上的VS1003

                   

       3)芯片封裝

                       

           以下的講述都是針對(duì)于LQFP-48封裝的。

       4)VS1003特性

          1.能解碼MPEG1 與MPEG2音頻層III(CBR+VBR+ABR);WMA 4.0/4.1/7/8/9 5~384kbps所有流文件;WAV(PCM+IMA AD-PCM);產(chǎn)生MIDI/SP-MIDI文件。

          2.對(duì)話筒輸入或線路輸入的音頻信號(hào)進(jìn)行IMA ADPCMM編碼

          3.支持MP3和WAVV流

          4.高低音控制

          5.單時(shí)鐘12~13MHz

          6.內(nèi)部PLLL鎖相環(huán)時(shí)鐘倍頻器

          7.低功耗

          8.內(nèi)含高性能片上立體聲數(shù)模轉(zhuǎn)換器,兩聲道間無(wú)相位差

          9.內(nèi)含能驅(qū)動(dòng)30歐負(fù)載的耳機(jī)驅(qū)動(dòng)器

         10.模擬,數(shù)字,I/O單獨(dú)供電

         11.為用戶代碼和數(shù)據(jù)準(zhǔn)備的5.5KB片上RAM

         12.串行的控制/數(shù)據(jù)接口

         13.可被用作微處理器的從機(jī)

         14.特殊應(yīng)用的SPI Flash引導(dǎo)

         15.借高度用途的UART接口

         16.新功能可以通過(guò)軟件和4 GPIO添加

       5)VS1003的引腳定義

 

管腳名稱

 

LQFP-48

 

管腳類型

 

管腳功能

 

MICP

 

1

 

AI

 

同相差分話筒輸入,自偏壓

 

MICN

 

2

 

AI

 

反相差分話筒輸入,自偏壓

 

XRESET

 

3

 

DI

 

低電平有效,異步復(fù)位端

 

DGND0

 

4

 

DGND

 

處理器核與I/O地

 

CVDD0

 

5

 

CPWR

 

處理器核電源

 

IOVDD0

 

6

 

IOPWR

 

I/O電源

 

CVDD1

 

7

 

CPEW

 

處理器核電源

 

DREQ

 

8

 

DO

 

數(shù)據(jù)請(qǐng)求,輸入總線

 

GPIO/DCLK

 

9

 

DIO

 

通用I/O2 /串行數(shù)據(jù)總線時(shí)鐘

 

GPIO3/SDATA

 

10

 

DIO

 

通用I/O3 /串行數(shù)據(jù)總線數(shù)據(jù)

 

XDCS/BSYNC

 

13

 

DI

 

數(shù)據(jù)片選端/字節(jié)同步

 

IOVDD1

 

14

 

IOPWR

 

I/O 電源

 

VCO

 

15

 

DO

 

時(shí)鐘壓控振蕩器VCO 輸出

 

DGND1

 

16

 

DGND

 

處理器核與I/O 的地

 

XTALO

 

17

 

AO

 

晶振輸出

 

XTALI

 

18

 

AI

 

晶振輸入

 

IOVDD2

 

19

 

IOPWR

 

I/O 電源

 

DGND2

 

20

 

DGND

 

處理器核與I/O 地

 

DGND3

 

21

 

DGND

 

處理器核與I/O 地

 

DGND4

 

22

 

DGND

 

處理器核與I/O 地

 

XCS

 

23

 

DI

 

片選輸入,低電平有效

 

CVDD2

 

24

 

CPWR

 

處理器核電源

 

RX

 

26

 

DI

 

UART接收口,不用時(shí)接IOVDD

 

TX

 

27

 

DO

 

UART發(fā)送口

 

SCLK

 

28

 

DI

 

串行總線的時(shí)鐘

 

SI

 

29

 

DI

 

串行輸入

 

SO

 

30

 

DO3

 

串行輸出

 

CVDD3

 

31

 

CPWR

 

處理器核電源

 

TEST

 

32

 

DI

 

保留做測(cè)試,連接至IOVDD

 

GPIO0/SPIBOOT

 

33

 

DIO

 

通用I/O0 /SPIBOOT,使用100K 下拉電阻

 

GPIO1

 

34

 

DIO

 

通用I/O1

 

AGND0

 

37

 

APWR

 

模擬地,低噪聲參考地

 

AVDD0

 

38

 

APWR

 

模擬電源

 

RIGHT

 

39

 

AO

 

右聲道輸出

 

AGND1

 

40

 

APWR

 

模擬地

 

AGND2

 

41

 

APWR

 

模擬地

 

GBUF

 

42

 

AO

 

公共地緩沖器

 

AVDD1

 

43

 

APWR

 

模擬電源

 

RCAP

 

44

 

AIO

 

基準(zhǔn)濾波電容

 

AVDD2

 

45

 

APWR

 

模擬電源

 

LEFT

 

46

 

AO

 

左聲道輸出

 

AGND3

 

47

 

APWR

 

模擬地

 

LINE IN

 

48

 

AI

 

線路輸入

 

    6)VS1003的功能寄存器

           VS1003共有16個(gè)16位的寄存器,地址分別為0X0~0XF;除了模式寄存器(MODE,0X0)和狀態(tài)寄存器(STATUS,0X1)在復(fù)位后的初始值分別為0X800和OX3C外,其余的寄存器在VS1003初始化后的值均為0。下面將VS1003各寄存器逐一進(jìn)行介紹。

      1.MODE(地址:0X0 可讀寫(xiě))

        bit0:SM_DIFF

            SM_DIFF=0  正常音頻相位

            SM_DIFF=1  左聲道反轉(zhuǎn)

            當(dāng)SM_DIFF置位時(shí),VS1003將左聲道反相輸出,立體聲輸入將產(chǎn)生環(huán)繞效果,對(duì)于單聲道輸入將產(chǎn)生差分(反相)左/右聲道信號(hào)。

        bit1:SM_SETTOZERO

            置零。

        bit2:SM_RESET

            SM_RESET=1,VS1003軟復(fù)位。軟復(fù)位之后該位會(huì)自動(dòng)清零。

        bit3:SM_OUTOFWAV

            SM_OUTOFWAV=1,停止WAV解碼。

            當(dāng)你要中途停止WAV、WMA或者M(jìn)IDI文件的解碼時(shí),置位SM_OUTOFWAV,并向VS1003持續(xù)發(fā)送數(shù)據(jù)(對(duì)于WAV文件發(fā)送0)直到將SM_OUTOFWAV清零;同時(shí)SCI_HIDAT1也將被清零。

        bit4:SM_PDOWN

            SM_PDOWN=1,軟件省電模式,該模式不及硬件省電模式(可由VS1003的XRESET來(lái)激活)。

        bit5:SM_TESTS

            SM_TESTS=1,進(jìn)入SDI測(cè)試模式。

        bit6:SM_STREAM

            SM_STREAM=1,使能VS1003的流模式。

        bit7:SM_PLUSV

            SM_PLUSV=1,MP3+V解碼使能。

        bit8:SM_DACT

            SM_DACT=0,SCLK上升沿有效;SM_DACT=1,SCLK下降沿有效。

        bit9:SM_SDIORD

            SM_SDIORD=0,SDI總線字節(jié)數(shù)據(jù)MSB在前,即須先發(fā)送MSB;

            SM_SDIORD=1,SDI總線字節(jié)數(shù)據(jù)LSB在前,即須先發(fā)送LSB;

            該位的設(shè)置不會(huì)影響SCI總線。

        bit10:SM_SDISHARE

            SM_SDISHARE=1,SDI與SCI將共用一個(gè)片選信號(hào)(同時(shí)SM_SDINEW=1),即將XDCS與XCS這兩根信號(hào)線合為一條,能省去一個(gè)IO口。

        bit11:SM_SDINEW

            SM_SDINEW=1,VS1002本地模式(新模式)。VS1003在啟動(dòng)后默認(rèn)進(jìn)入該模式。(這里所說(shuō)的模式指的是總線模式。)

        bit12:SM_ADPCM

            SM_ADPCM=1,ADPCM錄音使能。

            同時(shí)置位SM_ADPCM和SM_RESET將使能VS1003的IMA ADPCM錄音功能。

        bit13:SM_ADPCM_HP

            SM_ADPCOM_HP=1,使能ADPCM高通濾波器。同時(shí)置位SM_ADPCM_HP、SM_ADPCM和SM_RESET將開(kāi)啟ADPCM錄音用高通濾波器,對(duì)錄音時(shí)的背景噪音有一定的抑制作用。

        bit14:SM_LINE_IN

            錄音輸入選擇,SMLINE_IN=1,選擇線入(line in);SM_LINE_IN=0,選擇麥克風(fēng)輸入(默認(rèn))。

      2.SCI_STATUS(地址:0X1 可讀寫(xiě))

        SCI_STATUS為VS1003的狀態(tài)寄存器,提供VS1003當(dāng)前狀態(tài)信息。

      3.SCI_BASS(地址:0X2 可讀寫(xiě))

重音/高音設(shè)置寄存器。

            VS1003的內(nèi)置的重音增強(qiáng)器VSBE是種高質(zhì)量的重音增強(qiáng)DSP算法,能夠最大限度的避免音頻削波。當(dāng)SB_AMPLITUDE(bit:7~4)不為零時(shí),重音增強(qiáng)器將使能?梢愿鶕(jù)個(gè)人需要來(lái)設(shè)置SB_AMPLITUDE。例如,SCI_BASS=0x00f6,即對(duì)60Hz以下的音頻信號(hào)進(jìn)行 15dB的增強(qiáng)。當(dāng)ST_AMPLITUDE(bit:15~12)不為零時(shí),高音增強(qiáng)將使能。例如,SCI_BASS=0x7a00,即10kHz以上的音頻信號(hào)進(jìn)行10.5dB的增強(qiáng)。

      4.SCI_CLOCKF(地址:0X3 可讀寫(xiě))

        bit15~bit13:SC_MULT

            時(shí)鐘輸入XTALI的倍頻設(shè)置,設(shè)置之后將啟動(dòng)VS1003內(nèi)置的倍頻器。

        bit12~bit11:SC_ADD

            用于在WMA流解碼時(shí)給倍頻器增加的額外的倍頻值。

        bit10~bit0:SC_FREQ

            當(dāng)XTALI輸入的時(shí)鐘不是12.288M時(shí)才需要設(shè)置該位段,其默認(rèn)值為0,即VS1003默認(rèn)使用的是12.228M的輸入時(shí)鐘。

      5.SCI_DECODE_TIME(地址:0X4 可讀寫(xiě))

        解碼時(shí)間寄存器。當(dāng)進(jìn)行正確的解碼時(shí),讀取該寄存器可以獲得當(dāng)前的解碼時(shí)長(zhǎng)(單位為秒)?梢愿脑摷拇嫫鞯闹担切轮淀氁獙(duì)該寄存器進(jìn)行兩次寫(xiě)操作。在每次軟件復(fù)位或是WAV(PCM、IMA ADPCM、WMA、MIDI)解碼開(kāi)始與結(jié)束時(shí)SCI_DECODE_TIME的值將清零。

      6.SCI_AUDATA(地址:0X5 可讀寫(xiě))

        當(dāng)進(jìn)行正確的解碼時(shí),該寄存器的值為當(dāng)前的采樣率(bit:15~bit1)和所使用的聲道(bit0)。采樣率須為2的倍數(shù);bit0=0,單聲道數(shù)據(jù),bit0=1,立體聲數(shù)據(jù)。寫(xiě)該寄存器半直接改變采樣率。

      7.SCI_WRAM(地址:0X6 可讀寫(xiě))

        讀寄存器用來(lái)加載用戶應(yīng)用程序和數(shù)據(jù)到VS1003的指令的數(shù)據(jù)RAM中。起始地址在SCI_WRAMADDR中進(jìn)行設(shè)置,且必須先于讀寫(xiě) SCI_WRAM。對(duì)于16位的數(shù)據(jù)可以在進(jìn)行一次SCI_WRAM的讀寫(xiě)中完成;而對(duì)32位的指令字來(lái)說(shuō)則需要兩次連續(xù)讀寫(xiě)。字節(jié)順序是大端模式,即高字節(jié)在前,低字節(jié)在后。在每一次完成全字讀寫(xiě)后,內(nèi)部指針將自動(dòng)增加。

      8. SCI_WRAMADDR(地址:0X7 可讀寫(xiě))

        用于設(shè)置RAM讀寫(xiě)的首地址。

      9.SPI_HDAT0gng SPI_HDAT1(地址:0X8 只讀)

        這兩個(gè)寄存器用來(lái)存放所解碼的音頻文件的相關(guān)信息,為只讀寄存器。

            當(dāng)為WAV文件時(shí),SPI_HDAT0=0X7761,SPI_HDAT1=0X7665;

            當(dāng)為WMA文件時(shí),SPI_HDAT0的值為解碼速率(字節(jié)/秒),要轉(zhuǎn)換為位率的話則將SPI_HDAT0的值乘8即可,SPI_HDAT1=0X574D;

            當(dāng)為MIDI文件時(shí),SPI_HDAT0的值可以參考VLSI的技術(shù)文檔第33頁(yè),SPI_HDAT1=0X4D54;

            當(dāng)為MP3文件時(shí),SPI_HDAT0和SPI_HDAT1包含較為復(fù)雜的信息(來(lái)自于解壓之后的MP3文件頭),包括當(dāng)前正在    解碼的MP3文件的采樣率、位率等,具體請(qǐng)參考數(shù)據(jù)手冊(cè)的第33頁(yè)到第34頁(yè)。復(fù)位后SPI_HDAT0和SPI_HDAT1將清零。

 

     10.SCI_AIADDR(地址:0XA 可讀寫(xiě))

        用戶應(yīng)用程序的起始地址,初始化先于SCI_WRAMADDR和SCI_WRAM。如果沒(méi)有使用任何用戶應(yīng)用程序,則該寄存器不應(yīng)進(jìn)行初始化,或是將其初始化為零。

     11.SCI_VOL(地址:0XB 可讀寫(xiě))

        音量控制寄存器。高八位用于設(shè)置左聲道,低八位用于設(shè)置右聲道。設(shè)置值為最大竟是的衰減倍數(shù),步進(jìn)值為0.5dB,范圍為0到255.最大竟是的設(shè)置值為 0x0000,而靜音為0xffff。例如,左聲道:-2.0dB,右聲道:-3.5dB,則SCI_VOL=(4X256)+7=0x0407。硬件復(fù)位將使SCI_VOL清零(最大音量),而軟件復(fù)位將不改變音量設(shè)置值。

        (設(shè)置靜音(SCI_COL=0XFFFF)將關(guān)閉模擬部分的供電。)

      12.SCI_AICTRL[X](地址:0XC~0XF 可讀寫(xiě))

        用于訪問(wèn)用戶應(yīng)用程序。

    7)VS1003有應(yīng)用電路

2、VS1003的驅(qū)動(dòng)方法

   這里就來(lái)介紹單片片對(duì)VS1003的控制方法,最終實(shí)現(xiàn)MP3播放。

   1)準(zhǔn)備工作

          在對(duì)VS1003進(jìn)行驅(qū)動(dòng)之前,我們需要確保以下幾點(diǎn)已經(jīng)沒(méi)問(wèn)題,否則后面的工作都將是沒(méi)有意義的。

          1.VS1003各部分的供電電壓與輸出電壓值是不同的。

 

供電部分

 

最小電壓

 

推薦電壓

 

最大電壓

 

AVDD(模擬部分)

 

2.5V

 

2.8V

 

3.6V

 

CVDD(數(shù)字部分,內(nèi)核)

 

2.4V

 

2.5V

 

2.7V

 

IOVDD(I/O電壓)

 

CVDD-0.6V

 

2.8V

 

3.6V

 

2.VS1003與單片機(jī)正確可靠連接。

                VS1003與單片機(jī)連接的引腳主要有7個(gè),分別為 SO、SI、SCLK、/XCS、/XRESET、DREQ、/XDCS。只有保證它們與單片機(jī)正確可靠的連接,才能對(duì)VS1003進(jìn)行有效的操作與控制。

   2)寫(xiě)命令操作

                要控制VS1003首先要實(shí)現(xiàn)的就是寫(xiě)命令,這是控制是否成功的前提。關(guān)于通信接口部分,是一種同步串行接口方式(SPI從機(jī)模式),它要求SCLK信號(hào)必須由外部電路產(chǎn)生,數(shù)據(jù)(SDATA)在SCLK的上升沿或下降沿時(shí)被寫(xiě)入。在筆者的實(shí)驗(yàn)中,采用的是軟件模擬SPI,讀者也可以選用帶有硬件SPI的單片機(jī)(如STC12系列、AVR系列等),驅(qū)動(dòng)效果會(huì)更好。寫(xiě)命令的過(guò)程如下:

                 1.等待DREQ為高(當(dāng)DREQ為低時(shí),說(shuō)明芯片還沒(méi)有就緒)

                 2.將XCS(命令片選)拉低

                 3.寫(xiě)入0x02

                 4.寫(xiě)入寄存器地址

                 5.分別寫(xiě)入數(shù)據(jù)的高字節(jié)與低字節(jié)

                 6.將XCS置高

             實(shí)現(xiàn)代碼如下:

void wr_commad(unsigned char addr,unsigned char hdat,unsigned char ldat )

  DREQ=1;

  while(!DREQ);

  XCS=0;

  spi_write(0x02);

  spi_write(addr);

  spi_write(hdat);

  spi_write(ldat);   

  XCS=1;

}

   3)VS1003的初始化

                如其它芯片一樣,初始化對(duì)于VS1003來(lái)說(shuō)同樣是極其重要的。初始化的過(guò)程大致是這樣的:

                1.硬件復(fù)位:接X(jué)RESET拉低

                2.延時(shí),將XDCS、XCS、XRESET置高

                3.向MODE中寫(xiě)入0X0804

                4.等待DREQ為高

                5.設(shè)置VS1003的時(shí)鐘:SCI_CLOCKF=0x9800,3倍頻

                6.設(shè)置VS1003的采樣率:SPI_AUDATA=0xbb81,采樣率48k,立體聲

                7.設(shè)置重音:SPI_BASS=0x0055

                8.設(shè)置音量:SCI_VOL=0x2020

                9.這一步被很多人忽視,向VS1003發(fā)送4個(gè)字節(jié)的無(wú)效數(shù)據(jù),用以啟動(dòng)SPI發(fā)送

            實(shí)現(xiàn)代碼如下:

void Mp3Reset(void)

{

  XRESET=0;

  delay(100);

  XDCS=XCS=XRESET=1;

  wr_commad(0x00,0x08,0x04);

  delay(10);

  DREQ=1;

  while(!DREQ);

  wr_commad(0x03,0x98,0x00);

  delay(10);

  wr_commad(0x05,0xbb,0x81);

  delay(10);

  wr_commad(0x02,0x00,0x55);

  delay(10);

  wr_commad(0x0b,VOL_VALUE,VOL_VALUE);   // 音量

  delay(10);

  spi_write(0);

  spi_write(0);

  spi_write(0);

  spi_write(0);

}

      在進(jìn)行了正確的初始化后,還要著重檢查一下VS1003的模擬部分是否正常

            將VS1003的所有DVDD、AVDD管腳以及XRESET、TEST(第32個(gè)引腳)接+3.0V,然后測(cè)量RCAP引腳,它應(yīng)該是1.3V左右,否則芯片模擬部分未正常工作。

   4)正弦測(cè)試

            在上面的各種操作與檢測(cè)沒(méi)有問(wèn)題后,就可以讓VS1003放出聲音了。可以利用VS1003自帶的正弦測(cè)試對(duì)音頻輸出進(jìn)行測(cè)試。要啟動(dòng) VS1003的正弦測(cè)試,需要向其寫(xiě)入正弦測(cè)試命令。這里提供啟動(dòng)正弦測(cè)試的流程,在真實(shí)的硬件運(yùn)行通過(guò),最終的效果是在耳機(jī)中聽(tīng)到單一頻率的正弦音(頻率可以通過(guò)程序來(lái)更改)。

            具體流程如下:

             1.進(jìn)入VS1003的測(cè)試模式:SPI_MODE=0X0820

             2.等待DREQ為高

             3.將XDCS接低,而XCS要置高,選擇VS1003的數(shù)據(jù)接口

             4.向VS1003發(fā)送正弦測(cè)試命令:0X53 0XEF 0X6E 0X30 0X00 0X00 0X00 0X00

               其中0X30為頻率,用戶可以修改為其它值

             5.延時(shí)一段時(shí)間

             6.退出正弦測(cè)試,發(fā)送命令:0X45 0X78 0X69 0X74 0X00 0X00 0X00 0X00

             7.延時(shí)一段時(shí)間

             8.循環(huán)以上流程

            實(shí)現(xiàn)代碼如下:

void Sintest(unsigned char x)

{

 wr_commad(0x00,0x08,0x20);

 DREQ=1;

 while(!DREQ);

 XDCS=0;XCS=1;

 spi_write(0x53);

 spi_write(0xef);

 spi_write(0x6e);

 spi_write(x);

 spi_write(0);

 spi_write(0);

 spi_write(0);

 spi_write(0);

 delay(5000);

 spi_write(0x45);

 spi_write(0x78);

 spi_write(0x69);

 spi_write(0x74);

 spi_write(0);

 spi_write(0);

 spi_write(0);

 spi_write(0);

 delay(5000);

 XDCS=1;

}

                如果能夠通過(guò)這一步,就說(shuō)明你的VS1003已經(jīng)做好了為你播放MP3的準(zhǔn)備了。下面的工作 就是將MP3文件的數(shù)據(jù)有條不紊地發(fā)給VS003,讓它來(lái)為你完成MP3的解碼和播放任務(wù) 。

         5)MP3文件數(shù)據(jù)寫(xiě)入

                以上的對(duì)VS1003的初始化與測(cè)試都通過(guò)后,現(xiàn)在就可以給它發(fā)送MP3文件了。但是這時(shí)就又出現(xiàn)一個(gè)新的問(wèn)題。MP3文件通常是比較大的,小的也要1M~2M,如果使單片機(jī)內(nèi)部的Flash Rom的話,容量是遠(yuǎn)遠(yuǎn)不夠的。需要有一種大容量的存儲(chǔ)器來(lái)作為MP3文件的載體。在筆者的調(diào)試系統(tǒng)中采用了SD卡(256M)、U盤(pán)(1G)與移動(dòng)硬盤(pán)(40G)來(lái)存儲(chǔ)MP3文件。關(guān)于SD卡與U盤(pán)的讀寫(xiě)方法可以參看相關(guān)章節(jié)。這些大容量的存儲(chǔ)設(shè)備通常也是按照扇區(qū)來(lái)進(jìn)行讀寫(xiě)的,但在實(shí)際的應(yīng)用中更多的是結(jié)合FAT32等文件系統(tǒng)來(lái)進(jìn)行文件讀寫(xiě)。文件系統(tǒng)部分可以參照《FAT32的存儲(chǔ)機(jī)制及其在單片機(jī)中的實(shí)現(xiàn)》。

                這里拋開(kāi)存儲(chǔ)介質(zhì)不談,只談數(shù)據(jù)的寫(xiě)入方法。其實(shí)寫(xiě)入數(shù)據(jù)的方法十分簡(jiǎn)單。主要就是看DREQ信號(hào),在VS1003的FIFO能夠接受數(shù)據(jù)的時(shí)候輸出高電平。每次可以寫(xiě)入32個(gè)字節(jié)的數(shù)據(jù)。而DREQ變低時(shí),單片機(jī)就要停止數(shù)據(jù)的發(fā)送。

                具體的寫(xiě)數(shù)據(jù)的方法如下:

                1.將XDCS拉低

                2.等待DREQ為高

                3.通過(guò)SPI寫(xiě)入數(shù)據(jù)

                4.在文件沒(méi)有結(jié)束前不斷重復(fù)2與3操作

                5.在所有的數(shù)據(jù)都發(fā)送完畢后,最后發(fā)送2048個(gè)無(wú)效字節(jié),用以清除VS1003的數(shù)據(jù)緩沖區(qū)

                6.將XDCS置高

           以下是筆者的程序中的寫(xiě)數(shù)據(jù)部分:

XDCS=0;

 for(j=621;j<2783;j++)

 {

  for(k=0;k<8;k++)

  {

   MMC_get_data_LBA(j,64,get);

   for(i=0;i<64;i++)

   {

     DREQ=1;

    while(!DREQ);

    spi_write(get[i]);

    //delay(60000);

   }

  }

 }

 for(temp=0;temp<2048;temp++)

 {

  DREQ=1;

  while(!DREQ);

  spi_write(0);

 }

 XDCS=1;

關(guān)閉窗口

相關(guān)文章