Audible "Hello" example for VS1003B + Microcontroller

Writing software for systems that use VLSI Solution's devices as slave codecs to a host microcontroller.
Senior User
Posts: 245
Joined: Mon 2013-12-30 4:15

Re: Audible "Hello" example for VS1003B + Microcontroller

Post by bianchi » Sat 2016-03-19 0:16

Can you use private message ? thanks

Posts: 3
Joined: Fri 2016-03-18 11:25

Re: Audible "Hello" example for VS1003B + Microcontroller

Post by daigs » Mon 2016-03-21 11:10

Hi Bianchi, unfortunately it seems that the board doesn't allow send private message. In the "Contact bianchi" portlet no button or object appear.
Maybe I don't know the exact procedure to do that.


User avatar
VLSI Staff
Posts: 2561
Joined: Tue 2010-06-22 13:43

Re: Audible "Hello" example for VS1003B + Microcontroller

Post by Panu » Mon 2016-03-21 11:24


That's right, this is a public forum. We don't use private messages here because we want everybody to be able to benefit from solving problems here. When a problem is solved here, we want everybody to be able see the answer.

Info: Line In and Line Out, VS1000 User interface, Overlay howto, Latest VSIDE, MCU Howto, Youtube
Panu-Kristian Poiksalo, VLSI Solution Oy

Senior User
Posts: 245
Joined: Mon 2013-12-30 4:15

Re: Audible "Hello" example for VS1003B + Microcontroller

Post by bianchi » Mon 2016-03-21 12:56

What's the problem ? and email address ?

Posts: 3
Joined: Fri 2016-03-18 11:25

Re: Audible "Hello" example for VS1003B + Microcontroller

Post by daigs » Wed 2016-04-06 9:49

Hi Panu at the moment I don't need to submit a particular problem, but maybe in the future. I'm currently working on a project using the VS1053 and a STM32 board nucleo 152 LE.

It would be nice for me to share fiendship with another member interested in VLSI product and STM32 microcontroller. And this forum would be useful also for that in my opinion :-).

If this is not a problem I try to share my email for bianchi: dario.vicenzo74"at"

I hope this doesn't hurt the forum administrators.


Posts: 1
Joined: Mon 2016-11-28 7:00

Re: Audible "Hello" example for VS1003B + Microcontroller

Post by vks_01 » Mon 2016-11-28 10:16

Hi Panu

I've been trying to get the hello.mp3 file to play - I have a PIC24F with the VS1063a. I was able to get the sine test to work, but, no such luck with this audible. What is the right value for CLOCKF that I should use? I have a 12.288Mhz xtal on the VS1063. Looks like people who have posted code here seem to have got the audible to work with different values for CLOCKF - Im not sure I see a pattern here. For some values, I hear a clipped sound, but hear nothing for others. I havent quite got my head around how to arrive at the right number to get this file to work. I'd appreciate your input.


User avatar
VLSI Staff
Posts: 1485
Joined: Thu 2010-07-15 16:04

Re: Audible "Hello" example for VS1003B + Microcontroller

Post by pasi » Tue 2016-11-29 17:21

The hello should be low enough bitrate (and mono) so it should play with the default 1.0x clock. SCI_CLOCKF should not matter, so the issue is probably elsewhere - like DREQ or chip select handling, SPI clock speed, or just some program logic (byte order, sending the correct number of bytes from the correct location in the array).
Visit VLSI Solution on Facebook

Posts: 8
Joined: Sat 2016-12-03 15:38

Re: Audible "Hello" example for VS1003B + Microcontroller

Post by almen_80 » Sat 2016-12-03 15:43


I’m trying to play the “Hello” mp3 using a PIC24 and a VS1053b integrated in the Adafruit “VS1053 Breakout”.
Playing the Hello following the code posted in the first page of this thread results in random sound outputs. It is like the SV1053 is not been “done” with the decoding and the next bytes overwrite the old ones, resulting in some kind of broken “Hello”: for example a fraction of the word Hello with a ‘pip’ ( “Hel” plus “pip”), etc.

If I use the PIC24-Hardware SPI the distortion gets worse. I tested the code using more PIC24s and Breakouts having the same results.

[Please note that the Adafruit VS1053 shared the SPI with a SDCARD]

Code: Select all

// VS1003B   VS1003B   VS1003B   VS1003B   VS1003B   VS1003B   VS1003B //
//// ------- Microcontroller Specific Code Starts ------- ////

#define XTFREQ          8000000           
#define PLLMODE         4                 
#define FCY             (XTFREQ*PLLMODE/2)

#include <xc.h>
#include <libpic30.h> // Import microcontroller register definitions.
#include "mcc_generated_files/mcc.h"

// Pin connections //
#define CARDCS    _RB8  /** SDCARD on Adafruit VS1053 Breakout            */
#define VS_DREQ   _RB9  /** Data Request Pin: Player asks for more data   */
#define VS_XDCS   _RB11 /** Vlsi Data Chip Select Pin                     */
#define VS_XRESET _RB10 /** Vlsi Reset Pin                                */
#define PIN_XCS   _RB12 /** Soft SPI: XCS pin   (VLSI SCK pin)            */
#define PIN_MOSI  _RB15 /** Soft SPI: MOSI pin  (VLSI SI pin)             */
#define PIN_MISO  _RB14 /** Soft SPI: MISO pin  (VLSI SO pin)             */
#define PIN_SCK   _RB13 /** Soft SPI: clock pin (VLSI control chip select)*/

