Playing MP3 with Music Shield and WIZwiki-W7500

Dependencies:   FTPClient javakysSDFileSystem2 WIZnetInterface mbed

Prerequisite

This example is for playing MP3 file stored in SD card on WIZwiki-W7500 and updating MP3 files from server to SD card via FTP protocol.

To implement this function, you need a Platform board, network Interface board, MP3 decoder board and SD card. Below are what we used.

  • WIZwiki-W7500 from WIZnet (Platform board and Ethernet I/F board)
  • Music shield from Seeed Studio
  • SD card

Hardware Configuration

WIZwiki-W7500 Pin map

pin map

SPI1 for SD Card
SPI1 on WIZwiki-W7100 is for reading from or writing to SD card and pins for SPI1 are PB_0, PB_1, PB_2 and PB_3.

SPI0 and other control pins for MP3 decoder
WIZwiki-W7500 communicates to MP3 decoder on Music Shield via SPI0 pins of which consists of PC_12, D11, D12 and D13. And PC_13, PC_14 and PC-15 are used for DCS, DREQ and RST, respectively.

InterruptIn pins for 5-Way Navigation Switch
D3, D4, D5, D6 and D7 are connected to 5 way navigation switch on Music Shield. When user pushes the switch to one way, a relevant pin is grounded so that he or she should make it set high at the beginning.


Software

SPI Initialization

//Declaration in VS1002.cpp
VS1002::VS1002(PinName mmosi, PinName mmiso, PinName ssck, PinName ccs, const char *name, PinName mosi, PinName miso, PinName sck, PinName cs, PinName rst, PinName dreq, PinName dcs)
    : _DREQ(dreq), _RST(rst), _spi(mosi, miso, sck), _CS(cs), _DCS(dcs), _sd(mmosi, mmiso, ssck, ccs, name) {
    
    }    

//Initialization in main.cpp
VS1002 mp3(PB_3, PB_2, PB_1, PB_0,"sdc",D11, D12 ,D13, PC_12, PC_15, PC_14, PC_13);  

Mapping 5-Way Navigation Switch into InterruptIn pins

main.cpp

InterruptIn K_VU(D3); // Volume UP Key
InterruptIn K_VD(D7); // Volume Down Key
InterruptIn K_FW(D4); // Foward Key
InterruptIn K_BW(D6); // Backward Key
InterruptIn K_ONOFF(D5); //Play/Resume or Pause Key

Additional codes due to mbed library bug of WIZwiki-W7500

main.cpp

//Operating Clock Frequency Set
*(volatile uint32_t *)(0x41001014) = 0x0060100;

//Set all InterruptIn pins to Internal PullUp
*(volatile uint32_t *)(0x41003000) = 0x00000002; //D6
*(volatile uint32_t *)(0x41003004) = 0x00000002; //D5
*(volatile uint32_t *)(0x41003008) = 0x00000002;  //D4
*(volatile uint32_t *)(0x41003080) = 0x00000002;  //D3
*(volatile uint32_t *)(0x41003098) = 0x00000002;  //D7

Caution

This example can play only MP3 files with up to 192KHz sample rate//

Committer:
javakys
Date:
Thu Mar 30 10:29:51 2017 +0000
Revision:
2:cea9f6564641
Parent:
0:1dd4081a2bb9
Function Description Update

Who changed what in which revision?

