4D Systems Sound Module Library

Dependents:   STM32F030R8_SOMO-14D

SOMO-14D

The SOMO-14D is a tiny Audio-Sound module that can play back pre-stored audio files such as voice and music from a micro-SD memory card. The module supports 4-bit ADPCM audio files with sample rates from 6Khz up to 32Khz. By using the freely available software tool, any WAVE(.wav) or MP3(.mp3) file can be easily converted to the ADPCM(.ad4) format which can then be can be saved to a micro-SD memory card. The compact 14pin drop-in-module takes up very minimal board space and is ideal for any application that requires embedded audio.

The SERIAL-MODE provides a simple 2-wire interface to any micro-controller via its DATA and CLK lines. Audio operations such as PLAY, PAUSE,STOP and VOLUME control functions are all available to the host micro via simple serial commands.

SOMO-14D Library

The SOMO library handles all basic functions that access the hardware to set the commands that ensure SERIAL-MODE interfacing.

Some of the functions can make control of: - Initialization - Activity - Command

Initialization Function

  • void SOMO14DInit(void (*pfunc)(void));

Activity Function

  • INT8U SOMO14DisBusy(void);

Commanding Functions

  • void SOMO14DSerialOut(INT16U SOMO14Duint16);
  • void SOMO14DPause(void);
  • void SOMO14DStop(void);
  • void SOMO14DSetVol(INT8U *SOMO14DVol);
  • void SOMO14DSetAudio(INT16U SOMO14DAudioFileNo);

For check the function by capability please check the "functions" wiki

Committer:
issaiass
Date:
Sat Mar 14 01:39:34 2015 +0000
Revision:
2:673ecbaff67b
Parent:
1:803045697299
Moved the serial out function of the SOMO to declare private

Who changed what in which revision?

