Library for VS1053 chip

Committer:
clemente
Date:
Thu May 24 12:48:19 2012 +0000
Revision:
1:399afe8151de
Parent:
0:e97876f96d4b

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
clemente 0:e97876f96d4b 1 /* mbed VLSIcodec library. To access VS1053 MPEG3 codec.
clemente 0:e97876f96d4b 2
clemente 0:e97876f96d4b 3 Copyright (c) 2010 NXP 3790
clemente 0:e97876f96d4b 4
clemente 0:e97876f96d4b 5 Permission is hereby granted, free of charge, to any person obtaining a copy
clemente 0:e97876f96d4b 6 of this software and associated documentation files (the "Software"), to deal
clemente 0:e97876f96d4b 7 in the Software without restriction, including without limitation the rights
clemente 0:e97876f96d4b 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
clemente 0:e97876f96d4b 9 copies of the Software, and to permit persons to whom the Software is
clemente 0:e97876f96d4b 10 furnished to do so, subject to the following conditions:
clemente 0:e97876f96d4b 11
clemente 0:e97876f96d4b 12 The above copyright notice and this permission notice shall be included in
clemente 0:e97876f96d4b 13 all copies or substantial portions of the Software.
clemente 0:e97876f96d4b 14
clemente 0:e97876f96d4b 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
clemente 0:e97876f96d4b 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
clemente 0:e97876f96d4b 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
clemente 0:e97876f96d4b 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
clemente 0:e97876f96d4b 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
clemente 0:e97876f96d4b 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
clemente 0:e97876f96d4b 21 THE SOFTWARE.
clemente 0:e97876f96d4b 22 */
clemente 0:e97876f96d4b 23
clemente 0:e97876f96d4b 24 #ifndef __VLSICODEC_H
clemente 0:e97876f96d4b 25 #define __VLSICODEC_H
clemente 0:e97876f96d4b 26
clemente 0:e97876f96d4b 27 #include "mbed.h"
clemente 0:e97876f96d4b 28
clemente 0:e97876f96d4b 29 /* */
clemente 0:e97876f96d4b 30 #define __PLUGINGA 1
clemente 0:e97876f96d4b 31 /* */
clemente 0:e97876f96d4b 32 #define MP3_INIT_SPEED 2000000 /* 2Mbit */
clemente 0:e97876f96d4b 33 #define MP3_RUN_SPEED 3000000 /* 3Mbit */
clemente 0:e97876f96d4b 34 #define MP3_BUS_MODE 3
clemente 0:e97876f96d4b 35
clemente 0:e97876f96d4b 36 /** This library drive a VS1053 codec to play VAW/MP3/Ogg audio file.
clemente 0:e97876f96d4b 37 *
clemente 0:e97876f96d4b 38 * @code
clemente 0:e97876f96d4b 39 *
clemente 0:e97876f96d4b 40 * VS1053Codec codec( p11, p12, p13, p21, p22, p23, p24);
clemente 0:e97876f96d4b 41 *
clemente 0:e97876f96d4b 42 * int main( void)
clemente 0:e97876f96d4b 43 * {
clemente 0:e97876f96d4b 44 * codec.init(); // initialize the codec
clemente 0:e97876f96d4b 45 * codec.loadpatch(); // load the patch code (rev 1.5)
clemente 0:e97876f96d4b 46 * codec.setbassboost( 15, 150); // set the bass boost value
clemente 0:e97876f96d4b 47 * codec.settrebleboost( 7, 15000); // set the treable boost value
clemente 0:e97876f96d4b 48 * codec.setvolume( 0x0, 0x0); // set the volume
clemente 0:e97876f96d4b 49 *
clemente 0:e97876f96d4b 50 * // snd_piano is a Ogg file stored in flash memory.
clemente 0:e97876f96d4b 51 * int cnt=sizeof(snd_piano)/sizeof(snd_piano[0]);
clemente 0:e97876f96d4b 52 * //
clemente 0:e97876f96d4b 53 * printf("Start playing file snd_piano [%d]\n\r", cnt);
clemente 0:e97876f96d4b 54 * //
clemente 0:e97876f96d4b 55 * int iSize=0;
clemente 0:e97876f96d4b 56 * while( iSize < cnt) {
clemente 0:e97876f96d4b 57 * int count=32;
clemente 0:e97876f96d4b 58 * codec.testdreq();
clemente 0:e97876f96d4b 59 * while( count--) {
clemente 0:e97876f96d4b 60 * codec.writedata( snd_piano[ iSize++]);
clemente 0:e97876f96d4b 61 * if ( iSize > cnt)
clemente 0:e97876f96d4b 62 * break;
clemente 0:e97876f96d4b 63 * }
clemente 0:e97876f96d4b 64 * }
clemente 0:e97876f96d4b 65 * }
clemente 0:e97876f96d4b 66 *
clemente 0:e97876f96d4b 67 * @endcode
clemente 0:e97876f96d4b 68 *
clemente 0:e97876f96d4b 69 */
clemente 0:e97876f96d4b 70
clemente 0:e97876f96d4b 71 //
clemente 0:e97876f96d4b 72 class VS1053Codec {
clemente 0:e97876f96d4b 73
clemente 0:e97876f96d4b 74 public:
clemente 0:e97876f96d4b 75
clemente 0:e97876f96d4b 76 /** Initialize the SPI connection to the codec and other services pins.
clemente 0:e97876f96d4b 77 *
clemente 0:e97876f96d4b 78 * @param mosi, miso, sclk the SPI connection pins
clemente 0:e97876f96d4b 79 * @param cs the chip select SPI pin
clemente 0:e97876f96d4b 80 * @param dreq If DREQ is high, VS1053b can take at least 32 bytes of SDI data or one SCI command. DREQ is turned
clemente 0:e97876f96d4b 81 * low when the stream buffer is too full and for the duration of a SCI command.
clemente 0:e97876f96d4b 82 * @param rst hardware reset, active low
clemente 0:e97876f96d4b 83 * @param xdcs the xdcs pin is the "data chip select".
clemente 0:e97876f96d4b 84 */
clemente 0:e97876f96d4b 85 VS1053Codec( PinName mosi, PinName miso, PinName sclk, PinName cs, PinName dreq, PinName rst, PinName xdcs);
clemente 0:e97876f96d4b 86
clemente 0:e97876f96d4b 87 /** Initialize the connection to the VS1053 codec.
clemente 0:e97876f96d4b 88 * Never return if fail.
clemente 0:e97876f96d4b 89 */
clemente 0:e97876f96d4b 90 void init(void);
clemente 0:e97876f96d4b 91
clemente 0:e97876f96d4b 92 /** Test the dreq pin. If high the VS1053 can take data.
clemente 0:e97876f96d4b 93 * The function never return until the pin goes high.
clemente 0:e97876f96d4b 94 */
clemente 0:e97876f96d4b 95 void testdreq( void);
clemente 0:e97876f96d4b 96
clemente 0:e97876f96d4b 97 /** Reset the codec
clemente 0:e97876f96d4b 98 */
clemente 0:e97876f96d4b 99 void reset( void);
clemente 0:e97876f96d4b 100
clemente 0:e97876f96d4b 101 /** write a byte to the codec
clemente 0:e97876f96d4b 102 *
clemente 0:e97876f96d4b 103 * @param data
clemente 0:e97876f96d4b 104 */
clemente 0:e97876f96d4b 105 void writedata( unsigned char data);
clemente 0:e97876f96d4b 106
clemente 0:e97876f96d4b 107 /** Set the bass boost value
clemente 0:e97876f96d4b 108 *
clemente 0:e97876f96d4b 109 * @param bass Bass gain in dB, range from 0 to 15
clemente 0:e97876f96d4b 110 * @param freq Limit frequency for bass boost, 10 Hz steps (range from
clemente 0:e97876f96d4b 111 * 20 to 150)
clemente 0:e97876f96d4b 112 */
clemente 0:e97876f96d4b 113 void setbassboost(unsigned char bass, unsigned char gfreq);
clemente 0:e97876f96d4b 114
clemente 0:e97876f96d4b 115 /** Set treable boost value
clemente 0:e97876f96d4b 116 *
clemente 0:e97876f96d4b 117 * @param treable Bass gain in dB, range from -8 to 7
clemente 0:e97876f96d4b 118 * @param freq Limit frequency for bass boost, 1000 Hz steps (range from
clemente 0:e97876f96d4b 119 * 1000 to 15000)
clemente 0:e97876f96d4b 120 */
clemente 0:e97876f96d4b 121 void settrebleboost( char treble, unsigned int gfreq);
clemente 0:e97876f96d4b 122
clemente 0:e97876f96d4b 123 /** Set the volume.
clemente 0:e97876f96d4b 124 * Note, that after hardware reset the volume is set to full volume. Resetting the software does not reset the
clemente 0:e97876f96d4b 125 * volume setting.
clemente 0:e97876f96d4b 126 *
clemente 0:e97876f96d4b 127 * @param right vol right channel attenuation from maximum volume, 0.5dB steps
clemente 0:e97876f96d4b 128 * (0x00 = full volume, 0xFE= muted, 0xFF analog power down mode)
clemente 0:e97876f96d4b 129 * @param left vol left channel attenuation from maximum volume, 0.5dB steps
clemente 0:e97876f96d4b 130 * (0x00 = full volume, 0xFE= muted, 0xFF analog power down mode)
clemente 0:e97876f96d4b 131 *
clemente 0:e97876f96d4b 132 */
clemente 0:e97876f96d4b 133 void setvolume(unsigned char vRight, unsigned char vLeft);
clemente 0:e97876f96d4b 134
clemente 0:e97876f96d4b 135 /** Get the current decodet time
clemente 0:e97876f96d4b 136 *
clemente 0:e97876f96d4b 137 * @param playtime a pointer to a string where the function will write the time in the format
clemente 0:e97876f96d4b 138 * MM:SS
clemente 0:e97876f96d4b 139 */
clemente 0:e97876f96d4b 140 void getplaytime(char *playtime);
clemente 0:e97876f96d4b 141
clemente 0:e97876f96d4b 142 /** Start a sine test to verify codec functionality
clemente 0:e97876f96d4b 143 *
clemente 0:e97876f96d4b 144 * @param pitch is a composite value. Use 0x7E to play a tone at 5KHz sampled at 22050Hz.
clemente 0:e97876f96d4b 145 * Use zero to stop to play.
clemente 0:e97876f96d4b 146 * @code
clemente 0:e97876f96d4b 147 * codec.sinetest( 0x7E); // start the sine test...
clemente 0:e97876f96d4b 148 * wait( 1); // wait 1 sec..
clemente 0:e97876f96d4b 149 * codec.sinetest( 0x00); // stop the sine test...
clemente 0:e97876f96d4b 150 * @endcode
clemente 0:e97876f96d4b 151 */
clemente 0:e97876f96d4b 152 void sinetest(unsigned char pitch);
clemente 0:e97876f96d4b 153
clemente 0:e97876f96d4b 154 /** Load a VLSI patch code inside the codec. The library is rev 1.5
clemente 0:e97876f96d4b 155 * This patch enable some features like VMeter.
clemente 0:e97876f96d4b 156 */
clemente 0:e97876f96d4b 157 void loadpatch(void);
clemente 0:e97876f96d4b 158
clemente 0:e97876f96d4b 159 #ifdef __ENCODE_OGG
clemente 0:e97876f96d4b 160 /** Load a VLSI patch code to encode OGG audio file.
clemente 0:e97876f96d4b 161 * This file will encode at fixed quality. Read the VLSIcodec_OGG.h for more...
clemente 0:e97876f96d4b 162 */
clemente 0:e97876f96d4b 163 void loadoggpatch(void);
clemente 0:e97876f96d4b 164 #endif
clemente 0:e97876f96d4b 165
clemente 0:e97876f96d4b 166 #ifdef __PLUGINGA
clemente 0:e97876f96d4b 167 /** Load a VLSI patch code that add a 23 band Graphics Analizer.
clemente 0:e97876f96d4b 168 *
clemente 0:e97876f96d4b 169 */
clemente 0:e97876f96d4b 170 void loadgapatch(void);
clemente 0:e97876f96d4b 171 void readgavalue( unsigned char *currval, unsigned char *peak);
clemente 0:e97876f96d4b 172 unsigned short readgabands( void);
clemente 0:e97876f96d4b 173 #endif
clemente 0:e97876f96d4b 174
clemente 0:e97876f96d4b 175
clemente 0:e97876f96d4b 176 /** Start the Vmeter functionallity.
clemente 0:e97876f96d4b 177 *
clemente 0:e97876f96d4b 178 */
clemente 0:e97876f96d4b 179 void setvmeter( void);
clemente 0:e97876f96d4b 180
clemente 0:e97876f96d4b 181 /** Get vmeter values. Values from 0 to 31 are valid for both channels
clemente 0:e97876f96d4b 182 * Calculates the peak sample value from both channels and returns the values in 3 dB
clemente 0:e97876f96d4b 183 *
clemente 0:e97876f96d4b 184 * @param left left channel value
clemente 0:e97876f96d4b 185 * @param right right channel value
clemente 0:e97876f96d4b 186 */
clemente 0:e97876f96d4b 187 void getvmeterval( unsigned char* left, unsigned char* right);
clemente 0:e97876f96d4b 188
clemente 0:e97876f96d4b 189 /** Put the codec in reset for reduce power consuption.
clemente 0:e97876f96d4b 190 * Re-init the codec for wake-up.
clemente 0:e97876f96d4b 191 */
clemente 0:e97876f96d4b 192 void lowpower( void);
clemente 0:e97876f96d4b 193
clemente 0:e97876f96d4b 194 #ifdef __ENCODE_OGG
clemente 0:e97876f96d4b 195 /** Start the encoding. Reset and then load the patch to record a audio stream.
clemente 0:e97876f96d4b 196 */
clemente 0:e97876f96d4b 197 void VoggEncoding_Start( void);
clemente 0:e97876f96d4b 198
clemente 0:e97876f96d4b 199 /** Read the encoded samples.
clemente 0:e97876f96d4b 200 *
clemente 0:e97876f96d4b 201 * @param *voggSample pointer to array to store the sample
clemente 0:e97876f96d4b 202 * @return number of byte write.
clemente 0:e97876f96d4b 203 */
clemente 0:e97876f96d4b 204 unsigned int VoggEncoding_ReadBuffer( unsigned char *voggSample);
clemente 0:e97876f96d4b 205
clemente 0:e97876f96d4b 206 /** Stop the encoding and return the last buffer encoded.
clemente 0:e97876f96d4b 207 *
clemente 0:e97876f96d4b 208 * @param *voggSample pointer to array to store the sample
clemente 0:e97876f96d4b 209 * @return number of byte write.
clemente 0:e97876f96d4b 210 */
clemente 0:e97876f96d4b 211 unsigned int VoggEncoding_Stop( unsigned char *voggSample);
clemente 0:e97876f96d4b 212 #endif
clemente 0:e97876f96d4b 213
clemente 0:e97876f96d4b 214 protected:
clemente 0:e97876f96d4b 215 //
clemente 0:e97876f96d4b 216 unsigned short readreg(unsigned char vAddress);
clemente 0:e97876f96d4b 217 void writereg(unsigned char vAddress, unsigned int wValue);
clemente 0:e97876f96d4b 218 void writeregnowait(unsigned char vAddress, unsigned int wValue);
clemente 0:e97876f96d4b 219 //
clemente 0:e97876f96d4b 220 SPI _spi;
clemente 0:e97876f96d4b 221 DigitalOut _cs;
clemente 0:e97876f96d4b 222 DigitalIn _dreq;
clemente 0:e97876f96d4b 223 DigitalOut _rst;
clemente 0:e97876f96d4b 224 DigitalOut _xdcs;
clemente 0:e97876f96d4b 225
clemente 0:e97876f96d4b 226 };
clemente 0:e97876f96d4b 227
clemente 0:e97876f96d4b 228 #endif