UserRevisionLine numberNew contents of line
javakys 0:1dd4081a2bb9 1 #include "mbed.h"
javakys 0:1dd4081a2bb9 2 #include "EthernetInterface.h"
javakys 0:1dd4081a2bb9 3 #include "SDFileSystem.h"
javakys 0:1dd4081a2bb9 4 #include <stdio.h>
javakys 0:1dd4081a2bb9 5 #include <string.h>
javakys 0:1dd4081a2bb9 6
javakys 0:1dd4081a2bb9 7 #include "FTPClient.h"
javakys 0:1dd4081a2bb9 8 #include "VS1002.h"
javakys 0:1dd4081a2bb9 9 #include "SSD1306.h"
javakys 0:1dd4081a2bb9 10
javakys 0:1dd4081a2bb9 11 #define MAC "\x00\x08\xDC\x11\x34\x78"
javakys 0:1dd4081a2bb9 12 #define IP "192.168.0.20"
javakys 0:1dd4081a2bb9 13 #define MASK "255.255.255.0"
javakys 0:1dd4081a2bb9 14 #define GATEWAY "192.168.0.1"
javakys 0:1dd4081a2bb9 15
javakys 0:1dd4081a2bb9 16 #define FTP_SERVER_IP "192.168.0.10"
javakys 0:1dd4081a2bb9 17
javakys 0:1dd4081a2bb9 18 #define _MAX_FNAME_LEN_ 127
javakys 0:1dd4081a2bb9 19 #define _FTP_UPDATE_TIME_ 10
javakys 0:1dd4081a2bb9 20
javakys 0:1dd4081a2bb9 21
javakys 0:1dd4081a2bb9 22 Serial uart(USBTX, USBRX);
javakys 0:1dd4081a2bb9 23 AnalogIn ain(A5);
javakys 0:1dd4081a2bb9 24 //SDFileSystem sd(p5, p6, p7, p8, "sd"); // LPC1768 MBD2PMD
javakys 0:1dd4081a2bb9 25 //SDFileSystem sd(P0_18, P0_17, P0_15, P0_16, "sd"); // Seeeduino Arch Pro SPI2SD
javakys 0:1dd4081a2bb9 26 //SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // K64F
javakys 0:1dd4081a2bb9 27 //SDFileSystem sd(PB_3, PB_2, PB_1, PB_0, "sd"); // WIZwiki-W7500
javakys 0:1dd4081a2bb9 28
javakys 0:1dd4081a2bb9 29 EthernetInterface eth;
javakys 2:cea9f6564641 30 InterruptIn K_VU(D3); // Volume UP Key
javakys 2:cea9f6564641 31 InterruptIn K_VD(D7); // Volume Down Key
javakys 0:1dd4081a2bb9 32 InterruptIn K_FW(D4); // Foward Key
javakys 0:1dd4081a2bb9 33 InterruptIn K_BW(D6); // Backward Key
javakys 2:cea9f6564641 34 InterruptIn K_ONOFF(D5); //Play/Resume or Pause Key
javakys 0:1dd4081a2bb9 35 VS1002 mp3(PB_3, PB_2, PB_1, PB_0,"sdc",D11, D12 ,D13, PC_12, PC_15, PC_14, PC_13); //Setup Audio decoder. Name is VS1002 even though VS1053 is used.
javakys 0:1dd4081a2bb9 36
javakys 0:1dd4081a2bb9 37 FTPClient myFTP("/sdc"); // mountname in MySeeedStudioTFTv2
javakys 0:1dd4081a2bb9 38
javakys 0:1dd4081a2bb9 39 //Ticker ledTick;
javakys 0:1dd4081a2bb9 40
javakys 0:1dd4081a2bb9 41 /* Global Variables to store Status*/
javakys 0:1dd4081a2bb9 42 int new_song_number=2; //Variable to store the Song Number
javakys 0:1dd4081a2bb9 43 int volume_set=-20; //Variable to store the Volume
javakys 0:1dd4081a2bb9 44 int previous_volume; //Variable to store the volume when muted
javakys 0:1dd4081a2bb9 45 bool pause=false; //Variable to store the status of Pause button
javakys 0:1dd4081a2bb9 46 bool mute=false; //Variable to store the status of mute button
javakys 0:1dd4081a2bb9 47
javakys 0:1dd4081a2bb9 48 int check=0; //Capacitative touch generates interrupt on both press and release. This variable tracks this and updates only on press.
javakys 0:1dd4081a2bb9 49 //char *song_name[9]={"Good Day","Leong","Sponsor","I'm So Sexy","My Life","Oh My god","Wonderful bar","Whale Hunting","Love"}; //Array of song names entered manually
javakys 0:1dd4081a2bb9 50
javakys 0:1dd4081a2bb9 51 uint32_t ftp_time_1s = 0;
javakys 0:1dd4081a2bb9 52
javakys 0:1dd4081a2bb9 53 char myfilelist[MAX_SS] = {0,};
javakys 0:1dd4081a2bb9 54
javakys 0:1dd4081a2bb9 55 /*void ledTickfunc()
javakys 0:1dd4081a2bb9 56 {
javakys 0:1dd4081a2bb9 57 if(ftp_time_1s)
javakys 0:1dd4081a2bb9 58 {
javakys 0:1dd4081a2bb9 59 //printf("enter ftp_time_1s:%d\r\n", ftp_time_1s);
javakys 0:1dd4081a2bb9 60 if(ftp_time_1s++ > _FTP_UPDATE_TIME_) ftp_time_1s = 0;
javakys 0:1dd4081a2bb9 61 }
javakys 0:1dd4081a2bb9 62 }*/
javakys 2:cea9f6564641 63
javakys 2:cea9f6564641 64 /** Volume UP
javakys 2:cea9f6564641 65 *
javakys 2:cea9f6564641 66 * @param
javakys 2:cea9f6564641 67 */
javakys 0:1dd4081a2bb9 68 void Volume_Up()
javakys 0:1dd4081a2bb9 69 {
javakys 0:1dd4081a2bb9 70 volume_set+=3; // Volume Up
javakys 0:1dd4081a2bb9 71 if(volume_set>=0)
javakys 0:1dd4081a2bb9 72 volume_set=0;
javakys 0:1dd4081a2bb9 73 }
javakys 2:cea9f6564641 74
javakys 2:cea9f6564641 75 /** Volume Down
javakys 2:cea9f6564641 76 *
javakys 2:cea9f6564641 77 * @param
javakys 2:cea9f6564641 78 */
javakys 0:1dd4081a2bb9 79 void Volume_Down()
javakys 0:1dd4081a2bb9 80 {
javakys 0:1dd4081a2bb9 81 volume_set-=3; //Volume Down
javakys 0:1dd4081a2bb9 82 if(volume_set<-55)
javakys 0:1dd4081a2bb9 83 volume_set=-55;
javakys 0:1dd4081a2bb9 84 }
javakys 0:1dd4081a2bb9 85
javakys 2:cea9f6564641 86 /** Song_Forward
javakys 2:cea9f6564641 87 *
javakys 2:cea9f6564641 88 * @param
javakys 2:cea9f6564641 89 */
javakys 0:1dd4081a2bb9 90 void Song_Forward()
javakys 0:1dd4081a2bb9 91 {
javakys 0:1dd4081a2bb9 92 new_song_number += 1;
javakys 0:1dd4081a2bb9 93 if(new_song_number == 10)
javakys 0:1dd4081a2bb9 94 new_song_number = 1;
javakys 0:1dd4081a2bb9 95 }
javakys 0:1dd4081a2bb9 96
javakys 2:cea9f6564641 97 /** Song_Backward
javakys 2:cea9f6564641 98 *
javakys 2:cea9f6564641 99 * @param
javakys 2:cea9f6564641 100 */
javakys 0:1dd4081a2bb9 101 void Song_Backward()
javakys 0:1dd4081a2bb9 102 {
javakys 0:1dd4081a2bb9 103 if(new_song_number == 1)
javakys 0:1dd4081a2bb9 104 new_song_number = 9;
javakys 0:1dd4081a2bb9 105 else
javakys 0:1dd4081a2bb9 106 new_song_number -= 1;
javakys 0:1dd4081a2bb9 107 }
javakys 0:1dd4081a2bb9 108
javakys 2:cea9f6564641 109 /** Play_Pressed
javakys 2:cea9f6564641 110 *
javakys 2:cea9f6564641 111 * @param
javakys 2:cea9f6564641 112 */
javakys 0:1dd4081a2bb9 113 void Play_Pressed()
javakys 0:1dd4081a2bb9 114 {
javakys 0:1dd4081a2bb9 115 pause = !pause;
javakys 0:1dd4081a2bb9 116 }
javakys 0:1dd4081a2bb9 117
javakys 0:1dd4081a2bb9 118 int main (void)
javakys 0:1dd4081a2bb9 119 {
javakys 0:1dd4081a2bb9 120 *(volatile uint32_t *)(0x41001014) = 0x0060100;
javakys 0:1dd4081a2bb9 121 // *(volatile uint32_t *)(0x41003000) = 0x10; //D6
javakys 0:1dd4081a2bb9 122 // *(volatile uint32_t *)(0x41003004) = 0x10; //D5
javakys 0:1dd4081a2bb9 123 // *(volatile uint32_t *)(0x41003008) = 0x10; //D4
javakys 0:1dd4081a2bb9 124 // *(volatile uint32_t *)(0x41003080) = 0x10; //D3
javakys 0:1dd4081a2bb9 125 // *(volatile uint32_t *)(0x41003098) = 0x10; //D7
javakys 0:1dd4081a2bb9 126
javakys 0:1dd4081a2bb9 127 unsigned int update_count_s=6;
javakys 0:1dd4081a2bb9 128 unsigned int update_count_ms=0;
javakys 0:1dd4081a2bb9 129 unsigned int ain_temp=0;
javakys 0:1dd4081a2bb9 130 //char* my_text = "GIF2015";
javakys 0:1dd4081a2bb9 131 /*char* tok = NULL;
javakys 0:1dd4081a2bb9 132 char* lasts = NULL;
javakys 0:1dd4081a2bb9 133 char filename[_MAX_FNAME_LEN_];
javakys 0:1dd4081a2bb9 134 FILE* fp;*/
javakys 0:1dd4081a2bb9 135
javakys 0:1dd4081a2bb9 136 init();
javakys 0:1dd4081a2bb9 137 cls();
javakys 0:1dd4081a2bb9 138 //OLED_DrawBMP(0,0,128,8,(unsigned char *)GIF2015);
javakys 0:1dd4081a2bb9 139 //OLED_ShowStr(0,0,my_text,2);
javakys 0:1dd4081a2bb9 140 // OLED_DrawBMP(0,0,128,8,(unsigned char *)wiznet);
javakys 0:1dd4081a2bb9 141 //LED_P23x32Str(0, 0, my_text);
javakys 0:1dd4081a2bb9 142 // Serial Interface eth;
javakys 0:1dd4081a2bb9 143 uart.baud(115200);
javakys 0:1dd4081a2bb9 144 uart.printf("Initializing\r\n");
javakys 0:1dd4081a2bb9 145
javakys 0:1dd4081a2bb9 146 // EthernetInterface eth;
javakys 0:1dd4081a2bb9 147 uart.printf("Initializing Ethernet\r\n");
javakys 0:1dd4081a2bb9 148
javakys 0:1dd4081a2bb9 149 //eth.init(); //Use DHCP
javakys 0:1dd4081a2bb9 150 eth.init((uint8_t*)MAC,IP,MASK,GATEWAY); //IP,mask,Gateway
javakys 0:1dd4081a2bb9 151 uart.printf("Connecting\r\n");
javakys 0:1dd4081a2bb9 152 eth.connect();
javakys 0:1dd4081a2bb9 153 uart.printf("IP Address is %s\r\n", eth.getIPAddress());
javakys 0:1dd4081a2bb9 154
javakys 0:1dd4081a2bb9 155 // Check File System
javakys 0:1dd4081a2bb9 156 uart.printf("Checking File System\r\n");
javakys 0:1dd4081a2bb9 157 DIR *d = opendir("/sdc/");
javakys 0:1dd4081a2bb9 158 if (d != NULL) {
javakys 0:1dd4081a2bb9 159 uart.printf("SD Card Present\r\n");
javakys 0:1dd4081a2bb9 160 closedir(d);
javakys 0:1dd4081a2bb9 161 } else {
javakys 0:1dd4081a2bb9 162 uart.printf("SD Card Root Directory Not Found\r\n");
javakys 0:1dd4081a2bb9 163 }
javakys 0:1dd4081a2bb9 164
javakys 2:cea9f6564641 165 *(volatile uint32_t *)(0x41003000) = 0x00000002; //D6
javakys 2:cea9f6564641 166 *(volatile uint32_t *)(0x41003004) = 0x00000002; //D5
javakys 2:cea9f6564641 167 *(volatile uint32_t *)(0x41003008) = 0x00000002; //D4
javakys 2:cea9f6564641 168 *(volatile uint32_t *)(0x41003080) = 0x00000002; //D3
javakys 2:cea9f6564641 169 *(volatile uint32_t *)(0x41003098) = 0x00000002; //D7
javakys 0:1dd4081a2bb9 170
javakys 0:1dd4081a2bb9 171
javakys 0:1dd4081a2bb9 172 //ledTick.attach(&ledTickfunc,2);
javakys 0:1dd4081a2bb9 173 /* UI Button setup */
javakys 0:1dd4081a2bb9 174 K_VU.fall(&Volume_Up);
javakys 0:1dd4081a2bb9 175 // K_VU.mode(PullUp);
javakys 0:1dd4081a2bb9 176 K_VD.fall(&Volume_Down);
javakys 0:1dd4081a2bb9 177 // K_VD.mode(PullUp);
javakys 0:1dd4081a2bb9 178 K_ONOFF.fall(&Play_Pressed);
javakys 0:1dd4081a2bb9 179 // K_ONOFF.mode(PullUp);
javakys 0:1dd4081a2bb9 180 K_FW.fall(&Song_Forward);
javakys 0:1dd4081a2bb9 181 // K_FW.mode(PullUp);
javakys 0:1dd4081a2bb9 182 K_BW.fall(&Song_Backward);
javakys 0:1dd4081a2bb9 183 // K_BW.mode(PullUp);
javakys 0:1dd4081a2bb9 184
javakys 0:1dd4081a2bb9 185
javakys 0:1dd4081a2bb9 186 while(1)
javakys 0:1dd4081a2bb9 187 {
javakys 0:1dd4081a2bb9 188 /*
javakys 0:1dd4081a2bb9 189 update_count_ms++;
javakys 0:1dd4081a2bb9 190 if(update_count_ms>5000)
javakys 0:1dd4081a2bb9 191 {
javakys 0:1dd4081a2bb9 192 printf("update_count_ms count : %d\r\n", update_count_s);
javakys 0:1dd4081a2bb9 193 update_count_ms=0;
javakys 0:1dd4081a2bb9 194 update_count_s++;
javakys 0:1dd4081a2bb9 195 }
javakys 0:1dd4081a2bb9 196 //printf("ftp_time_1s:%d\r\n", ftp_time_1s);
javakys 0:1dd4081a2bb9 197 //if(ftp_time_1s == 0)
javakys 0:1dd4081a2bb9 198 if(update_count_s>=5)
javakys 0:1dd4081a2bb9 199 {
javakys 0:1dd4081a2bb9 200 //Configure the display driver
javakys 0:1dd4081a2bb9 201 update_count_s = 0;
javakys 0:1dd4081a2bb9 202
javakys 0:1dd4081a2bb9 203 printf(" UPDATING MP3\r\n");
javakys 0:1dd4081a2bb9 204 printf("==================\n\r\n");
javakys 0:1dd4081a2bb9 205
javakys 0:1dd4081a2bb9 206 if(myFTP.open("192.168.0.10", 21, "user", "pass"))
javakys 0:1dd4081a2bb9 207 {
javakys 0:1dd4081a2bb9 208 printf("Connect Success to FTPServer\r\n");
javakys 0:1dd4081a2bb9 209 printf("Connected to FTP Server\r\n");
javakys 0:1dd4081a2bb9 210
javakys 0:1dd4081a2bb9 211 myFTP.getfile("1.mp3");
javakys 0:1dd4081a2bb9 212 myFTP.getfile("2.mp3");
javakys 0:1dd4081a2bb9 213 myFTP.getfile("3.mp3");
javakys 0:1dd4081a2bb9 214
javakys 0:1dd4081a2bb9 215 printf("\n UPDATE DONE\n\r\n");
javakys 0:1dd4081a2bb9 216 myFTP.quit();
javakys 0:1dd4081a2bb9 217 }
javakys 0:1dd4081a2bb9 218 else
javakys 0:1dd4081a2bb9 219 {
javakys 0:1dd4081a2bb9 220 printf(" Can't connect to FTP Server\r\n");
javakys 0:1dd4081a2bb9 221 printf(" UPDATE FAIL\r\n");
javakys 0:1dd4081a2bb9 222 }
javakys 0:1dd4081a2bb9 223 printf("==================\n");
javakys 0:1dd4081a2bb9 224 }
javakys 0:1dd4081a2bb9 225 */
javakys 0:1dd4081a2bb9 226
javakys 0:1dd4081a2bb9 227 /*============================================================
javakys 0:1dd4081a2bb9 228 * MP3 Initialising
javakys 0:1dd4081a2bb9 229 *==========================================================*/
javakys 0:1dd4081a2bb9 230
javakys 0:1dd4081a2bb9 231 mp3._RST = 1;
javakys 0:1dd4081a2bb9 232 mp3.cs_high(); //chip disabled
javakys 0:1dd4081a2bb9 233 mp3.sci_initialise(); //initialise MBED
javakys 0:1dd4081a2bb9 234 mp3.sci_write(0x00,(SM_SDINEW+SM_STREAM+SM_DIFF));
javakys 0:1dd4081a2bb9 235 mp3.sci_write(0x03, 0x9800);
javakys 0:1dd4081a2bb9 236 mp3.sdi_initialise();
javakys 0:1dd4081a2bb9 237
javakys 0:1dd4081a2bb9 238 ain_temp = ain.read_u16();
javakys 0:1dd4081a2bb9 239 //printf("normalized: %d \n\r", ain_temp);
javakys 0:1dd4081a2bb9 240
javakys 0:1dd4081a2bb9 241 // if (pause)
javakys 0:1dd4081a2bb9 242 // {
javakys 0:1dd4081a2bb9 243 printf("enter song\r\n");
javakys 0:1dd4081a2bb9 244 printf("song number: %d\r\n", new_song_number);
javakys 0:1dd4081a2bb9 245 mp3.play_song(new_song_number);
javakys 0:1dd4081a2bb9 246 // }
javakys 0:1dd4081a2bb9 247 }
javakys 0:1dd4081a2bb9 248 }