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
SOMO14D.cpp@2:673ecbaff67b, 2015-03-14 (annotated)
- 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?
User | Revision | Line number | New 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 | } |