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
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//
SSD1306.h@2:cea9f6564641, 2017-03-30 (annotated)
- Committer:
- javakys
- Date:
- Thu Mar 30 10:29:51 2017 +0000
- Revision:
- 2:cea9f6564641
- Parent:
- 1:fc4e0c572992
Function Description Update
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
javakys | 1:fc4e0c572992 | 1 | #include "data.h" |
javakys | 1:fc4e0c572992 | 2 | #define addr (0x78) |
javakys | 1:fc4e0c572992 | 3 | |
javakys | 1:fc4e0c572992 | 4 | #if defined(TARGET_WIZwiki_W7500) |
javakys | 1:fc4e0c572992 | 5 | #define SDA PA_10 |
javakys | 1:fc4e0c572992 | 6 | #define SCL PA_9 |
javakys | 1:fc4e0c572992 | 7 | #endif |
javakys | 1:fc4e0c572992 | 8 | |
javakys | 1:fc4e0c572992 | 9 | I2C i2c(SDA, SCL); |
javakys | 1:fc4e0c572992 | 10 | |
javakys | 1:fc4e0c572992 | 11 | void send_cmd(uint8_t cmd){ |
javakys | 1:fc4e0c572992 | 12 | char c[2] ={0x00,cmd}; |
javakys | 1:fc4e0c572992 | 13 | |
javakys | 1:fc4e0c572992 | 14 | i2c.write(addr,c,2,1); |
javakys | 1:fc4e0c572992 | 15 | |
javakys | 1:fc4e0c572992 | 16 | } |
javakys | 1:fc4e0c572992 | 17 | |
javakys | 1:fc4e0c572992 | 18 | void send_data(uint8_t data){ |
javakys | 1:fc4e0c572992 | 19 | char c[2] = {0x40,data}; |
javakys | 1:fc4e0c572992 | 20 | i2c.write(addr,c,2,1); |
javakys | 1:fc4e0c572992 | 21 | |
javakys | 1:fc4e0c572992 | 22 | } |
javakys | 1:fc4e0c572992 | 23 | |
javakys | 1:fc4e0c572992 | 24 | void init(void) |
javakys | 1:fc4e0c572992 | 25 | { |
javakys | 1:fc4e0c572992 | 26 | wait_ms(5); // TBD |
javakys | 1:fc4e0c572992 | 27 | |
javakys | 1:fc4e0c572992 | 28 | send_cmd(0xae); // display off |
javakys | 1:fc4e0c572992 | 29 | send_cmd(0xd5); // display divide ratio/osc. freq. ratio |
javakys | 1:fc4e0c572992 | 30 | send_cmd(0x80); |
javakys | 1:fc4e0c572992 | 31 | send_cmd(0xa8); // multiplex ation mode: 63 |
javakys | 1:fc4e0c572992 | 32 | send_cmd(0x3f); |
javakys | 1:fc4e0c572992 | 33 | send_cmd(0xd3); // set display offset |
javakys | 1:fc4e0c572992 | 34 | send_cmd(0x00); |
javakys | 1:fc4e0c572992 | 35 | send_cmd(0x40); // set display start line |
javakys | 1:fc4e0c572992 | 36 | send_cmd(0x8d); // set display offset |
javakys | 1:fc4e0c572992 | 37 | send_cmd(0x14); |
javakys | 1:fc4e0c572992 | 38 | send_cmd(0xa1); // segment remap |
javakys | 1:fc4e0c572992 | 39 | send_cmd(0xc8); // set COM output scan direction |
javakys | 1:fc4e0c572992 | 40 | send_cmd(0xda); // common pads hardware: alternative |
javakys | 1:fc4e0c572992 | 41 | send_cmd(0x12); |
javakys | 1:fc4e0c572992 | 42 | send_cmd(0x81); // contrast control |
javakys | 1:fc4e0c572992 | 43 | send_cmd(0xcf); |
javakys | 1:fc4e0c572992 | 44 | send_cmd(0xd9); // set pre-charge period |
javakys | 1:fc4e0c572992 | 45 | send_cmd(0xf1); |
javakys | 1:fc4e0c572992 | 46 | send_cmd(0xdb); // VCOM deselect level mode |
javakys | 1:fc4e0c572992 | 47 | send_cmd(0x40); // set vcomh = 0.83 * VCC |
javakys | 1:fc4e0c572992 | 48 | send_cmd(0xa4); // set entire display on/off |
javakys | 1:fc4e0c572992 | 49 | send_cmd(0xa6); // set normal display |
javakys | 1:fc4e0c572992 | 50 | send_cmd(0xaf); // set display on |
javakys | 1:fc4e0c572992 | 51 | } |
javakys | 1:fc4e0c572992 | 52 | |
javakys | 1:fc4e0c572992 | 53 | // set position (x, 8*y) |
javakys | 1:fc4e0c572992 | 54 | void locate(int x, int y){ |
javakys | 1:fc4e0c572992 | 55 | send_cmd(0xb0+y); |
javakys | 1:fc4e0c572992 | 56 | send_cmd(((x&0xf0)>>4)|0x10); |
javakys | 1:fc4e0c572992 | 57 | send_cmd((x&0x0f)|0x01); |
javakys | 1:fc4e0c572992 | 58 | } |
javakys | 1:fc4e0c572992 | 59 | |
javakys | 1:fc4e0c572992 | 60 | void cls(void){ |
javakys | 1:fc4e0c572992 | 61 | int x, y; |
javakys | 1:fc4e0c572992 | 62 | for(y = 0; y < 8; y++){ |
javakys | 1:fc4e0c572992 | 63 | locate(0, y); |
javakys | 1:fc4e0c572992 | 64 | for(x = 0; x < 128; x++) send_data(0x00); |
javakys | 1:fc4e0c572992 | 65 | } |
javakys | 1:fc4e0c572992 | 66 | } |
javakys | 1:fc4e0c572992 | 67 | |
javakys | 1:fc4e0c572992 | 68 | |
javakys | 1:fc4e0c572992 | 69 | |
javakys | 1:fc4e0c572992 | 70 | void OLED_ShowStr(unsigned char x, unsigned char y, char ch[], unsigned char TextSize) |
javakys | 1:fc4e0c572992 | 71 | { |
javakys | 1:fc4e0c572992 | 72 | unsigned char c = 0,i = 0,j = 0; |
javakys | 1:fc4e0c572992 | 73 | switch(TextSize) |
javakys | 1:fc4e0c572992 | 74 | { |
javakys | 1:fc4e0c572992 | 75 | case 1: |
javakys | 1:fc4e0c572992 | 76 | { |
javakys | 1:fc4e0c572992 | 77 | while(ch[j] != '\0') |
javakys | 1:fc4e0c572992 | 78 | { |
javakys | 1:fc4e0c572992 | 79 | c = ch[j] - 32; |
javakys | 1:fc4e0c572992 | 80 | if(x > 126) |
javakys | 1:fc4e0c572992 | 81 | { |
javakys | 1:fc4e0c572992 | 82 | x = 0; |
javakys | 1:fc4e0c572992 | 83 | y++; |
javakys | 1:fc4e0c572992 | 84 | } |
javakys | 1:fc4e0c572992 | 85 | locate(x,y); |
javakys | 1:fc4e0c572992 | 86 | for(i=0;i<6;i++) |
javakys | 1:fc4e0c572992 | 87 | send_data(F6x8[c][i]); |
javakys | 1:fc4e0c572992 | 88 | x += 6; |
javakys | 1:fc4e0c572992 | 89 | j++; |
javakys | 1:fc4e0c572992 | 90 | } |
javakys | 1:fc4e0c572992 | 91 | }break; |
javakys | 1:fc4e0c572992 | 92 | case 2: |
javakys | 1:fc4e0c572992 | 93 | { |
javakys | 1:fc4e0c572992 | 94 | while(ch[j] != '\0') |
javakys | 1:fc4e0c572992 | 95 | { |
javakys | 1:fc4e0c572992 | 96 | c = ch[j] - 32; |
javakys | 1:fc4e0c572992 | 97 | if(x > 120) |
javakys | 1:fc4e0c572992 | 98 | { |
javakys | 1:fc4e0c572992 | 99 | x = 0; |
javakys | 1:fc4e0c572992 | 100 | y++; |
javakys | 1:fc4e0c572992 | 101 | } |
javakys | 1:fc4e0c572992 | 102 | locate(x,y); |
javakys | 1:fc4e0c572992 | 103 | for(i=0;i<8;i++) |
javakys | 1:fc4e0c572992 | 104 | send_data(F8X16[c*16+i]); |
javakys | 1:fc4e0c572992 | 105 | locate(x,y+1); |
javakys | 1:fc4e0c572992 | 106 | for(i=0;i<8;i++) |
javakys | 1:fc4e0c572992 | 107 | send_data(F8X16[c*16+i+8]); |
javakys | 1:fc4e0c572992 | 108 | x += 8; |
javakys | 1:fc4e0c572992 | 109 | j++; |
javakys | 1:fc4e0c572992 | 110 | } |
javakys | 1:fc4e0c572992 | 111 | }break; |
javakys | 1:fc4e0c572992 | 112 | } |
javakys | 1:fc4e0c572992 | 113 | } |
javakys | 1:fc4e0c572992 | 114 | void OLED_DrawBMP(unsigned char x0, |
javakys | 1:fc4e0c572992 | 115 | unsigned char y0,unsigned char x1, |
javakys | 1:fc4e0c572992 | 116 | unsigned char y1,unsigned char BMP[]) |
javakys | 1:fc4e0c572992 | 117 | { |
javakys | 1:fc4e0c572992 | 118 | unsigned int j=0; |
javakys | 1:fc4e0c572992 | 119 | unsigned char x,y; |
javakys | 1:fc4e0c572992 | 120 | |
javakys | 1:fc4e0c572992 | 121 | if(y1%8==0) |
javakys | 1:fc4e0c572992 | 122 | y = y1/8; |
javakys | 1:fc4e0c572992 | 123 | else |
javakys | 1:fc4e0c572992 | 124 | y = y1/8 + 1; |
javakys | 1:fc4e0c572992 | 125 | for(y=y0;y<y1;y++) |
javakys | 1:fc4e0c572992 | 126 | { |
javakys | 1:fc4e0c572992 | 127 | locate(x0,y); |
javakys | 1:fc4e0c572992 | 128 | for(x=x0;x<x1;x++) |
javakys | 1:fc4e0c572992 | 129 | { |
javakys | 1:fc4e0c572992 | 130 | send_data(BMP[j++]); |
javakys | 1:fc4e0c572992 | 131 | } |
javakys | 1:fc4e0c572992 | 132 | } |
javakys | 1:fc4e0c572992 | 133 | } |
javakys | 1:fc4e0c572992 | 134 | //==========================================================// |
javakys | 1:fc4e0c572992 | 135 | // Prints a display big number (96 bytes) in coordinates X Y, |
javakys | 1:fc4e0c572992 | 136 | // being multiples of 8. This means we have 16 COLS (0-15) |
javakys | 1:fc4e0c572992 | 137 | // and 8 ROWS (0-7). |
javakys | 1:fc4e0c572992 | 138 | void printBigNumber(unsigned char s, int x, int y) |
javakys | 1:fc4e0c572992 | 139 | { |
javakys | 1:fc4e0c572992 | 140 | locate(x,y); |
javakys | 1:fc4e0c572992 | 141 | int salto=0; |
javakys | 1:fc4e0c572992 | 142 | for(int i=0; i<96; i++) { |
javakys | 1:fc4e0c572992 | 143 | if(s == ' ') { |
javakys | 1:fc4e0c572992 | 144 | send_data(0); |
javakys | 1:fc4e0c572992 | 145 | } else |
javakys | 1:fc4e0c572992 | 146 | send_data(bigNumbers[s-0x30][i]); |
javakys | 1:fc4e0c572992 | 147 | |
javakys | 1:fc4e0c572992 | 148 | if(salto == 23) { |
javakys | 1:fc4e0c572992 | 149 | salto = 0; |
javakys | 1:fc4e0c572992 | 150 | x++; |
javakys | 1:fc4e0c572992 | 151 | locate(x,y); |
javakys | 1:fc4e0c572992 | 152 | } else { |
javakys | 1:fc4e0c572992 | 153 | salto++; |
javakys | 1:fc4e0c572992 | 154 | } |
javakys | 1:fc4e0c572992 | 155 | } |
javakys | 1:fc4e0c572992 | 156 | } |
javakys | 1:fc4e0c572992 | 157 | void printBigTime(char *s) |
javakys | 1:fc4e0c572992 | 158 | { |
javakys | 1:fc4e0c572992 | 159 | |
javakys | 1:fc4e0c572992 | 160 | int y=0; |
javakys | 1:fc4e0c572992 | 161 | int lon = strlen(s); |
javakys | 1:fc4e0c572992 | 162 | if(lon == 6) { |
javakys | 1:fc4e0c572992 | 163 | y = 0; |
javakys | 1:fc4e0c572992 | 164 | } else if (lon == 5) { |
javakys | 1:fc4e0c572992 | 165 | y = 3; |
javakys | 1:fc4e0c572992 | 166 | } else if (lon == 4) { |
javakys | 1:fc4e0c572992 | 167 | y = 6; |
javakys | 1:fc4e0c572992 | 168 | } |
javakys | 1:fc4e0c572992 | 169 | else if(lon == 3) { |
javakys | 1:fc4e0c572992 | 170 | y = 9; |
javakys | 1:fc4e0c572992 | 171 | } else if (lon == 2) { |
javakys | 1:fc4e0c572992 | 172 | y = 12; |
javakys | 1:fc4e0c572992 | 173 | } else if (lon == 1) { |
javakys | 1:fc4e0c572992 | 174 | y = 15; |
javakys | 1:fc4e0c572992 | 175 | } |
javakys | 1:fc4e0c572992 | 176 | |
javakys | 1:fc4e0c572992 | 177 | int x = 2; |
javakys | 1:fc4e0c572992 | 178 | while(*s) { |
javakys | 1:fc4e0c572992 | 179 | printBigNumber(*s, x, y); |
javakys | 1:fc4e0c572992 | 180 | |
javakys | 1:fc4e0c572992 | 181 | y+=3; |
javakys | 1:fc4e0c572992 | 182 | x=2; |
javakys | 1:fc4e0c572992 | 183 | locate(x,y); |
javakys | 1:fc4e0c572992 | 184 | *s++; |
javakys | 1:fc4e0c572992 | 185 | } |
javakys | 1:fc4e0c572992 | 186 | } |
javakys | 1:fc4e0c572992 | 187 | void LED_P23x32Str(unsigned char x, unsigned char y, char ch[]) |
javakys | 1:fc4e0c572992 | 188 | { |
javakys | 1:fc4e0c572992 | 189 | unsigned char c = 0, i = 0, j = 0, k = 0; |
javakys | 1:fc4e0c572992 | 190 | while (ch[j] != '\0') |
javakys | 1:fc4e0c572992 | 191 | { |
javakys | 1:fc4e0c572992 | 192 | c = ch[j] - '0'; |
javakys | 1:fc4e0c572992 | 193 | if (x > 120) { |
javakys | 1:fc4e0c572992 | 194 | x = 0; |
javakys | 1:fc4e0c572992 | 195 | y++; |
javakys | 1:fc4e0c572992 | 196 | } |
javakys | 1:fc4e0c572992 | 197 | |
javakys | 1:fc4e0c572992 | 198 | for (k = 0; k < 4; k++) { |
javakys | 1:fc4e0c572992 | 199 | locate(x, y + k); |
javakys | 1:fc4e0c572992 | 200 | for (i = 0; i < 23; i++) { |
javakys | 1:fc4e0c572992 | 201 | send_data(F23x32[c * 23 * 4 + k * 23 + i]); |
javakys | 1:fc4e0c572992 | 202 | } |
javakys | 1:fc4e0c572992 | 203 | } |
javakys | 1:fc4e0c572992 | 204 | x += 25; |
javakys | 1:fc4e0c572992 | 205 | j++; |
javakys | 1:fc4e0c572992 | 206 | } |
javakys | 1:fc4e0c572992 | 207 | } |
javakys | 1:fc4e0c572992 | 208 | |
javakys | 1:fc4e0c572992 | 209 |