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:
Fri Mar 13 01:12:55 2015 +0000
Revision:
0:41f21e0cf86f
Child:
1:803045697299
SOund MOdule from 4D Systems Library

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