UART MP3 Voice Module with 8MB Flash Memory / DFR0534

Dependents:   DFR0534_MP3_Test_os5 TYBLE16_MP3_Air

see /users/kenjiArai/notebook/mp3--voice-module-dfr0534/

Committer:
kenjiArai
Date:
Sun Dec 29 02:55:07 2019 +0000
Revision:
0:466200f304c9
1st working sample (need to update)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:466200f304c9 1 /*
kenjiArai 0:466200f304c9 2 * Mbed Library program
kenjiArai 0:466200f304c9 3 * UART MP3 Voice Module with 8MB Flash Memory / DFR0534
kenjiArai 0:466200f304c9 4 *
kenjiArai 0:466200f304c9 5 * Copyright (c) 2019 Kenji Arai / JH1PJL
kenjiArai 0:466200f304c9 6 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:466200f304c9 7 * https://os.mbed.com/users/kenjiArai/
kenjiArai 0:466200f304c9 8 * Created: December 28th, 2019
kenjiArai 0:466200f304c9 9 * Revised: December 29th, 2019
kenjiArai 0:466200f304c9 10 */
kenjiArai 0:466200f304c9 11
kenjiArai 0:466200f304c9 12 /*
kenjiArai 0:466200f304c9 13 Reference information:
kenjiArai 0:466200f304c9 14 http://akizukidenshi.com/catalog/g/gM-13708/
kenjiArai 0:466200f304c9 15 https://wiki.dfrobot.com/Voice_Module_SKU__DFR0534
kenjiArai 0:466200f304c9 16 */
kenjiArai 0:466200f304c9 17
kenjiArai 0:466200f304c9 18 #include "drf0534.h"
kenjiArai 0:466200f304c9 19
kenjiArai 0:466200f304c9 20 #if MBED_MAJOR_VERSION == 2
kenjiArai 0:466200f304c9 21 #define WAIT_MS(x) wait_ms(x)
kenjiArai 0:466200f304c9 22 #elif MBED_MAJOR_VERSION == 5
kenjiArai 0:466200f304c9 23 #define WAIT_MS(x) ThisThread::sleep_for(x)
kenjiArai 0:466200f304c9 24 #else
kenjiArai 0:466200f304c9 25 #error "Running on Unknown OS"
kenjiArai 0:466200f304c9 26 #endif
kenjiArai 0:466200f304c9 27
kenjiArai 0:466200f304c9 28 //#define DEBUG
kenjiArai 0:466200f304c9 29
kenjiArai 0:466200f304c9 30 DFR0534::DFR0534(PinName tx, PinName rx, PinName busy)
kenjiArai 0:466200f304c9 31 :_mp3(tx, rx), _bsy(busy)
kenjiArai 0:466200f304c9 32 {
kenjiArai 0:466200f304c9 33 _mp3.baud(9600);
kenjiArai 0:466200f304c9 34 _mp3.attach(callback(this,&DFR0534::_rx_handler), Serial::RxIrq);
kenjiArai 0:466200f304c9 35 volume_setting(0);
kenjiArai 0:466200f304c9 36 }
kenjiArai 0:466200f304c9 37
kenjiArai 0:466200f304c9 38 void DFR0534::play_one(uint16_t track_num)
kenjiArai 0:466200f304c9 39 {
kenjiArai 0:466200f304c9 40 _wait_busy();
kenjiArai 0:466200f304c9 41 _sum = 0xaa;
kenjiArai 0:466200f304c9 42 _mp3.putc(_sum);
kenjiArai 0:466200f304c9 43 WAIT_MS(2);
kenjiArai 0:466200f304c9 44 _sum += 0x07;
kenjiArai 0:466200f304c9 45 _mp3.putc(0x07);
kenjiArai 0:466200f304c9 46 WAIT_MS(2);
kenjiArai 0:466200f304c9 47 _sum += 0x02;
kenjiArai 0:466200f304c9 48 _mp3.putc(0x02);
kenjiArai 0:466200f304c9 49 WAIT_MS(2);
kenjiArai 0:466200f304c9 50 uint8_t dt = track_num >> 8;
kenjiArai 0:466200f304c9 51 _sum += dt;
kenjiArai 0:466200f304c9 52 _mp3.putc(dt);
kenjiArai 0:466200f304c9 53 WAIT_MS(2);
kenjiArai 0:466200f304c9 54 dt = (uint8_t)track_num;
kenjiArai 0:466200f304c9 55 _sum += dt;
kenjiArai 0:466200f304c9 56 _mp3.putc(dt);
kenjiArai 0:466200f304c9 57 WAIT_MS(2);
kenjiArai 0:466200f304c9 58 _mp3.putc(_sum);
kenjiArai 0:466200f304c9 59 }
kenjiArai 0:466200f304c9 60
kenjiArai 0:466200f304c9 61 void DFR0534::volume_setting(uint8_t vol)
kenjiArai 0:466200f304c9 62 {
kenjiArai 0:466200f304c9 63 _sum = 0xaa;
kenjiArai 0:466200f304c9 64 _mp3.putc(_sum);
kenjiArai 0:466200f304c9 65 WAIT_MS(2);
kenjiArai 0:466200f304c9 66 _sum += 0x13;
kenjiArai 0:466200f304c9 67 _mp3.putc(0x13);
kenjiArai 0:466200f304c9 68 WAIT_MS(2);
kenjiArai 0:466200f304c9 69 _sum += 0x01;
kenjiArai 0:466200f304c9 70 _mp3.putc(0x01);
kenjiArai 0:466200f304c9 71 WAIT_MS(2);
kenjiArai 0:466200f304c9 72 uint8_t dt = vol;
kenjiArai 0:466200f304c9 73 if (dt > VOL_MAX) {
kenjiArai 0:466200f304c9 74 dt = VOL_MAX;
kenjiArai 0:466200f304c9 75 }
kenjiArai 0:466200f304c9 76 _sum += dt;
kenjiArai 0:466200f304c9 77 _mp3.putc(dt);
kenjiArai 0:466200f304c9 78 WAIT_MS(2);
kenjiArai 0:466200f304c9 79 _mp3.putc(_sum);
kenjiArai 0:466200f304c9 80 }
kenjiArai 0:466200f304c9 81
kenjiArai 0:466200f304c9 82 void DFR0534::volume_increase()
kenjiArai 0:466200f304c9 83 {
kenjiArai 0:466200f304c9 84 _command(0x14);
kenjiArai 0:466200f304c9 85 }
kenjiArai 0:466200f304c9 86
kenjiArai 0:466200f304c9 87 void DFR0534::volume_decrease()
kenjiArai 0:466200f304c9 88 {
kenjiArai 0:466200f304c9 89 _command(0x15);
kenjiArai 0:466200f304c9 90 }
kenjiArai 0:466200f304c9 91
kenjiArai 0:466200f304c9 92 void DFR0534::command(enum simple_commands cmds)
kenjiArai 0:466200f304c9 93 {
kenjiArai 0:466200f304c9 94 _command(cmds);
kenjiArai 0:466200f304c9 95 }
kenjiArai 0:466200f304c9 96
kenjiArai 0:466200f304c9 97 uint16_t DFR0534::total_num_of_audio()
kenjiArai 0:466200f304c9 98 {
kenjiArai 0:466200f304c9 99 uint16_t dt = 0;
kenjiArai 0:466200f304c9 100 char c;
kenjiArai 0:466200f304c9 101
kenjiArai 0:466200f304c9 102 _rxbuf.reset(); // clear buffer
kenjiArai 0:466200f304c9 103 _command(0x0c);
kenjiArai 0:466200f304c9 104 WAIT_MS(50);
kenjiArai 0:466200f304c9 105 for (uint32_t i = 0; i < 6; i++) {
kenjiArai 0:466200f304c9 106 while(_rxbuf.empty() == true) {;}
kenjiArai 0:466200f304c9 107 _rxbuf.pop(c);
kenjiArai 0:466200f304c9 108 _buf[i] = c;
kenjiArai 0:466200f304c9 109 }
kenjiArai 0:466200f304c9 110 #if defined(DEBUG)
kenjiArai 0:466200f304c9 111 for (uint32_t i = 0; i < 6; i++) {
kenjiArai 0:466200f304c9 112 printf("0x%02x, ",_buf[i]);
kenjiArai 0:466200f304c9 113 }
kenjiArai 0:466200f304c9 114 printf("\r\n");
kenjiArai 0:466200f304c9 115 #endif
kenjiArai 0:466200f304c9 116 if (_buf[0] == 0xaa) {
kenjiArai 0:466200f304c9 117 _sum = 0xaa;
kenjiArai 0:466200f304c9 118 _sum += _buf[1];
kenjiArai 0:466200f304c9 119 _sum += _buf[2];
kenjiArai 0:466200f304c9 120 dt = _buf[3] << 8;
kenjiArai 0:466200f304c9 121 _sum += _buf[3];
kenjiArai 0:466200f304c9 122 dt += _buf[4];
kenjiArai 0:466200f304c9 123 _sum += _buf[4];
kenjiArai 0:466200f304c9 124 if (_sum == _buf[5]) {
kenjiArai 0:466200f304c9 125 return dt; // success
kenjiArai 0:466200f304c9 126 }
kenjiArai 0:466200f304c9 127 }
kenjiArai 0:466200f304c9 128 return 0; // error
kenjiArai 0:466200f304c9 129 }
kenjiArai 0:466200f304c9 130
kenjiArai 0:466200f304c9 131 uint16_t DFR0534::current_num_of_audio()
kenjiArai 0:466200f304c9 132 {
kenjiArai 0:466200f304c9 133 uint16_t dt = 0;
kenjiArai 0:466200f304c9 134 char c;
kenjiArai 0:466200f304c9 135
kenjiArai 0:466200f304c9 136 _rxbuf.reset(); // clear buffer
kenjiArai 0:466200f304c9 137 _command(0x0d);
kenjiArai 0:466200f304c9 138 WAIT_MS(50);
kenjiArai 0:466200f304c9 139 for (uint32_t i = 0; i < 6; i++) {
kenjiArai 0:466200f304c9 140 while(_rxbuf.empty() == true) {;}
kenjiArai 0:466200f304c9 141 _rxbuf.pop(c);
kenjiArai 0:466200f304c9 142 _buf[i] = c;
kenjiArai 0:466200f304c9 143 }
kenjiArai 0:466200f304c9 144 #if defined(DEBUG)
kenjiArai 0:466200f304c9 145 for (uint32_t i = 0; i < 6; i++) {
kenjiArai 0:466200f304c9 146 printf("0x%02x, ",_buf[i]);
kenjiArai 0:466200f304c9 147 }
kenjiArai 0:466200f304c9 148 printf("\r\n");
kenjiArai 0:466200f304c9 149 #endif
kenjiArai 0:466200f304c9 150 if (_buf[0] == 0xaa) {
kenjiArai 0:466200f304c9 151 _sum = 0xaa;
kenjiArai 0:466200f304c9 152 _sum += _buf[1];
kenjiArai 0:466200f304c9 153 _sum += _buf[2];
kenjiArai 0:466200f304c9 154 dt = _buf[3] << 8;
kenjiArai 0:466200f304c9 155 _sum += _buf[3];
kenjiArai 0:466200f304c9 156 dt += _buf[4];
kenjiArai 0:466200f304c9 157 _sum += _buf[4];
kenjiArai 0:466200f304c9 158 if (_sum == _buf[5]) {
kenjiArai 0:466200f304c9 159 return dt; // success
kenjiArai 0:466200f304c9 160 }
kenjiArai 0:466200f304c9 161 }
kenjiArai 0:466200f304c9 162 return 0; // error
kenjiArai 0:466200f304c9 163 }
kenjiArai 0:466200f304c9 164
kenjiArai 0:466200f304c9 165 void DFR0534::get_file_name(char *buf)
kenjiArai 0:466200f304c9 166 {
kenjiArai 0:466200f304c9 167 uint16_t dt = 0;
kenjiArai 0:466200f304c9 168 char c, num;
kenjiArai 0:466200f304c9 169 char *p;
kenjiArai 0:466200f304c9 170
kenjiArai 0:466200f304c9 171 _rxbuf.reset(); // clear buffer
kenjiArai 0:466200f304c9 172 _command(0x1e);
kenjiArai 0:466200f304c9 173 WAIT_MS(50);
kenjiArai 0:466200f304c9 174 for (uint32_t i = 0; i < 3; i++) {
kenjiArai 0:466200f304c9 175 while(_rxbuf.empty() == true) {;}
kenjiArai 0:466200f304c9 176 _rxbuf.pop(c);
kenjiArai 0:466200f304c9 177 _buf[i] = c;
kenjiArai 0:466200f304c9 178 }
kenjiArai 0:466200f304c9 179 #if defined(DEBUG)
kenjiArai 0:466200f304c9 180 for (uint32_t i = 0; i < 3; i++) {
kenjiArai 0:466200f304c9 181 printf("H: 0x%02x, ",_buf[i]);
kenjiArai 0:466200f304c9 182 }
kenjiArai 0:466200f304c9 183 printf("\r\n");
kenjiArai 0:466200f304c9 184 #endif
kenjiArai 0:466200f304c9 185 if (_buf[0] == 0xaa) {
kenjiArai 0:466200f304c9 186 _sum = 0xaa;
kenjiArai 0:466200f304c9 187 _sum += _buf[1];
kenjiArai 0:466200f304c9 188 _sum += _buf[2];
kenjiArai 0:466200f304c9 189 } else { // error
kenjiArai 0:466200f304c9 190 *buf = 0;
kenjiArai 0:466200f304c9 191 return;
kenjiArai 0:466200f304c9 192 }
kenjiArai 0:466200f304c9 193 num = _buf[2] + 1;
kenjiArai 0:466200f304c9 194 #if defined(DEBUG)
kenjiArai 0:466200f304c9 195 printf("number = %d\r\n", num);
kenjiArai 0:466200f304c9 196 #endif
kenjiArai 0:466200f304c9 197 for (uint32_t i = 0; i < num; i++) {
kenjiArai 0:466200f304c9 198 while(_rxbuf.empty() == true) {;}
kenjiArai 0:466200f304c9 199 _rxbuf.pop(c);
kenjiArai 0:466200f304c9 200 _buf[i] = c;
kenjiArai 0:466200f304c9 201 }
kenjiArai 0:466200f304c9 202 #if defined(DEBUG)
kenjiArai 0:466200f304c9 203 for (uint32_t i = 0; i < num; i++) {
kenjiArai 0:466200f304c9 204 printf("T: 0x%02x, ",_buf[i]);
kenjiArai 0:466200f304c9 205 }
kenjiArai 0:466200f304c9 206 #endif
kenjiArai 0:466200f304c9 207 num -= 1;
kenjiArai 0:466200f304c9 208 for (uint32_t i = 0; i < num; i++) {
kenjiArai 0:466200f304c9 209 _sum += _buf[i];
kenjiArai 0:466200f304c9 210 }
kenjiArai 0:466200f304c9 211 if (_sum == _buf[num]) {
kenjiArai 0:466200f304c9 212 #if defined(DEBUG)
kenjiArai 0:466200f304c9 213 printf("Sum is okay! sum = %d, buf = %d\r\n", _sum, _buf[num]);
kenjiArai 0:466200f304c9 214 #endif
kenjiArai 0:466200f304c9 215 p = buf;
kenjiArai 0:466200f304c9 216 for (uint32_t i = 0; i < num; i++) {
kenjiArai 0:466200f304c9 217 *p++ = _buf[i];
kenjiArai 0:466200f304c9 218 }
kenjiArai 0:466200f304c9 219 *p = 0;
kenjiArai 0:466200f304c9 220 #if defined(DEBUG)
kenjiArai 0:466200f304c9 221 printf("%s\r\n", buf);
kenjiArai 0:466200f304c9 222 } else {
kenjiArai 0:466200f304c9 223 printf("Sum is NG! sum = %d, buf = %d\r\n", _sum, _buf[num]);
kenjiArai 0:466200f304c9 224 }
kenjiArai 0:466200f304c9 225 #else
kenjiArai 0:466200f304c9 226 }
kenjiArai 0:466200f304c9 227 #endif
kenjiArai 0:466200f304c9 228 }
kenjiArai 0:466200f304c9 229
kenjiArai 0:466200f304c9 230 uint32_t DFR0534::get_play_time()
kenjiArai 0:466200f304c9 231 {
kenjiArai 0:466200f304c9 232 _rxbuf.reset(); // clear buffer
kenjiArai 0:466200f304c9 233 _command(0x24);
kenjiArai 0:466200f304c9 234 return get_time();
kenjiArai 0:466200f304c9 235 }
kenjiArai 0:466200f304c9 236
kenjiArai 0:466200f304c9 237 uint32_t DFR0534::get_play_back_time()
kenjiArai 0:466200f304c9 238 {
kenjiArai 0:466200f304c9 239 _rxbuf.reset(); // clear buffer
kenjiArai 0:466200f304c9 240 _command(0x25);
kenjiArai 0:466200f304c9 241 return get_time();
kenjiArai 0:466200f304c9 242 }
kenjiArai 0:466200f304c9 243
kenjiArai 0:466200f304c9 244 uint32_t DFR0534::get_time()
kenjiArai 0:466200f304c9 245 {
kenjiArai 0:466200f304c9 246 uint16_t dt = 0;
kenjiArai 0:466200f304c9 247 char c, h, m, s;
kenjiArai 0:466200f304c9 248
kenjiArai 0:466200f304c9 249 WAIT_MS(50);
kenjiArai 0:466200f304c9 250 for (uint32_t i = 0; i < 7; i++) {
kenjiArai 0:466200f304c9 251 while(_rxbuf.empty() == true) {;}
kenjiArai 0:466200f304c9 252 _rxbuf.pop(c);
kenjiArai 0:466200f304c9 253 _buf[i] = c;
kenjiArai 0:466200f304c9 254 }
kenjiArai 0:466200f304c9 255 #if defined(DEBUG)
kenjiArai 0:466200f304c9 256 for (uint32_t i = 0; i < 7; i++) {
kenjiArai 0:466200f304c9 257 printf("0x%02x, ",_buf[i]);
kenjiArai 0:466200f304c9 258 }
kenjiArai 0:466200f304c9 259 printf("\r\n");
kenjiArai 0:466200f304c9 260 #endif
kenjiArai 0:466200f304c9 261 if (_buf[0] == 0xaa) {
kenjiArai 0:466200f304c9 262 _sum = 0xaa;
kenjiArai 0:466200f304c9 263 _sum += _buf[1];
kenjiArai 0:466200f304c9 264 _sum += _buf[2];
kenjiArai 0:466200f304c9 265 h = _buf[3];
kenjiArai 0:466200f304c9 266 _sum += _buf[3];
kenjiArai 0:466200f304c9 267 m = _buf[4];
kenjiArai 0:466200f304c9 268 _sum += _buf[4];
kenjiArai 0:466200f304c9 269 s = _buf[5];
kenjiArai 0:466200f304c9 270 _sum += _buf[5];
kenjiArai 0:466200f304c9 271 if (_sum == _buf[6]) {
kenjiArai 0:466200f304c9 272 #if defined(DEBUG)
kenjiArai 0:466200f304c9 273 printf("Sum is okay! sum = %d, buf = %d\r\n", _sum, _buf[6]);
kenjiArai 0:466200f304c9 274 #endif
kenjiArai 0:466200f304c9 275 // success
kenjiArai 0:466200f304c9 276 return ((uint32_t)h * 3600 + (uint32_t)m * 60 + (uint32_t)s);
kenjiArai 0:466200f304c9 277 #if defined(DEBUG)
kenjiArai 0:466200f304c9 278 } else {
kenjiArai 0:466200f304c9 279 printf("Sum is NG! sum = %d, buf = %d\r\n", _sum, _buf[6]);
kenjiArai 0:466200f304c9 280 }
kenjiArai 0:466200f304c9 281 #else
kenjiArai 0:466200f304c9 282 }
kenjiArai 0:466200f304c9 283 #endif
kenjiArai 0:466200f304c9 284 }
kenjiArai 0:466200f304c9 285 return 0; // error
kenjiArai 0:466200f304c9 286 }
kenjiArai 0:466200f304c9 287
kenjiArai 0:466200f304c9 288 // Interrupt Hander
kenjiArai 0:466200f304c9 289 void DFR0534::_rx_handler(void)
kenjiArai 0:466200f304c9 290 {
kenjiArai 0:466200f304c9 291 while(_mp3.readable()) {
kenjiArai 0:466200f304c9 292 _rxbuf.push(_mp3.getc());
kenjiArai 0:466200f304c9 293 }
kenjiArai 0:466200f304c9 294 }
kenjiArai 0:466200f304c9 295
kenjiArai 0:466200f304c9 296 void DFR0534::_command(uint8_t cmd_no)
kenjiArai 0:466200f304c9 297 {
kenjiArai 0:466200f304c9 298 _sum = 0xaa;
kenjiArai 0:466200f304c9 299 _mp3.putc(_sum);
kenjiArai 0:466200f304c9 300 _sum += cmd_no;
kenjiArai 0:466200f304c9 301 WAIT_MS(2);
kenjiArai 0:466200f304c9 302 _mp3.putc(cmd_no);
kenjiArai 0:466200f304c9 303 WAIT_MS(2);
kenjiArai 0:466200f304c9 304 _mp3.putc(0x00);
kenjiArai 0:466200f304c9 305 WAIT_MS(2);
kenjiArai 0:466200f304c9 306 _mp3.putc(_sum);
kenjiArai 0:466200f304c9 307 }
kenjiArai 0:466200f304c9 308
kenjiArai 0:466200f304c9 309 void DFR0534::_command_w_para(uint8_t cmd_no, uint8_t *parameter, uint8_t len)
kenjiArai 0:466200f304c9 310 {
kenjiArai 0:466200f304c9 311 _sum = 0xaa;
kenjiArai 0:466200f304c9 312 _mp3.putc(_sum);
kenjiArai 0:466200f304c9 313 _sum += cmd_no;
kenjiArai 0:466200f304c9 314 WAIT_MS(2);
kenjiArai 0:466200f304c9 315 _mp3.putc(cmd_no);
kenjiArai 0:466200f304c9 316 WAIT_MS(2);
kenjiArai 0:466200f304c9 317 _mp3.putc(0x00);
kenjiArai 0:466200f304c9 318 WAIT_MS(2);
kenjiArai 0:466200f304c9 319 for (uint32_t i = 0; i < len; i++) {
kenjiArai 0:466200f304c9 320 uint8_t dt = *parameter++;
kenjiArai 0:466200f304c9 321 _sum += dt;
kenjiArai 0:466200f304c9 322 _mp3.putc(dt);
kenjiArai 0:466200f304c9 323 WAIT_MS(2);
kenjiArai 0:466200f304c9 324 }
kenjiArai 0:466200f304c9 325 _mp3.putc(_sum);
kenjiArai 0:466200f304c9 326 }
kenjiArai 0:466200f304c9 327
kenjiArai 0:466200f304c9 328 void DFR0534::_wait_busy(void)
kenjiArai 0:466200f304c9 329 {
kenjiArai 0:466200f304c9 330 while (_bsy.read() == 1) {
kenjiArai 0:466200f304c9 331 WAIT_MS(20);
kenjiArai 0:466200f304c9 332 }
kenjiArai 0:466200f304c9 333 }