//#define CARDCS_SetHigh()       _LATB8  = 1
//#define XCS_SetHigh()          _LATB12 = 1
//#define XCS_SetLow()           _LATB12 = 0
//#define MOSI_SetHigh()         _LATB15 = 1
//#define MOSI_SetLow()          _LATB15 = 0
//#define SCLK_SetHigh()         _LATB13 = 1
//#define SCLK_SetLow()          _LATB13 = 0
//#define XCS_SetHigh()          _LATB12 = 1
//#define XCS_SetLow()           _LATB12 = 0
//#define XRESET_SetHigh()       _LATB10 = 1
//#define XRESET_SetLow()        _LATB10 = 0
//#define XDCS_SetHigh()         _LATB11 = 1
//#define XDCS_SetLow()          _LATB11 = 0

// VS1053
typedef unsigned short u_int16;

const u_int16 chipNumber[16] = {
    1001, 1011, 1011, 1003, 1053, 1033, 1063, 1103,
    0, 0, 0, 0, 0, 0, 0, 0

unsigned char SpiTransfer(unsigned char c) {
    char ret;
    unsigned char mask;

    mask = 0x80; //Initialize to write and read bit 7
    ret = 0; //Initialize read byte with 0

    do {
        MOSI_SetLow();                    // Clock out current bit onto SPI Out line
        if (c & mask) MOSI_SetHigh();     // SPI_OUT = 1;
        SCLK_SetHigh();                   // Set SPI Clock line
        if (MISO_GetValue()) ret |= mask; // Read current bit fromSPI In line
        __delay_us(1);                    //Ensure minimum delay of 500nS between SPI Clock high and SPI Clock Low
        SCLK_SetLow();                    //Set SPI Clock line
        mask = mask >> 1;                 //Shift mask so that next bit is written and read from SPI lines
        __delay_us(1);                    //Ensure minimum delay of 1000ns between bits
    } while (mask != 0);

    //Ensure a minimum delay of 750ns between falling edge of SPI Clock signal
    //and rising edge of SPI Enable!
    return ret;
    //return SPI1_Exchange8bit(outdata);

// VS10XX Operations //
#define VS_WRITE_COMMAND 0x02 /** VS10xx SCI Write Command byte is 0x02 */
#define VS_READ_COMMAND 0x03 /** VS10xx SCI Read Command byte is 0x03 */

/** Put the VS player chip in reset */
#define VsPutInReset(){XRESET_SetLow();}
/** Release the VS player chip from reset */
#define VsReleaseFromReset(){XRESET_SetHigh();}

/** Pull the VS10xx Data Chip Select line Low */
#define VsSelectData(){XDCS_SetLow();}
/** Pull the VS10xx Data Chip Select line High */
#define VsDeselectData(){XDCS_SetHigh();}

/** VS10xx SCI Registers */
#define SPI_MODE     0x0   
#define SPI_STATUS   0x1   
#define SPI_BASS     0x2   
#define SPI_CLOCKF   0x3   
#define SPI_DECODE_TIME 0x4   
#define SPI_AUDATA   0x5   
#define SPI_WRAM     0x6   
#define SPI_WRAMADDR 0x7   
#define SPI_HDAT0    0x8   
#define SPI_HDAT1    0x9   
#define SPI_AIADDR   0xa   
#define SPI_VOL      0xb   
#define SPI_AICTRL0  0xc  
#define SPI_AICTRL1  0xd  
#define SPI_AICTRL2  0xe  
#define SPI_AICTRL3  0xf  

/* VS1063 / VS1053 Parametric */
#define PAR_END_FILL_BYTE            0x1e06 /* VS1063, VS1053 */

#define SM_CANCEL         (1<< 3) /* VS1063, VS1053 */

void VsWriteRegister(unsigned char reg, unsigned int val) {
    XCS_SetLow(); // Control Chip Select Low
    SpiTransfer(VS_WRITE_COMMAND); // WRITE command
    SpiTransfer(reg); // Register number
    SpiTransfer((unsigned char) (val >> 8)); // High Byte
    SpiTransfer((unsigned char) (val & 0xff)); // Low Byte    
    XCS_SetHigh(); // Control Chip Select High

unsigned int VsReadRegister(unsigned char reg) {
    unsigned char inHigh;
    unsigned char inLow;
    XCS_SetLow(); // Control Chip Select Low
    SpiTransfer(VS_READ_COMMAND); // READ command
    SpiTransfer(reg); // Register number
    inHigh = SpiTransfer(0xff); // High Byte
    inLow = SpiTransfer(0xff); // Low Byte    
    XCS_SetHigh(); // Control Chip Select High
    return (inHigh << 8) +inLow;

// Initialize SPI, set slow SPI clock

void InitSPI() {
    // Set XCS high, nothing more to initialize for the soft SPI.
// Set fast SPI clock

void SPISetFastClock() {
    //SPI1BRGL = 0x0001;
    // It's not possible to have a fast SPI clock with soft SPI.
    // so do nothing...
    // (For fast SPI Clock, use a microcontroller with hardware SPI.)

// No SPIWait operation is needed with this soft SPI implementation, so
// declare an empty macro for SPIWait so the compiler will remove calls to it.
#define SPIWait(a)

// Microcontroller specific init

void InitMicrocontroller() {

/** Set VS10xx Volume Register */
#define VsSetVolume(leftchannel,rightchannel){			\
    VsWriteRegister(11,(leftchannel <<8 )+(rightchannel));}

/** Soft Reset of VS10xx (Between songs) */
void VsSoftReset() {
    VsWriteRegister(SPI_MODE, 0x0804); /* Newmode, Reset, No L1-2 */
    __delay_ms(1); /* One millisecond delay */
    while (!VS_DREQ) /* wait for startup */
    /* Set clock register, doubler etc. */
    VsWriteRegister(SPI_CLOCKF, 0x8800);
    __delay_ms(1); /* One millisecond delay */
    /* Wait for DREQ */
    while (!VS_DREQ)

    /* A quick sanity check: write to two registers, then test if we
       get the same results. Note that if you use a too high SPI
       speed, the MSB is the most likely to fail when read again. */
    int ok;
    ok = 1;
    unsigned int SPI_AICTRL1_V, SPI_AICTRL2_V;
    SPI_AICTRL1_V = VsReadRegister(SPI_AICTRL1);
    SPI_AICTRL2_V = VsReadRegister(SPI_AICTRL2);
    VsWriteRegister(SPI_AICTRL1, 0xABAD);
    VsWriteRegister(SPI_AICTRL2, 0x7E57);
    SPI_AICTRL1_V = VsReadRegister(SPI_AICTRL1);
    SPI_AICTRL2_V = VsReadRegister(SPI_AICTRL2);
    if (SPI_AICTRL1_V != 0xABAD || SPI_AICTRL2_V != 0x7E57) {
        //There is something wrong with VS10xx SCI registers
        ok = 0;
    VsWriteRegister(SPI_AICTRL1, 0);
    VsWriteRegister(SPI_AICTRL2, 0);

    /* Check VS10xx type */
    u_int16 ssVer = 0;
    ssVer = ((VsReadRegister(SPI_STATUS) >> 4) & 15);
    if (chipNumber[ssVer]) {
        if (chipNumber[ssVer] != 1053) {
            //Incorrect chip?;
            ok = 0;
        } else {
            ok = 1;
    } else {
        //Unknown VS10xx SCI_MODE field SS_VER
        ok = 0;

/** Reset VS10xx */
void VsReset() {
    /* Un-reset Vs chip */
    VsSetVolume(0xff, 0xff); //Declick: Immediately switch analog off

    /* Declick: Slow sample rate for slow analog part startup */
    VsWriteRegister(SPI_AUDATA, 10); /* 10 Hz */
    /* Switch on the analog parts */
    VsSetVolume(0xfe, 0xfe);
    VsWriteRegister(SPI_AUDATA, 0x1f40); /* 8kHz */

    VsSetVolume(20, 20); // Set initial volume (20 = -10dB)
    SPISetFastClock(); // Now you can set high speed SPI clock

// The spoken word "Hello" as an VS file.
unsigned char HelloVS[] = {// Note: "code" in AT89C51 SDCC means to put this array into ROM.
    0xFF, 0xF2, 0x40, 0xC0, 0x19, 0xB7, 0x00, 0x14, 0x02, 0xE6, 0x5C, /* ..@.......\ */
    0x01, 0x92, 0x68, 0x01, 0xF1, 0x5E, 0x03, 0x08, 0xF0, 0x24, 0x80, /* ..h..^...$. */
    0x05, 0x9E, 0x20, 0xC6, 0xFC, 0x12, 0x32, 0x5C, 0xBF, 0xF9, 0xB9, /* .. ...2\... */
    0x20, 0x4A, 0x7F, 0x85, 0xEC, 0x4C, 0xCD, 0xC7, 0x27, 0xFE, 0x5C, /*  J...L..'.\ */
    0x34, 0x25, 0xCB, 0xE6, 0xFF, 0xFF, 0x8E, 0x42, 0xE1, 0xA0, 0x5E, /* 4%.....B..^ */
    0xCA, 0x6E, 0x30, 0x9F, 0xFF, 0xF8, 0xC2, 0x12, 0x84, 0xB9, 0x7C, /* .n0.......| */
    0xDC, 0x61, 0x09, 0x4A, 0x7F, 0xFF, 0xFF, 0xF9, 0x7D, 0x32, 0x51, /* .a.J....}2Q */
    0x09, 0x7C, 0xE1, 0xA5, 0x6E, 0xB4, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, /* .|..n...... */
    0x34, 0x41, 0x91, 0xF0, 0x11, 0x8F, 0x00, 0x0F, 0x81, 0x9C, 0x10, /* 4A......... */
    0xEE, 0x59, 0xCE, 0x56, 0x67, 0xFF, 0xF2, 0x42, 0xC0, 0xEC, 0x53, /* .Y.Vg..B..S */
    0x09, 0x15, 0xF9, 0xAA, 0xA8, 0x0D, 0xD9, 0x40, 0x00, 0xCA, 0x34, /* .......@..4 */
    0x53, 0xD9, 0x18, 0xAB, 0x7D, 0xF7, 0x89, 0x3F, 0x11, 0x38, 0x94, /* S...}..?.8. */
    0x82, 0x59, 0x93, 0x20, 0x6A, 0x0C, 0xEE, 0x8E, 0x58, 0xFA, 0x38, /* .Y. j...X.8 */
    0x82, 0xCA, 0xF0, 0x58, 0xBB, 0xDA, 0x0C, 0x50, 0x56, 0x1F, 0xBB, /* ...X...PV.. */
    0x18, 0x5D, 0x8B, 0x9F, 0xDA, 0x71, 0x4F, 0xFF, 0xBD, 0xFE, 0xEF, /* .]...qO.... */
    0x69, 0x36, 0x86, 0x3C, 0x50, 0xBB, 0x0A, 0x07, 0x89, 0x54, 0xF0, /* i6.<P....T. */
    0x88, 0x9F, 0x90, 0x95, 0x30, 0x94, 0x2E, 0x7E, 0xF0, 0x64, 0x96, /* ....0..~.d. */
    0x79, 0x08, 0x3E, 0x20, 0x97, 0x28, 0x34, 0x9C, 0x09, 0x7F, 0xD2, /* y.> .(4.... */
    0xC0, 0x01, 0x75, 0xF8, 0x05, 0x6B, 0x5F, 0x41, 0x17, 0x0B, 0xE7, /* ..u..k_A... */
    0xFF, 0xF2, 0x40, 0xC0, 0x61, 0xE5, 0x0B, 0x16, 0x09, 0xC6, 0xC5, /* ..@.a...... */
    0x74, 0x7B, 0xCC, 0x94, 0x7A, 0xF7, 0x80, 0x76, 0xB2, 0xD2, 0xF8, /* t{..z..v... */
    0x39, 0x06, 0x38, 0xFD, 0x71, 0xC5, 0xDE, 0x3A, 0x38, 0xBF, 0xD5, /* 9.8.q..:8.. */
    0xF7, 0x12, 0x37, 0xCB, 0xF5, 0x63, 0x0C, 0x9B, 0xCE, 0x77, 0x25, /* ..7..c...w% */
    0xED, 0xFB, 0x3D, 0x6B, 0x35, 0xF9, 0x6D, 0xD7, 0xF9, 0x2C, 0xD1, /* ..=k5.m..,. */
    0x97, 0x15, 0x87, 0x93, 0xA4, 0x49, 0x4A, 0x18, 0x16, 0x07, 0xA1, /* .....IJ.... */
    0x60, 0xF7, 0x52, 0x94, 0xDB, 0x02, 0x16, 0x70, 0xB2, 0xD8, 0x80, /* `.R....p... */
    0x30, 0xC2, 0x94, 0x40, 0x81, 0x74, 0x5A, 0x19, 0x7A, 0x80, 0x60, /* 0..@.tZ.z.` */
    0x41, 0x21, 0x46, 0x95, 0xD5, 0xC4, 0x40, 0xD2, 0x01, 0xC0, 0x01, /* A!F...@.... */
    0xDA, 0xD9, 0xA0, 0xB1, 0x01, 0xFF, 0xF2, 0x42, 0xC0, 0x82, 0x10, /* .......B... */
    0x0B, 0x12, 0xF9, 0x9E, 0xC9, 0x7E, 0x7A, 0xC6, 0x95, 0x55, 0x09, /* .....~z..U. */
    0x8B, 0x19, 0x5E, 0x8B, 0x26, 0xCA, 0xEB, 0x68, 0x8A, 0x05, 0x8F, /* ..^.&..h... */
    0x36, 0xA5, 0xA5, 0x03, 0xB8, 0x9C, 0xED, 0x24, 0x51, 0x59, 0x90, /* 6......$QY. */
    0xF6, 0xC5, 0x7D, 0xB5, 0xAD, 0xAF, 0xF6, 0x3B, 0x18, 0xEF, 0x3F, /* ..}....;..? */
    0xFF, 0xFF, 0x4E, 0xDE, 0x16, 0x66, 0x0B, 0xAA, 0x33, 0x23, 0xDD, /* ..N..f..3#. */
    0x9C, 0x4E, 0x6E, 0x55, 0x22, 0x9D, 0xA2, 0x40, 0xA6, 0x36, 0x31, /* .NnU"..@.61 */
    0x69, 0xA5, 0xE1, 0xD9, 0x7F, 0xF7, 0xC6, 0xCC, 0x48, 0x00, 0x0E, /* i.......H.. */
    0x90, 0x16, 0x00, 0x0F, 0xDE, 0x6E, 0x80, 0x11, 0x0C, 0x9A, 0x4F, /* .....n....O */
    0x56, 0xDB, 0x88, 0xD3, 0xB2, 0x1C, 0x00, 0xE0, 0x2E, 0x3E, 0xAC, /* V........>. */
    0xFF, 0xF2, 0x40, 0xC0, 0x1C, 0xE5, 0x19, 0x13, 0x31, 0x4E, 0xCD, /* ..@.....1N. */
    0x9E, 0xC3, 0x06, 0x71, 0x03, 0x85, 0xE5, 0xB5, 0x6D, 0x88, 0x50, /* ...q....m.P */
    0x8E, 0x0E, 0x17, 0x3B, 0x19, 0xFB, 0x4E, 0x3B, 0x99, 0xEF, 0x4C, /* ...;..N;..L */
    0x9E, 0xF7, 0x7B, 0x31, 0x7C, 0x3C, 0x5F, 0xFF, 0xF4, 0xF8, 0xE3, /* ..{1|<_.... */
    0x92, 0x42, 0x07, 0x8E, 0x83, 0x8E, 0x0F, 0x05, 0x08, 0x91, 0xA3, /* .B......... */
    0x16, 0xE2, 0xDF, 0xB7, 0x62, 0x60, 0x48, 0x31, 0x3C, 0xFF, 0xD4, /* ....b`H1<.. */
    0x9E, 0x0C, 0x68, 0x00, 0x77, 0x54, 0xE3, 0x1E, 0x05, 0xC5, 0xF8, /* ..h.wT..... */
    0xEA, 0x8D, 0x82, 0x9D, 0x08, 0xA9, 0x06, 0x8D, 0x1E, 0x5D, 0x7C, /* .........]| */
    0x7F, 0x08, 0xC0, 0x50, 0x45, 0x42, 0xD0, 0x36, 0xF8, 0xB2, 0x4D, /* ...PEB.6..M */
    0x53, 0x0C, 0x80, 0x3B, 0x4D, 0xFF, 0xF2, 0x42, 0xC0, 0x2F, 0x3C, /* S..;M..B./< */
    0x25, 0x19, 0x29, 0xFE, 0xBC, 0x2E, 0xC4, 0xD0, 0x99, 0x4C, 0x48, /* %.)......LH */
    0xB0, 0x9C, 0x49, 0xD2, 0x1A, 0x2D, 0x02, 0xC2, 0x79, 0x69, 0x16, /* ..I..-..yi. */
    0x92, 0xA8, 0xC5, 0xAB, 0x45, 0x5A, 0x68, 0xE8, 0x75, 0x57, 0xCD, /* ....EZh.uW. */
    0xF1, 0xB9, 0xAA, 0x13, 0x88, 0xE4, 0x87, 0x42, 0x15, 0xB3, 0x58, /* .......B..X */
    0xF5, 0xA3, 0x46, 0xB1, 0xCF, 0xD3, 0x59, 0x7E, 0xBA, 0xB5, 0xA7, /* ..F...Y~... */
    0x6B, 0x0B, 0x17, 0x57, 0x6B, 0x5C, 0x4A, 0xCD, 0x53, 0x76, 0x2A, /* k..Wk\J.Sv* */
    0x1D, 0x28, 0xC5, 0x1C, 0x76, 0x5C, 0xDD, 0x0A, 0x00, 0x4B, 0xC0, /* .(..v\...K. */
    0x1B, 0xCA, 0xA8, 0xE9, 0x81, 0x5B, 0xA6, 0xDC, 0xA4, 0x59, 0x13, /* .....[...Y. */
    0xFC, 0xBA, 0x8F, 0x98, 0x79, 0x44, 0x25, 0xC9, 0x35, 0x38, 0xCA, /* ....yD%.58. */
    0xFF, 0xF2, 0x40, 0xC0, 0xB9, 0x7D, 0x1A, 0x13, 0x79, 0x6A, 0xC8, /* ..@..}..yj. */
    0x3E, 0xC4, 0x46, 0x94, 0x8D, 0x3C, 0x67, 0x85, 0xB1, 0xA8, 0x89, /* >.F..<g.... */
    0xC0, 0xF2, 0xE6, 0x2F, 0x9D, 0x7C, 0xC9, 0xB4, 0xBE, 0xCF, 0xE1, /* .../.|..... */
    0x7D, 0xFE, 0x1F, 0x03, 0x00, 0x12, 0x84, 0x72, 0x8C, 0xE7, 0xD8, /* }......r... */
    0x5E, 0xC9, 0xA9, 0x01, 0xBA, 0x9B, 0xC4, 0x10, 0x5C, 0x70, 0x2E, /* ^.......\p. */
    0x6C, 0x48, 0xE7, 0x8C, 0x15, 0x0B, 0x06, 0x01, 0xE5, 0xFF, 0xFF, /* lH......... */
    0xD4, 0x0D, 0x00, 0x0F, 0xCE, 0x58, 0x95, 0x61, 0xA8, 0x9E, 0x7B, /* .....X.a..{ */
    0x19, 0x98, 0xB0, 0xF0, 0xC6, 0x72, 0x82, 0xD5, 0x27, 0x06, 0x47, /* .....r..'.G */
    0x41, 0x22, 0x0F, 0x65, 0x93, 0xC9, 0x8A, 0x09, 0x19, 0x48, 0x1B, /* A".e.....H. */
    0xBD, 0xD6, 0x64, 0x1A, 0xAC, 0xFF, 0xF2, 0x42, 0xC0, 0xF1, 0x11, /* ..d....B... */
    0x25, 0x14, 0x22, 0x06, 0xBC, 0x0E, 0xD4, 0x4E, 0x99, 0x90, 0xA8, /* %."....N... */
    0xD8, 0xB7, 0xAD, 0x5D, 0x3E, 0xAF, 0x6E, 0xBE, 0x66, 0x83, 0xA4, /* ...]>.n.f.. */
    0xE3, 0xC2, 0xE0, 0x29, 0x43, 0x87, 0x5F, 0x4F, 0x27, 0x9C, 0x2C, /* ...)C._O'., */
    0xD0, 0x91, 0xF3, 0x87, 0x9B, 0x54, 0xED, 0xD1, 0xB4, 0xF3, 0x39, /* .....T....9 */
    0x87, 0x22, 0x06, 0x86, 0x0D, 0x71, 0xE4, 0x6F, 0x2A, 0x08, 0x04, /* ."...q.o*.. */
    0xC0, 0x03, 0x2A, 0xB1, 0xE2, 0x05, 0x4D, 0x64, 0xA1, 0x9C, 0xA6, /* ..*...Md... */
    0x0D, 0x41, 0xA6, 0xF2, 0x7A, 0xC1, 0x30, 0xC3, 0x38, 0x26, 0x09, /* .A..z.0.8&. */
    0x50, 0x08, 0xC4, 0xF6, 0x30, 0x0C, 0xA6, 0xA9, 0x17, 0x00, 0x13, /* P...0...... */
    0x0C, 0xDC, 0xC4, 0x2F, 0x28, 0xEB, 0x3F, 0xCD, 0x7A, 0x3D, 0x2F, /* .../(.?.z=/ */
    0xFF, 0xF2, 0x40, 0xC0, 0x18, 0x6F, 0x2E, 0x13, 0xA1, 0xF2, 0xBC, /* ..@..o..... */
    0x36, 0xCB, 0x4E, 0x99, 0x6E, 0xFC, 0xEE, 0xC5, 0xF0, 0xA0, 0xB7, /* 6.N.n...... */
    0x92, 0xD4, 0xEE, 0x79, 0x7C, 0x50, 0x5D, 0xE5, 0x04, 0x94, 0xA9, /* ...y|P].... */
    0x76, 0xCF, 0x6C, 0x70, 0xDD, 0x0D, 0xD4, 0xEE, 0xED, 0x98, 0xE8, /* v.lp....... */
    0xC8, 0x35, 0x36, 0x7A, 0x0C, 0x05, 0x80, 0x03, 0xBC, 0xBE, 0x91, /* .56z....... */
    0x00, 0x7C, 0xAE, 0x65, 0xB8, 0x91, 0xA3, 0x33, 0xBA, 0x68, 0x60, /* .|.e...3.h` */
    0xD4, 0x1A, 0x66, 0xF8, 0x43, 0xA0, 0x20, 0x89, 0xE7, 0x80, 0xD8, /* ..f.C. .... */
    0x1E, 0x4F, 0xA0, 0x04, 0x60, 0x06, 0x0A, 0xA4, 0x91, 0x24, 0xFA, /* .O..`....$. */
    0x9F, 0x57, 0x53, 0xF4, 0x7A, 0xDB, 0x5F, 0x56, 0xE3, 0x6E, 0x0B, /* .WS.z._V.n. */
    0x8B, 0x3A, 0x1C, 0xF9, 0x5E, 0xFF, 0xF2, 0x42, 0xC0, 0xB1, 0x00, /* .:..^..B... */
    0x38, 0x14, 0x09, 0xEE, 0xB4, 0x36, 0xD3, 0x4E, 0x99, 0xA4, 0x78, /* 8....6.N..x */
    0x94, 0x73, 0xC4, 0x66, 0x30, 0xF5, 0xEA, 0xDB, 0xBA, 0x67, 0x67, /* */
    0x95, 0x6B, 0xAB, 0x68, 0x5D, 0x08, 0xA1, 0x39, 0x56, 0xAB, 0x1E, /* .k.h]..9V.. */
    0xD5, 0x03, 0xE8, 0x01, 0x70, 0x00, 0xB3, 0x93, 0x33, 0x19, 0x8C, /* ....p...3.. */
    0x61, 0x8F, 0xBB, 0x5D, 0x24, 0x12, 0x63, 0xD3, 0x4B, 0x5D, 0x91, /* a..]$.c.K]. */
    0x08, 0x43, 0x22, 0x56, 0x1A, 0xC5, 0x10, 0x21, 0x84, 0xA8, 0xEA, /* .C"V...!... */
    0x80, 0xBF, 0x16, 0x8E, 0x3D, 0x46, 0x18, 0x9C, 0x6E, 0x9A, 0x91, /* ....=F..n.. */
    0xE6, 0xC9, 0x6F, 0xD2, 0x7D, 0x27, 0xD7, 0xE9, 0x6B, 0xFF, 0x0A, /* ..o.}'..k.. */
    0x03, 0x43, 0x89, 0xD5, 0xBF, 0x52, 0x97, 0x0A, 0x25, 0x95, 0x0D, /* .C...R..%.. */
    0xFF, 0xF2, 0x40, 0xC0, 0xF5, 0xC3, 0x41, 0x13, 0x81, 0xEE, 0xA8, /* ..@...A.... */
    0x5E, 0xD3, 0x44, 0x98, 0xFC, 0xCF, 0x97, 0xF9, 0x58, 0xB5, 0x33, /* ^.D.....X.3 */
    0xB1, 0x85, 0x47, 0x86, 0xD7, 0x98, 0x01, 0x3B, 0xA3, 0x4F, 0x7E, /* ..G....;.O~ */
    0x04, 0xA6, 0xC3, 0x39, 0x21, 0x70, 0x27, 0x62, 0xB5, 0x18, 0x10, /* ...9!p'b... */
    0x09, 0x99, 0x00, 0x8B, 0x7E, 0xF2, 0xBF, 0x52, 0x18, 0x26, 0x30, /* ....~..R.&0 */
    0x1C, 0xB0, 0x01, 0x49, 0x30, 0xE0, 0xC3, 0x11, 0x46, 0x05, 0xCC, /* ...I0...F.. */
    0x49, 0x14, 0x28, 0xB2, 0xED, 0x4B, 0x57, 0x5A, 0x2F, 0xB7, 0x46, /* I.(..KWZ/.F */
    0x63, 0x34, 0xD2, 0xDA, 0x9F, 0x56, 0x32, 0xB7, 0xA2, 0x25, 0xFF, /* c4...V2..%. */
    0x94, 0x28, 0x33, 0x7F, 0x3B, 0xC4, 0x50, 0xEC, 0xB1, 0xE2, 0x26, /* .(3.;.P...& */
    0xA1, 0xB7, 0x07, 0x7F, 0xFB, 0xFF, 0xF2, 0x42, 0xC0, 0x67, 0x6A, /* .......B.gj */
    0x4C, 0x13, 0xF9, 0x6A, 0x90, 0x7E, 0xDB, 0x44, 0x94, 0x3F, 0xFF, /* L..j.~.D.?. */
    0x14, 0xD6, 0x2A, 0xFF, 0xFF, 0xC1, 0x34, 0x8C, 0x48, 0x22, 0x00, /* ..*...4.H". */
    0x06, 0x8F, 0x21, 0xFD, 0x64, 0x60, 0x04, 0x92, 0x42, 0xEA, 0x74, /* ..!.d`..B.t */
    0x32, 0x37, 0xAA, 0x5A, 0x9F, 0x67, 0x01, 0x8B, 0x3F, 0x37, 0x31, /* 27.Z.g..?71 */
    0xDD, 0x06, 0x3C, 0x01, 0x34, 0x30, 0xE0, 0x5C, 0x78, 0x78, 0xCB, /* ..<.40.\xx. */
    0xD6, 0xF1, 0x31, 0x8A, 0x69, 0x61, 0x93, 0x92, 0x42, 0xCE, 0x4B, /* ..1.ia..B.K */
    0xC5, 0x02, 0x4E, 0x73, 0xC6, 0x24, 0x30, 0xCD, 0x08, 0x66, 0xC6, /* ..Ns.$0..f. */
    0x35, 0xAB, 0xA2, 0x3D, 0x2F, 0xB3, 0xBD, 0x34, 0x87, 0x13, 0xEE, /* 5..=/..4... */
    0x71, 0x45, 0x68, 0xFA, 0xEA, 0x05, 0x84, 0x41, 0x36, 0x4C, 0x9A, /* qEh....A6L. */
    0xFF, 0xF2, 0x40, 0xC0, 0xC9, 0x92, 0x56, 0x13, 0xD0, 0x6E, 0x70, /* */
    0x54, 0xD3, 0xCC, 0x28, 0x06, 0xD7, 0x0E, 0xA4, 0x1D, 0x9C, 0x9D, /* T..(....... */
    0xD9, 0xA9, 0x88, 0x7B, 0xB5, 0xA3, 0x56, 0xB7, 0x4B, 0x4B, 0x5A, /* ...{..V.KKZ */
    0x9B, 0x2C, 0xA9, 0xAD, 0x6F, 0x99, 0x6C, 0xC0, 0x4C, 0x14, 0x14, /* .,..o.l.L.. */
    0xEF, 0xB4, 0x20, 0x91, 0x5F, 0xBC, 0x81, 0x41, 0x41, 0x5D, 0xD4, /* .. ._..AA]. */
    0x20, 0xBD, 0x05, 0x1A, 0x6F, 0xE2, 0x68, 0x56, 0x41, 0x41, 0x57, /*  ...o.hVAAW */
    0xF9, 0xBF, 0x89, 0x82, 0x8E, 0xC7, 0x8F, 0x0A, 0x0A, 0x09, 0x37, /* ..........7 */
    0xF1, 0x05, 0x0A, 0x0A, 0x0A, 0x0A, 0x09, 0x05, 0x37, 0xFF, 0x10, /* ........7.. */
    0x50, 0x50, 0x53, 0x65, 0xFF, 0xFF, 0xFD, 0x75, 0xDF, 0xFF, 0xFF, /* PPSe...u... */
    0x68, 0x4F, 0xFF, 0x84, 0x70, 0xFF, 0xF2, 0x42, 0xC0, 0x27, 0x50, /* hO..p..B.'P */
    0x5F, 0x17, 0xE8, 0x82, 0x3C, 0x11, 0x58, 0x18, 0x01, 0x55, 0x48, /* _...<.X..UH */
    0xBC, 0x52, 0xFC, 0x4A, 0x4C, 0x3C, 0xD5, 0xF6, 0x11, 0x2D, 0xBF, /* .R.JL<...-. */
    0xEA, 0x03, 0x5C, 0x57, 0x29, 0xBF, 0xC3, 0x75, 0x1C, 0xE6, 0xDD, /* ..\W)..u... */
    0xBF, 0xED, 0xEF, 0xD0, 0x98, 0x77, 0x71, 0x95, 0x73, 0xFF, 0xED, /* .....wq.s.. */
    0x54, 0xBE, 0xD5, 0xEE, 0xAE, 0xC2, 0xD5, 0x0B, 0xFF, 0xF1, 0x97, /* T.......... */
    0x8A, 0xE4, 0x42, 0x09, 0x99, 0xB1, 0xEA, 0x94, 0xDC, 0x78, 0xB5, /* ..B......x. */
    0x34, 0x0F, 0xF1, 0x8F, 0xFC, 0x15, 0xF6, 0xFA, 0xB1, 0x47, 0xA9, /* 4........G. */
    0x6C, 0x67, 0x43, 0x8B, 0xF2, 0x76, 0x22, 0xED, 0xDA, 0x85, 0xBA, /* lgC..v".... */
    0x2F, 0xC7, 0xF9, 0xCF, 0xFC, 0xDB, 0x46, 0x2E, 0x50, 0x0A, 0x84, /* /.....F.P.. */
    0xFF, 0xF2, 0x40, 0xC0, 0xC6, 0x4A, 0x59, 0x28, 0x2B, 0x19, 0xE0, /* ..@..JY(+.. */
    0x01, 0x89, 0x78, 0x00, 0x52, 0x85, 0x3C, 0x8E, 0x54, 0x9A, 0x48, /* ..x.R.<.T.H */
    0x5A, 0x72, 0x32, 0x94, 0xBF, 0x43, 0x4F, 0x24, 0x53, 0x4B, 0xEC, /* Zr2..CO$SK. */
    0x4B, 0x99, 0x0E, 0x66, 0x1F, 0xFF, 0xCE, 0x7F, 0xFF, 0x3F, 0x10, /* K..f.....?. */
    0xAE, 0x82, 0x62, 0x71, 0x34, 0x18, 0x59, 0x9B, 0x51, 0xC7, 0x59, /* ..bq4.Y.Q.Y */
    0xCE, 0xEE, 0xA5, 0xFE, 0x02, 0xBB, 0x30, 0x91, 0x49, 0xD5, 0x4B, /* ......0.I.K */
    0xF3, 0xDC, 0x9A, 0xA9, 0x57, 0x8E, 0x72, 0x10, 0xC0, 0x5D, 0x60, /* ....W.r..]` */
    0x67, 0xFC, 0x7D, 0xD6, 0xBA, 0xDD, 0xB3, 0x8B, 0x5A, 0x0A, 0x4C, /* g.}.....Z.L */
    0x41, 0x4D, 0x45, 0x33, 0x2E, 0x39, 0x33, 0xAA, 0xAA, 0xAA, 0xAA, /* AME3.93.... */
    0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x54, 0x41, 0x47, 0x48, 0x65, 0x6C, /* .....TAGHel */
    0x6C, 0x6F, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /* lo          */
    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /*             */
    0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x6E, 0x75, 0x2D, 0x4B, /*      Panu-K */
    0x72, 0x69, 0x73, 0x74, 0x69, 0x61, 0x6E, 0x20, 0x50, 0x6F, 0x69, /* ristian Poi */
    0x6B, 0x73, 0x61, 0x6C, 0x6F, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /* ksalo       */
    0x20, 0x20, 0x56, 0x53, 0x44, 0x53, 0x50, 0x20, 0x54, 0x65, 0x73, /*   VSDSP Tes */
    0x74, 0x69, 0x6E, 0x67, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /* ting        */
    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /*             */
    0x20, 0x20, 0x20, 0x4D, 0x50, 0x33, 0x20, 0x48, 0x65, 0x6C, 0x6C, /*    VS Hell */
    0x6F, 0x2C, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64, 0x21, 0x20, 0x20, /* o, World!   */
    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /*             */
    0x00, /* . */

int main() {
    unsigned char *p;
    unsigned int i;


    // SDCARD share SPI with VS1053


    while (1) {
        p = HelloVS; // Point "p" to the beginning of array
        while (p <= &HelloVS[sizeof (HelloVS) - 1]) {
            while (!VS_DREQ) {
                // VS buffer is full, time to do something else...
                SPIWait(); // Wait until SPI transfer is completed
                VsDeselectData(); // Release the SDI bus
                // You can do something else here, the bus is free...
                // Maybe set the volume or whatever...
            VsSelectData(); // Pull XDCS low
            SpiTransfer(*p++); // Send SPI byte
            // You can actually send 32 bytes here before checking for DREQ again

        // End of file - send 2048 zeros before next file
        for (i = 0; i < 2048; i++) {
            while (!DREQ_GetValue()); // wait here until DREQ is high again
        SPIWait(); // Wait until SPI transfer is completed

    } // Ok, time to send the hello file again.

    return 1;

User avatar
VLSI Staff
Posts: 2561
Joined: Tue 2010-06-22 13:43

Re: Audible "Hello" example for VS1003B + Microcontroller

Post by Panu » Sun 2016-12-04 23:53

Hi, almen_80!

Check that your microcontroller obeys the DREQ signal: short circuit it low and check that your MCU really stops sending the data.

Info: Line In and Line Out, VS1000 User interface, Overlay howto, Latest VSIDE, MCU Howto, Youtube
Panu-Kristian Poiksalo, VLSI Solution Oy

Posts: 8
Joined: Sat 2016-12-03 15:38

Re: Audible "Hello" example for VS1003B + Microcontroller

Post by almen_80 » Mon 2016-12-05 8:52

Hi Panu,

DREQ is defined low at start. I put a 2 seconds delay after sending the Hello but the chip is still unable to play the whole data or is playing it wrong.

Are there other registers that could help checking the state of the chip?

Post Reply