UserRevisionLine numberNew contents of line
issaiass 0:41f21e0cf86f 1 /*
issaiass 0:41f21e0cf86f 2 *******************************************************************************
issaiass 0:41f21e0cf86f 3 * CERES CONTROLS
issaiass 0:41f21e0cf86f 4 * PANAMA, REPULIC OF PANAMA
issaiass 0:41f21e0cf86f 5 *
issaiass 0:41f21e0cf86f 6 * File : SOMO14D.h
issaiass 0:41f21e0cf86f 7 * Programmer(s) : Rangel Alvarado
issaiass 0:41f21e0cf86f 8 * Language : ANSI-C
issaiass 0:41f21e0cf86f 9 * Description : SOMO14D is an acronym of SOund MOdule 1 4D SYSTEMS INC.
issaiass 0:41f21e0cf86f 10 * The file manage all functions of the SOMO.
issaiass 0:41f21e0cf86f 11 *
issaiass 0:41f21e0cf86f 12 * Note : Dependancies of mbed libraries...
issaiass 0:41f21e0cf86f 13 * - InterruptIn
issaiass 0:41f21e0cf86f 14 * - DigitalOut
issaiass 0:41f21e0cf86f 15 *
issaiass 0:41f21e0cf86f 16 * ----------------------------------------------------------------------------
issaiass 0:41f21e0cf86f 17 * HISTORY
issaiass 0:41f21e0cf86f 18 * DD MM AA
issaiass 0:41f21e0cf86f 19 * 09 03 15 Created.
issaiass 0:41f21e0cf86f 20 * 09 03 15 Modified.
issaiass 0:41f21e0cf86f 21 * 12 03 15 Import to mbed platform.
issaiass 2:673ecbaff67b 22 * 13 03 15 Moved the SOMO Serial Out function declaration to this file.
issaiass 0:41f21e0cf86f 23 *******************************************************************************
issaiass 0:41f21e0cf86f 24 */
issaiass 0:41f21e0cf86f 25
issaiass 0:41f21e0cf86f 26 /*
issaiass 0:41f21e0cf86f 27 *******************************************************************************
issaiass 1:803045697299 28 * INCLUDE FILES
issaiass 0:41f21e0cf86f 29 *******************************************************************************
issaiass 0:41f21e0cf86f 30 */
issaiass 0:41f21e0cf86f 31
issaiass 0:41f21e0cf86f 32 #include "includes.h" /* Main include file */
issaiass 0:41f21e0cf86f 33
issaiass 0:41f21e0cf86f 34 InterruptIn SOMO14DBusy(SOMO_BUSY_PIN); /* BUSY signal. Active HIGH output. */
issaiass 0:41f21e0cf86f 35 DigitalOut SOMO14DData(SOMO_DATA_PIN); /* Serial DATA input from host MCU */
issaiass 0:41f21e0cf86f 36 DigitalOut SOMO14DClk(SOMO_CLK_PIN); /* Serial Clock input from host MCU */
issaiass 0:41f21e0cf86f 37 DigitalOut SOMO14DReset(SOMO_RESET_PIN);/* Master Reset. Active LOW trigger. */
issaiass 0:41f21e0cf86f 38
issaiass 2:673ecbaff67b 39
issaiass 2:673ecbaff67b 40 /*
issaiass 2:673ecbaff67b 41 *******************************************************************************
issaiass 2:673ecbaff67b 42 * PRIVATE FUNCTION DECLARATION
issaiass 2:673ecbaff67b 43 *******************************************************************************
issaiass 2:673ecbaff67b 44 */
issaiass 2:673ecbaff67b 45
issaiass 2:673ecbaff67b 46 void SOMO14DSerialOut(INT16U SOMO14Duint16); /* Serial out command */
issaiass 2:673ecbaff67b 47
issaiass 2:673ecbaff67b 48
issaiass 0:41f21e0cf86f 49 /*
issaiass 0:41f21e0cf86f 50 *******************************************************************************
issaiass 0:41f21e0cf86f 51 *
issaiass 0:41f21e0cf86f 52 * SOMO14D IS BUSY
issaiass 0:41f21e0cf86f 53 *
issaiass 0:41f21e0cf86f 54 * Description : Check if a function is executing by the module
issaiass 0:41f21e0cf86f 55 * Arguments : None
issaiass 0:41f21e0cf86f 56 * Return : TRUE if the module is holding an action
issaiass 0:41f21e0cf86f 57 * FALSE if the module is in waiting state
issaiass 0:41f21e0cf86f 58 * Notes : Busy pin is active low triggered.
issaiass 0:41f21e0cf86f 59 *******************************************************************************
issaiass 0:41f21e0cf86f 60 */
issaiass 0:41f21e0cf86f 61
issaiass 0:41f21e0cf86f 62 INT8U SOMO14DisBusy(void) {
issaiass 0:41f21e0cf86f 63 if(SOMO14DBusy.read()) { /* If input is HIGH */
issaiass 0:41f21e0cf86f 64 return TRUE; /* SOMO is doing something */
issaiass 0:41f21e0cf86f 65 }
issaiass 0:41f21e0cf86f 66 return FALSE; /* SOMO is on low power mode */
issaiass 0:41f21e0cf86f 67 }
issaiass 0:41f21e0cf86f 68
issaiass 0:41f21e0cf86f 69 /*
issaiass 0:41f21e0cf86f 70 *******************************************************************************
issaiass 0:41f21e0cf86f 71 *
issaiass 0:41f21e0cf86f 72 * INITIALIZE THE SOUND MODULE
issaiass 0:41f21e0cf86f 73 *
issaiass 0:41f21e0cf86f 74 * Description : Initial setup for the module and signals
issaiass 0:41f21e0cf86f 75 * Arguments : pfunc pointer to function of an ISR
issaiass 0:41f21e0cf86f 76 * Return : None
issaiass 0:41f21e0cf86f 77 * Notes : Activity pins are in idle state
issaiass 0:41f21e0cf86f 78 *******************************************************************************
issaiass 0:41f21e0cf86f 79 */
issaiass 0:41f21e0cf86f 80
issaiass 0:41f21e0cf86f 81 void SOMO14DInit(void (*pfunc)(void)) {
issaiass 0:41f21e0cf86f 82 SOMO14DBusy.disable_irq(); /* disble busy pin interrupt */
issaiass 0:41f21e0cf86f 83 SOMO14DReset = HIGH; /* Reset the SOMO */
issaiass 0:41f21e0cf86f 84 SOMO14DClk = HIGH; /* Hold line up */
issaiass 0:41f21e0cf86f 85 SOMO14DData = HIGH; /* Hold data up */
issaiass 0:41f21e0cf86f 86 SOMO14DBusy.fall(pfunc); /* Attach an ISR */
issaiass 0:41f21e0cf86f 87 SOMO14DBusy.mode(PullUp); /* Pull up this pin */
issaiass 0:41f21e0cf86f 88 SOMO14DBusy.enable_irq(); /* Enable the pin IRQ */
issaiass 0:41f21e0cf86f 89 }
issaiass 0:41f21e0cf86f 90
issaiass 0:41f21e0cf86f 91 /*
issaiass 0:41f21e0cf86f 92 *******************************************************************************
issaiass 0:41f21e0cf86f 93 *
issaiass 0:41f21e0cf86f 94 * SOUND MODULE SERIAL OUT COMMAND
issaiass 0:41f21e0cf86f 95 *
issaiass 0:41f21e0cf86f 96 * Description : Send the command, left to right, first is B15, last B0.
issaiass 0:41f21e0cf86f 97 * Arguments : SOMO14Duint16 16-bit command that makes an action
issaiass 0:41f21e0cf86f 98 * Return : None
issaiass 0:41f21e0cf86f 99 * Notes : None
issaiass 0:41f21e0cf86f 100 *******************************************************************************
issaiass 0:41f21e0cf86f 101 */
issaiass 0:41f21e0cf86f 102
issaiass 0:41f21e0cf86f 103 void SOMO14DSerialOut(INT16U SOMO14Duint16) {
issaiass 0:41f21e0cf86f 104 INT16U bit; /* Handles bit variable */
issaiass 0:41f21e0cf86f 105 INT8U i; /* Iterator */
issaiass 0:41f21e0cf86f 106
issaiass 0:41f21e0cf86f 107
issaiass 0:41f21e0cf86f 108 SOMO14DClk = LOW; /* CLK = 0 */
issaiass 0:41f21e0cf86f 109 wait(SOMO_WAIT_BIT); /* Waits between bits */
issaiass 0:41f21e0cf86f 110 for (i = 0; i < 16; i++) { /* Extract the 16 bits */
issaiass 0:41f21e0cf86f 111 bit = (SOMO14Duint16 & (0x8000 >> i)); /* get a bit */
issaiass 0:41f21e0cf86f 112 if (bit) { /* if flagged */
issaiass 0:41f21e0cf86f 113 SOMO14DData = HIGH; /* DATA = 1 */
issaiass 0:41f21e0cf86f 114 } else { /* Otherwise */
issaiass 0:41f21e0cf86f 115 SOMO14DData = LOW; /* DATA = 0 */
issaiass 0:41f21e0cf86f 116 }
issaiass 0:41f21e0cf86f 117 wait(SOMO_WAIT_BIT); /* Waits between bits */
issaiass 0:41f21e0cf86f 118 SOMO14DClk = HIGH; /* CLK = 1 */
issaiass 0:41f21e0cf86f 119 wait(SOMO_WAIT_BIT); /* Waits between bits */
issaiass 0:41f21e0cf86f 120 SOMO14DClk = LOW; /* CLK = 0 */
issaiass 0:41f21e0cf86f 121 }
issaiass 0:41f21e0cf86f 122 wait(SOMO_WAIT_IDLE); /* Idle State */
issaiass 0:41f21e0cf86f 123 SOMO14DClk = HIGH; /* Return clock to idle */
issaiass 0:41f21e0cf86f 124 }
issaiass 0:41f21e0cf86f 125
issaiass 0:41f21e0cf86f 126
issaiass 0:41f21e0cf86f 127 /*
issaiass 0:41f21e0cf86f 128 *******************************************************************************
issaiass 0:41f21e0cf86f 129 *
issaiass 0:41f21e0cf86f 130 * PAUSE THE SOUND MODULE
issaiass 0:41f21e0cf86f 131 *
issaiass 0:41f21e0cf86f 132 * Description : Hold or release signal for the sound module (pause/play)
issaiass 0:41f21e0cf86f 133 * Arguments : None
issaiass 0:41f21e0cf86f 134 * Return : None
issaiass 0:41f21e0cf86f 135 * Notes : None
issaiass 0:41f21e0cf86f 136 *******************************************************************************
issaiass 0:41f21e0cf86f 137 */
issaiass 0:41f21e0cf86f 138
issaiass 0:41f21e0cf86f 139 void SOMO14DPause(void) {
issaiass 0:41f21e0cf86f 140 SOMO14DSerialOut(SOMO_PAUSE_CMD_OFFSET); /* Send Pause Command */
issaiass 0:41f21e0cf86f 141 }
issaiass 0:41f21e0cf86f 142
issaiass 0:41f21e0cf86f 143 /*
issaiass 0:41f21e0cf86f 144 *******************************************************************************
issaiass 0:41f21e0cf86f 145 *
issaiass 0:41f21e0cf86f 146 * STOP THE SOUND MODULE
issaiass 0:41f21e0cf86f 147 *
issaiass 0:41f21e0cf86f 148 * Description : Send a stop signal and goes to low consumption mode
issaiass 0:41f21e0cf86f 149 * Arguments : None
issaiass 0:41f21e0cf86f 150 * Return : None
issaiass 0:41f21e0cf86f 151 * Notes : None
issaiass 0:41f21e0cf86f 152 *******************************************************************************
issaiass 0:41f21e0cf86f 153 */
issaiass 0:41f21e0cf86f 154
issaiass 0:41f21e0cf86f 155 void SOMO14DStop() {
issaiass 0:41f21e0cf86f 156 SOMO14DSerialOut(SOMO_STOP_CMD_OFFSET); /* Send Stop Command */
issaiass 0:41f21e0cf86f 157 }
issaiass 0:41f21e0cf86f 158
issaiass 0:41f21e0cf86f 159 /*
issaiass 0:41f21e0cf86f 160 *******************************************************************************
issaiass 0:41f21e0cf86f 161 *
issaiass 0:41f21e0cf86f 162 * SET A VOLUME LEVEL ON THE SOUND MODULE
issaiass 0:41f21e0cf86f 163 *
issaiass 1:803045697299 164 * Description : Set the volume level of the SOMO.
issaiass 1:803045697299 165 * Arguments : SOMO14DVol volume level
issaiass 0:41f21e0cf86f 166 * Return : None
issaiass 1:803045697299 167 * Notes : 0 = Minimun volume
issaiass 1:803045697299 168 * 7 = Maximum volume
issaiass 1:803045697299 169 * Alters and truncate the variable, because is pointer based.
issaiass 0:41f21e0cf86f 170 *******************************************************************************
issaiass 0:41f21e0cf86f 171 */
issaiass 0:41f21e0cf86f 172
issaiass 0:41f21e0cf86f 173 void SOMO14DSetVol(INT8U *SOMO14DVol) {
issaiass 0:41f21e0cf86f 174 INT16U vol; /* Volume local variable */
issaiass 0:41f21e0cf86f 175
issaiass 0:41f21e0cf86f 176
issaiass 0:41f21e0cf86f 177 if (*SOMO14DVol == SOMO_VOL_UNF) { /* If volume is underflowed */
issaiass 0:41f21e0cf86f 178 *SOMO14DVol = SOMO_VOL_MIN; /* Set the volume to mute */
issaiass 0:41f21e0cf86f 179 }
issaiass 0:41f21e0cf86f 180 if (*SOMO14DVol > SOMO_VOL_MAX) { /* If volume is maximum */
issaiass 0:41f21e0cf86f 181 *SOMO14DVol = SOMO_VOL_MAX; /* Stay on maximum */
issaiass 0:41f21e0cf86f 182 }
issaiass 0:41f21e0cf86f 183 vol = SOMO_VOL_CMD_OFFSET + *SOMO14DVol; /* Set volume level */
issaiass 0:41f21e0cf86f 184 SOMO14DSerialOut(vol); /* Send volume command */
issaiass 0:41f21e0cf86f 185 }
issaiass 0:41f21e0cf86f 186
issaiass 0:41f21e0cf86f 187
issaiass 0:41f21e0cf86f 188 /*
issaiass 0:41f21e0cf86f 189 *******************************************************************************
issaiass 0:41f21e0cf86f 190 *
issaiass 0:41f21e0cf86f 191 * SET AN AUDIO FILE ON THE PLAYLIST
issaiass 0:41f21e0cf86f 192 *
issaiass 1:803045697299 193 * Description : Play the audio file that you want to play if exists
issaiass 0:41f21e0cf86f 194 * Arguments : SOMO14DAudioFileNo audio file to play
issaiass 0:41f21e0cf86f 195 * Return : None
issaiass 0:41f21e0cf86f 196 * Notes : 0 = Min, 511 = Max. Total = 512 files.
issaiass 0:41f21e0cf86f 197 *******************************************************************************
issaiass 0:41f21e0cf86f 198 */
issaiass 0:41f21e0cf86f 199
issaiass 0:41f21e0cf86f 200 void SOMO14DSetAudio(INT16U SOMO14DAudioFileNo) {
issaiass 0:41f21e0cf86f 201 if (SOMO14DAudioFileNo > SOMO_SONG_CMD_MAX) {/* If file is over max */
issaiass 0:41f21e0cf86f 202 SOMO14DAudioFileNo = SOMO_SONG_CMD_MAX; /* Trunk to max */
issaiass 0:41f21e0cf86f 203 }
issaiass 0:41f21e0cf86f 204 SOMO14DSerialOut(SOMO14DAudioFileNo); /* Fetch the file and play */
issaiass 0:41f21e0cf86f 205 }