/* Wtv020sd16p - Library to control a WTV020-SD-16P module Created by Diego J. Arevalo, August 6th, 2012 for Arduino plaform Modified by Kamil Kanas, 17/5/2017 for mbed platforms Tested with FRDM KL25Z board Released into the public domain 9/6/2017. */

Dependents:   WTV020SD16_Player_KL25

Committer:
kanatronics
Date:
Fri Jun 09 14:44:23 2017 +0000
Revision:
0:47be58458737
/*;  Wtv020sd16p - Library to control a WTV020-SD-16P module ;  Created by Diego J. Arevalo, August 6th, 2012 for  Arduino plaform;  Modified by Kamil Kanas, 17/5/2017 for mbed platforms;  Tested with FRDM KL25Z board;  Released into the public domain 9/7/2...

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kanatronics 0:47be58458737 1 /*
kanatronics 0:47be58458737 2 Wtv020sd16p.cpp - Library to control a WTV020-SD-16P module
kanatronics 0:47be58458737 3 Created by Diego J. Arevalo, August 6th, 2012 for Arduino plaform
kanatronics 0:47be58458737 4 Modified by Kamil Kanas, 17/5/2017 for mbed platforms
kanatronics 0:47be58458737 5 Tested with FRDM KL25Z board
kanatronics 0:47be58458737 6 Released into the public domain 9/6/2017.
kanatronics 0:47be58458737 7 */
kanatronics 0:47be58458737 8
kanatronics 0:47be58458737 9 #include "mbed.h"
kanatronics 0:47be58458737 10 #include "WTV020SD16.h"
kanatronics 0:47be58458737 11
kanatronics 0:47be58458737 12 const unsigned int PLAY_PAUSE = 0xFFFE;
kanatronics 0:47be58458737 13 const unsigned int STOP = 0xFFFF;
kanatronics 0:47be58458737 14 const unsigned int VOLUME_MIN = 0xFFF0;
kanatronics 0:47be58458737 15 const unsigned int VOLUME_MAX = 0xFFF7;
kanatronics 0:47be58458737 16
kanatronics 0:47be58458737 17 /*Pin definition*/
kanatronics 0:47be58458737 18 DigitalOut _resetPin(PTB0); //reset pin Output
kanatronics 0:47be58458737 19 DigitalOut _clockPin(PTB1); //clock pin Output
kanatronics 0:47be58458737 20 DigitalOut _dataPin(PTB2); //data pin Output
kanatronics 0:47be58458737 21 DigitalIn _busyPin(PTB3); //busy pin Input
kanatronics 0:47be58458737 22
kanatronics 0:47be58458737 23
kanatronics 0:47be58458737 24
kanatronics 0:47be58458737 25 void Wtv020sd16p::reset(){
kanatronics 0:47be58458737 26
kanatronics 0:47be58458737 27 //Reset pulse.
kanatronics 0:47be58458737 28 _clockPin=0;
kanatronics 0:47be58458737 29 _resetPin=1;
kanatronics 0:47be58458737 30 _resetPin=0;
kanatronics 0:47be58458737 31 wait_ms(5);
kanatronics 0:47be58458737 32 _resetPin=1; //Reset idle to start bit.
kanatronics 0:47be58458737 33 _clockPin=1;
kanatronics 0:47be58458737 34 wait_ms(300);
kanatronics 0:47be58458737 35 }
kanatronics 0:47be58458737 36
kanatronics 0:47be58458737 37 void Wtv020sd16p::playVoice(int voiceNumber){
kanatronics 0:47be58458737 38 sendCommand(voiceNumber);
kanatronics 0:47be58458737 39
kanatronics 0:47be58458737 40 _busyPinState= _busyPin;
kanatronics 0:47be58458737 41
kanatronics 0:47be58458737 42 while(_busyPinState==1){
kanatronics 0:47be58458737 43 _busyPinState=_busyPin;
kanatronics 0:47be58458737 44 }
kanatronics 0:47be58458737 45 }
kanatronics 0:47be58458737 46
kanatronics 0:47be58458737 47 void Wtv020sd16p::asyncPlayVoice(int voiceNumber){
kanatronics 0:47be58458737 48 sendCommand(voiceNumber);
kanatronics 0:47be58458737 49 }
kanatronics 0:47be58458737 50
kanatronics 0:47be58458737 51 void Wtv020sd16p::stopVoice(){
kanatronics 0:47be58458737 52 sendCommand(STOP);
kanatronics 0:47be58458737 53 }
kanatronics 0:47be58458737 54
kanatronics 0:47be58458737 55 void Wtv020sd16p::pauseVoice(){
kanatronics 0:47be58458737 56 sendCommand(PLAY_PAUSE);
kanatronics 0:47be58458737 57 }
kanatronics 0:47be58458737 58
kanatronics 0:47be58458737 59 void Wtv020sd16p::mute(){
kanatronics 0:47be58458737 60 sendCommand(VOLUME_MIN);
kanatronics 0:47be58458737 61 }
kanatronics 0:47be58458737 62
kanatronics 0:47be58458737 63 void Wtv020sd16p::unmute(){
kanatronics 0:47be58458737 64 sendCommand(VOLUME_MAX);
kanatronics 0:47be58458737 65 }
kanatronics 0:47be58458737 66
kanatronics 0:47be58458737 67 void Wtv020sd16p::sendCommand(unsigned int command) {
kanatronics 0:47be58458737 68 //Start bit Low level pulse.
kanatronics 0:47be58458737 69 _clockPin=0;
kanatronics 0:47be58458737 70 wait_ms(2);
kanatronics 0:47be58458737 71 for (unsigned int mask = 0x8000; mask > 0; mask >>= 1) {
kanatronics 0:47be58458737 72 //Clock low level pulse.
kanatronics 0:47be58458737 73 _clockPin=0;
kanatronics 0:47be58458737 74 wait_us(50);
kanatronics 0:47be58458737 75 //Write data setup.
kanatronics 0:47be58458737 76 if (command & mask) {
kanatronics 0:47be58458737 77 _dataPin=1;
kanatronics 0:47be58458737 78 } else
kanatronics 0:47be58458737 79 {
kanatronics 0:47be58458737 80
kanatronics 0:47be58458737 81 _dataPin=0;
kanatronics 0:47be58458737 82 }
kanatronics 0:47be58458737 83 //Write data hold.
kanatronics 0:47be58458737 84 wait_us(50);
kanatronics 0:47be58458737 85 //Clock high level pulse.
kanatronics 0:47be58458737 86
kanatronics 0:47be58458737 87 _clockPin=1;
kanatronics 0:47be58458737 88 wait_us(100);
kanatronics 0:47be58458737 89 if (mask>0x0001){
kanatronics 0:47be58458737 90 //Stop bit high level pulse.
kanatronics 0:47be58458737 91 wait_ms(2);
kanatronics 0:47be58458737 92 }
kanatronics 0:47be58458737 93 }
kanatronics 0:47be58458737 94 //Busy active high from last data bit latch.
kanatronics 0:47be58458737 95 wait_ms(20);
kanatronics 0:47be58458737 96 }