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:06:07 2015 +0000
Revision:
1:803045697299
Parent:
0:41f21e0cf86f
Child:
2:673ecbaff67b
Modified some comments

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