Library to handle the X-NUCLEO-CCA02M1 MEMS Microphones Expansion Board.

Dependencies:   ST_I2S ST_FREQUENCY_DIVIDER USBDEVICE

Dependents:   HelloWorld_CCA02M1 HelloWorld_CCA02M1_mbedOS HelloWorld_CCA02M1 Karaoke_CCA01M1_CCA02M1_mbedOS

Fork of X_NUCLEO_CCA02M1 by ST Expansion SW Team

MEMS Microphones Library

Library to handle the X-NUCLEO-CCA02M1 MEMS Microphones Expansion Board. A single board allows to record a standard 2-channel stereo signal as an array of PCM samples (16 bit/sample); in principle, it could make use of six additional MEMS microphones to realize a 8-channel audio system.


Microphones configuration

Currently the configurations supported are the following:

  • Stereo@48KHz
  • Stereo@44.1KHz (CD audio quality)
  • Stereo@32KHz
  • Stereo@16KHz
  • Stereo@8KHz
  • Mono@48KHz
  • Mono@44.1KHz
  • Mono@32KHz
  • Mono@16KHz
  • Mono@8KHz

Mono configurations need a Jumper connecting PB_5 and PB_13 on the Morpho connector to properly work.


Platform compatibility

  • This board can be currently used with the Nucleo F4 Family only, please see the ST_I2S library compatibility for further information.
  • The library is compatible both with mbed OS 5.x and mbed classic 2.x (to work with mbed classic, the main application has to import the "events" library, which is not included into the "mbed" library).


I2S Peripheral Usage

By default this board makes use of the I2S peripheral available on Nucleo boards.


Acquiring through the USB

In order to acquire the recorded PCM audio channel with an audio SW on a PC, please connect the expansion board to a USB port of the PC, and the Nucleo board to a USB power supply.

Committer:
Davidroid
Date:
Fri May 05 11:34:10 2017 +0000
Revision:
20:9952bef19da1
Parent:
18:bc6113bdde85
Simplifying code.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
davide.aliprandi@st.com 2:9f389fd8fb2e 1 /**
davide.aliprandi@st.com 2:9f389fd8fb2e 2 ******************************************************************************
davide.aliprandi@st.com 2:9f389fd8fb2e 3 * @file XNucleoCCA02M1.h
davide.aliprandi@st.com 2:9f389fd8fb2e 4 * @author AST / Software Platforms and Cloud
davide.aliprandi@st.com 2:9f389fd8fb2e 5 * @version V1.0
davide.aliprandi@st.com 2:9f389fd8fb2e 6 * @date October 17th, 2016
davide.aliprandi@st.com 2:9f389fd8fb2e 7 * @brief Class header file for the X_NUCLEO_CCA02M1 expansion board.
davide.aliprandi@st.com 2:9f389fd8fb2e 8 ******************************************************************************
davide.aliprandi@st.com 2:9f389fd8fb2e 9 * @attention
davide.aliprandi@st.com 2:9f389fd8fb2e 10 *
davide.aliprandi@st.com 2:9f389fd8fb2e 11 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
davide.aliprandi@st.com 2:9f389fd8fb2e 12 *
davide.aliprandi@st.com 2:9f389fd8fb2e 13 * Redistribution and use in source and binary forms, with or without modification,
davide.aliprandi@st.com 2:9f389fd8fb2e 14 * are permitted provided that the following conditions are met:
davide.aliprandi@st.com 2:9f389fd8fb2e 15 * 1. Redistributions of source code must retain the above copyright notice,
davide.aliprandi@st.com 2:9f389fd8fb2e 16 * this list of conditions and the following disclaimer.
davide.aliprandi@st.com 2:9f389fd8fb2e 17 * 2. Redistributions in binary form must reproduce the above copyright notice,
davide.aliprandi@st.com 2:9f389fd8fb2e 18 * this list of conditions and the following disclaimer in the documentation
davide.aliprandi@st.com 2:9f389fd8fb2e 19 * and/or other materials provided with the distribution.
davide.aliprandi@st.com 2:9f389fd8fb2e 20 * 3. Neither the name of STMicroelectronics nor the names of its contributors
davide.aliprandi@st.com 2:9f389fd8fb2e 21 * may be used to endorse or promote products derived from this software
davide.aliprandi@st.com 2:9f389fd8fb2e 22 * without specific prior written permission.
davide.aliprandi@st.com 2:9f389fd8fb2e 23 *
davide.aliprandi@st.com 2:9f389fd8fb2e 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
davide.aliprandi@st.com 2:9f389fd8fb2e 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
davide.aliprandi@st.com 2:9f389fd8fb2e 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
davide.aliprandi@st.com 2:9f389fd8fb2e 27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
davide.aliprandi@st.com 2:9f389fd8fb2e 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
davide.aliprandi@st.com 2:9f389fd8fb2e 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
davide.aliprandi@st.com 2:9f389fd8fb2e 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
davide.aliprandi@st.com 2:9f389fd8fb2e 31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
davide.aliprandi@st.com 2:9f389fd8fb2e 32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
davide.aliprandi@st.com 2:9f389fd8fb2e 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
davide.aliprandi@st.com 2:9f389fd8fb2e 34 *
davide.aliprandi@st.com 2:9f389fd8fb2e 35 ******************************************************************************
davide.aliprandi@st.com 2:9f389fd8fb2e 36 */
davide.aliprandi@st.com 2:9f389fd8fb2e 37
davide.aliprandi@st.com 2:9f389fd8fb2e 38
davide.aliprandi@st.com 2:9f389fd8fb2e 39 /* Generated with STM32CubeTOO -----------------------------------------------*/
davide.aliprandi@st.com 2:9f389fd8fb2e 40
davide.aliprandi@st.com 2:9f389fd8fb2e 41
davide.aliprandi@st.com 2:9f389fd8fb2e 42 /* Define to prevent recursive inclusion -------------------------------------*/
davide.aliprandi@st.com 2:9f389fd8fb2e 43
davide.aliprandi@st.com 2:9f389fd8fb2e 44 #ifndef __X_NUCLEO_CCA02M1_CLASS_H
davide.aliprandi@st.com 2:9f389fd8fb2e 45 #define __X_NUCLEO_CCA02M1_CLASS_H
davide.aliprandi@st.com 2:9f389fd8fb2e 46
davide.aliprandi@st.com 2:9f389fd8fb2e 47
Davidroid 17:a758b376b018 48 /* Configuration -------------------------------------------------------------*/
Davidroid 17:a758b376b018 49
Davidroid 17:a758b376b018 50 /**
Davidroid 17:a758b376b018 51 * Enable to debug the duration of functions related to the I2S and USB usage
Davidroid 18:bc6113bdde85 52 * through an oscilloscope.
Davidroid 18:bc6113bdde85 53 */
Davidroid 17:a758b376b018 54 //#define X_NUCLEO_CCA02M1_DEBUG
Davidroid 17:a758b376b018 55
Davidroid 17:a758b376b018 56
davide.aliprandi@st.com 2:9f389fd8fb2e 57 /* Includes ------------------------------------------------------------------*/
davide.aliprandi@st.com 2:9f389fd8fb2e 58
davide.aliprandi@st.com 2:9f389fd8fb2e 59 /* ACTION 1 ------------------------------------------------------------------*
davide.aliprandi@st.com 2:9f389fd8fb2e 60 * Include here platform specific header files. *
davide.aliprandi@st.com 2:9f389fd8fb2e 61 *----------------------------------------------------------------------------*/
davide.aliprandi@st.com 2:9f389fd8fb2e 62 #include "mbed.h"
davide.aliprandi@st.com 2:9f389fd8fb2e 63 #include "I2S.h"
davide.aliprandi@st.com 2:9f389fd8fb2e 64 #include "FrequencyDivider.h"
davide.aliprandi@st.com 2:9f389fd8fb2e 65 #include "USBAudio.h"
davide.aliprandi@st.com 2:9f389fd8fb2e 66 /* ACTION 2 ------------------------------------------------------------------*
davide.aliprandi@st.com 2:9f389fd8fb2e 67 * Include here expansion board configuration's header files. *
davide.aliprandi@st.com 2:9f389fd8fb2e 68 *----------------------------------------------------------------------------*/
davide.aliprandi@st.com 2:9f389fd8fb2e 69 /* ACTION 3 ------------------------------------------------------------------*
davide.aliprandi@st.com 2:9f389fd8fb2e 70 * Include here expansion board's components' header files. *
davide.aliprandi@st.com 2:9f389fd8fb2e 71 * *
davide.aliprandi@st.com 2:9f389fd8fb2e 72 * Example: *
davide.aliprandi@st.com 2:9f389fd8fb2e 73 * #include "COMPONENT_1.h" *
davide.aliprandi@st.com 2:9f389fd8fb2e 74 * #include "COMPONENT_2.h" *
davide.aliprandi@st.com 2:9f389fd8fb2e 75 *----------------------------------------------------------------------------*/
davide.aliprandi@st.com 2:9f389fd8fb2e 76 #include "component_def.h"
davide.aliprandi@st.com 2:9f389fd8fb2e 77 #include "PDM2PCMAudio.h"
davide.aliprandi@st.com 2:9f389fd8fb2e 78
davide.aliprandi@st.com 2:9f389fd8fb2e 79
davide.aliprandi@st.com 2:9f389fd8fb2e 80 /* Definitions ---------------------------------------------------------------*/
davide.aliprandi@st.com 2:9f389fd8fb2e 81
davide.aliprandi@st.com 2:9f389fd8fb2e 82 /* Maximum number of mounted "X-NUCLEO-CCA02M1" Expansion Boards. */
davide.aliprandi@st.com 2:9f389fd8fb2e 83 #define EXPBRD_MOUNTED_NR_MAX 1
davide.aliprandi@st.com 2:9f389fd8fb2e 84
davide.aliprandi@st.com 2:9f389fd8fb2e 85 /* Bytes per sample. */
davide.aliprandi@st.com 2:9f389fd8fb2e 86 #define BYTES_PER_SAMPLE 2
davide.aliprandi@st.com 2:9f389fd8fb2e 87
davide.aliprandi@st.com 2:9f389fd8fb2e 88 /* Default paramters. */
davide.aliprandi@st.com 2:9f389fd8fb2e 89 #define DEFAULT_FREQUENCY 32000
davide.aliprandi@st.com 2:9f389fd8fb2e 90 #define DEFAULT_CHANNELS 2
davide.aliprandi@st.com 2:9f389fd8fb2e 91
davide.aliprandi@st.com 2:9f389fd8fb2e 92 /* PCM buffer size and thresholds in ms. */
davide.aliprandi@st.com 2:9f389fd8fb2e 93 #define PCM_BUFFER_TH_LOW_ms 1
davide.aliprandi@st.com 2:9f389fd8fb2e 94 #define PCM_BUFFER_TH_MED_ms 4
davide.aliprandi@st.com 2:9f389fd8fb2e 95 #define PCM_BUFFER_TH_HIG_ms 7
davide.aliprandi@st.com 2:9f389fd8fb2e 96 #define PCM_BUFFER_SIZE_ms 9
davide.aliprandi@st.com 2:9f389fd8fb2e 97
davide.aliprandi@st.com 2:9f389fd8fb2e 98
davide.aliprandi@st.com 2:9f389fd8fb2e 99 /* Types ---------------------------------------------------------------------*/
davide.aliprandi@st.com 2:9f389fd8fb2e 100
davide.aliprandi@st.com 2:9f389fd8fb2e 101 /* Audio processor initialization structure. */
davide.aliprandi@st.com 2:9f389fd8fb2e 102 typedef struct
davide.aliprandi@st.com 2:9f389fd8fb2e 103 {
davide.aliprandi@st.com 2:9f389fd8fb2e 104 uint32_t frequency;
davide.aliprandi@st.com 2:9f389fd8fb2e 105 uint8_t channels;
davide.aliprandi@st.com 2:9f389fd8fb2e 106 } XNucleoCCA02M1_init_t;
davide.aliprandi@st.com 2:9f389fd8fb2e 107
davide.aliprandi@st.com 2:9f389fd8fb2e 108
davide.aliprandi@st.com 2:9f389fd8fb2e 109 /* Classes -------------------------------------------------------------------*/
davide.aliprandi@st.com 2:9f389fd8fb2e 110
davide.aliprandi@st.com 2:9f389fd8fb2e 111 /** Class representing a X_NUCLEO_CCA02M1 board.
davide.aliprandi@st.com 2:9f389fd8fb2e 112 */
davide.aliprandi@st.com 2:9f389fd8fb2e 113 class XNucleoCCA02M1
davide.aliprandi@st.com 2:9f389fd8fb2e 114 {
davide.aliprandi@st.com 2:9f389fd8fb2e 115 public:
davide.aliprandi@st.com 2:9f389fd8fb2e 116
davide.aliprandi@st.com 2:9f389fd8fb2e 117 /*** Constructor, Destructor, and Initialization Methods ***/
davide.aliprandi@st.com 2:9f389fd8fb2e 118
davide.aliprandi@st.com 2:9f389fd8fb2e 119 /**
davide.aliprandi@st.com 2:9f389fd8fb2e 120 * @brief Constructor.
davide.aliprandi@st.com 2:9f389fd8fb2e 121 * @param dpin pin name of the data input/output pin of the I2S device.
davide.aliprandi@st.com 2:9f389fd8fb2e 122 * @param clk pin name of the clock pin of the I2S device.
davide.aliprandi@st.com 2:9f389fd8fb2e 123 * @param wsel pin name of the word select output pin of the I2S device (might be NC for PDM sources).
davide.aliprandi@st.com 2:9f389fd8fb2e 124 * @param fdpin pin name of the data input pin of the I2S device (for full-duplex operations, default = NC).
davide.aliprandi@st.com 2:9f389fd8fb2e 125 * @param mck pin name of the master clock output pin of the I2S device (additional pin when needed for some external audio devices, default = NC)
davide.aliprandi@st.com 2:9f389fd8fb2e 126 */
davide.aliprandi@st.com 2:9f389fd8fb2e 127 XNucleoCCA02M1(PinName dpin, PinName clk, PinName wsel = NC, PinName fdpin = NC, PinName mck = NC) :
davide.aliprandi@st.com 2:9f389fd8fb2e 128 dev_i2s(dpin, clk, wsel, fdpin, mck),
davide.aliprandi@st.com 2:9f389fd8fb2e 129 _usb_enabled(false),
davide.aliprandi@st.com 2:9f389fd8fb2e 130 _volume(PDM2PCM_NOGAIN_VOLUME),
davide.aliprandi@st.com 2:9f389fd8fb2e 131 _frequency(DEFAULT_FREQUENCY),
davide.aliprandi@st.com 2:9f389fd8fb2e 132 _channels(DEFAULT_CHANNELS),
davide.aliprandi@st.com 2:9f389fd8fb2e 133 _callback_attached(false)
davide.aliprandi@st.com 2:9f389fd8fb2e 134 #ifdef X_NUCLEO_CCA02M1_DEBUG
davide.aliprandi@st.com 2:9f389fd8fb2e 135 , _i2s_signal(D13),
davide.aliprandi@st.com 2:9f389fd8fb2e 136 _usb_signal(D12),
davide.aliprandi@st.com 2:9f389fd8fb2e 137 _buffer_overrun(D11),
davide.aliprandi@st.com 2:9f389fd8fb2e 138 _buffer_underrun(D10)
davide.aliprandi@st.com 2:9f389fd8fb2e 139 #endif
davide.aliprandi@st.com 2:9f389fd8fb2e 140 {
davide.aliprandi@st.com 2:9f389fd8fb2e 141 /* Checking stackability. */
davide.aliprandi@st.com 2:9f389fd8fb2e 142 if (!(_number_of_boards < EXPBRD_MOUNTED_NR_MAX))
davide.aliprandi@st.com 2:9f389fd8fb2e 143 error("Instantiation of the X_NUCLEO_CCA02M1 expansion board failed: it can be stacked up to %d times.\r\n", EXPBRD_MOUNTED_NR_MAX);
davide.aliprandi@st.com 2:9f389fd8fb2e 144 _XNucleoCCA02M1_Id = _number_of_boards++;
davide.aliprandi@st.com 2:9f389fd8fb2e 145 }
davide.aliprandi@st.com 2:9f389fd8fb2e 146
davide.aliprandi@st.com 2:9f389fd8fb2e 147 /**
davide.aliprandi@st.com 2:9f389fd8fb2e 148 * @brief Destructor.
davide.aliprandi@st.com 2:9f389fd8fb2e 149 */
davide.aliprandi@st.com 2:9f389fd8fb2e 150 virtual ~XNucleoCCA02M1(void) {}
davide.aliprandi@st.com 2:9f389fd8fb2e 151
davide.aliprandi@st.com 2:9f389fd8fb2e 152
davide.aliprandi@st.com 2:9f389fd8fb2e 153 /*** Public Component Related Methods ***/
davide.aliprandi@st.com 2:9f389fd8fb2e 154
davide.aliprandi@st.com 2:9f389fd8fb2e 155 /**
davide.aliprandi@st.com 2:9f389fd8fb2e 156 * @brief Initializing the X_NUCLEO_CCA02M1 board.
davide.aliprandi@st.com 2:9f389fd8fb2e 157 * @param init Pointer to device specific initalization structure.
davide.aliprandi@st.com 2:9f389fd8fb2e 158 * @retval "0" in case of success, an error code otherwise.
davide.aliprandi@st.com 2:9f389fd8fb2e 159 */
davide.aliprandi@st.com 2:9f389fd8fb2e 160 virtual status_t init(void *init = NULL);
davide.aliprandi@st.com 2:9f389fd8fb2e 161
davide.aliprandi@st.com 2:9f389fd8fb2e 162 /**
davide.aliprandi@st.com 2:9f389fd8fb2e 163 * @brief Enabling transmission via USB.
davide.aliprandi@st.com 2:9f389fd8fb2e 164 * @param None.
davide.aliprandi@st.com 2:9f389fd8fb2e 165 * @retval "0" in case of success, an error code otherwise.
davide.aliprandi@st.com 2:9f389fd8fb2e 166 */
davide.aliprandi@st.com 2:9f389fd8fb2e 167 virtual status_t enable_usb(void);
davide.aliprandi@st.com 2:9f389fd8fb2e 168
davide.aliprandi@st.com 2:9f389fd8fb2e 169 /**
davide.aliprandi@st.com 2:9f389fd8fb2e 170 * @brief Disabling transmission via USB.
davide.aliprandi@st.com 2:9f389fd8fb2e 171 * @param None.
davide.aliprandi@st.com 2:9f389fd8fb2e 172 * @retval "0" in case of success, an error code otherwise.
davide.aliprandi@st.com 2:9f389fd8fb2e 173 */
davide.aliprandi@st.com 2:9f389fd8fb2e 174 virtual status_t disable_usb(void);
davide.aliprandi@st.com 2:9f389fd8fb2e 175
davide.aliprandi@st.com 2:9f389fd8fb2e 176 /**
davide.aliprandi@st.com 2:9f389fd8fb2e 177 * @brief Start recording audio.
davide.aliprandi@st.com 2:9f389fd8fb2e 178 * @param None.
davide.aliprandi@st.com 2:9f389fd8fb2e 179 * @retval "0" in case of success, an error code otherwise.
davide.aliprandi@st.com 2:9f389fd8fb2e 180 */
davide.aliprandi@st.com 2:9f389fd8fb2e 181 virtual status_t record(void);
davide.aliprandi@st.com 2:9f389fd8fb2e 182
davide.aliprandi@st.com 2:9f389fd8fb2e 183 /**
davide.aliprandi@st.com 2:9f389fd8fb2e 184 * @brief Attach a user-defined callback that will be executed whenever PCM
davide.aliprandi@st.com 2:9f389fd8fb2e 185 * data are ready, i.e. once each millisecond.
davide.aliprandi@st.com 2:9f389fd8fb2e 186 * The provided PCM buffer will be filled by the microphones.
davide.aliprandi@st.com 2:9f389fd8fb2e 187 * @param fptr Callback to attach.
davide.aliprandi@st.com 2:9f389fd8fb2e 188 * @retval None.
davide.aliprandi@st.com 2:9f389fd8fb2e 189 */
davide.aliprandi@st.com 2:9f389fd8fb2e 190 void attach(void (*fptr) (int16_t *PCM_buffer, uint16_t PCM_buffer_bytes));
davide.aliprandi@st.com 2:9f389fd8fb2e 191
davide.aliprandi@st.com 2:9f389fd8fb2e 192 /**
davide.aliprandi@st.com 2:9f389fd8fb2e 193 * @brief Attach a user-defined non-static callback that will be executed
davide.aliprandi@st.com 2:9f389fd8fb2e 194 * whenever PCM data are ready, i.e. once each millisecond.
davide.aliprandi@st.com 2:9f389fd8fb2e 195 * The provided PCM buffer will be filled by the microphones.
davide.aliprandi@st.com 2:9f389fd8fb2e 196 * @param tptr Pointer to an object.
davide.aliprandi@st.com 2:9f389fd8fb2e 197 * @param mptr Pointer to an object's callback.
davide.aliprandi@st.com 2:9f389fd8fb2e 198 * @retval None.
davide.aliprandi@st.com 2:9f389fd8fb2e 199 */
davide.aliprandi@st.com 2:9f389fd8fb2e 200 template<typename T>
davide.aliprandi@st.com 2:9f389fd8fb2e 201 void attach(T *tptr, void (T::*mptr) (int16_t *PCM_buffer, uint16_t PCM_buffer_bytes));
davide.aliprandi@st.com 2:9f389fd8fb2e 202
davide.aliprandi@st.com 2:9f389fd8fb2e 203
davide.aliprandi@st.com 2:9f389fd8fb2e 204 /*** Other Public Expansion Board Related Methods ***/
davide.aliprandi@st.com 2:9f389fd8fb2e 205
davide.aliprandi@st.com 2:9f389fd8fb2e 206 /*** Public Expansion Board Related Attributes ***/
davide.aliprandi@st.com 2:9f389fd8fb2e 207
davide.aliprandi@st.com 2:9f389fd8fb2e 208 /* ACTION 4 --------------------------------------------------------------*
davide.aliprandi@st.com 2:9f389fd8fb2e 209 * Declare here a public attribute for each expansion board's component. *
davide.aliprandi@st.com 2:9f389fd8fb2e 210 * You will have to call these attributes' public methods within your *
davide.aliprandi@st.com 2:9f389fd8fb2e 211 * main program. *
davide.aliprandi@st.com 2:9f389fd8fb2e 212 * *
davide.aliprandi@st.com 2:9f389fd8fb2e 213 * Example: *
davide.aliprandi@st.com 2:9f389fd8fb2e 214 * COMPONENT_1 *component_1; *
davide.aliprandi@st.com 2:9f389fd8fb2e 215 * COMPONENT_2 *component_2; *
davide.aliprandi@st.com 2:9f389fd8fb2e 216 *------------------------------------------------------------------------*/
davide.aliprandi@st.com 2:9f389fd8fb2e 217
davide.aliprandi@st.com 2:9f389fd8fb2e 218
davide.aliprandi@st.com 2:9f389fd8fb2e 219 protected:
davide.aliprandi@st.com 2:9f389fd8fb2e 220
davide.aliprandi@st.com 2:9f389fd8fb2e 221 /*** Protected Expansion Board Related Related Methods ***/
davide.aliprandi@st.com 2:9f389fd8fb2e 222
davide.aliprandi@st.com 2:9f389fd8fb2e 223 /* ACTION 5 --------------------------------------------------------------*
davide.aliprandi@st.com 2:9f389fd8fb2e 224 * Declare here a protected initialization method for each expansion *
davide.aliprandi@st.com 2:9f389fd8fb2e 225 * board's component. *
davide.aliprandi@st.com 2:9f389fd8fb2e 226 * *
davide.aliprandi@st.com 2:9f389fd8fb2e 227 * Example: *
davide.aliprandi@st.com 2:9f389fd8fb2e 228 * bool init_COMPONENT_1(void); *
davide.aliprandi@st.com 2:9f389fd8fb2e 229 * bool init_COMPONENT_2(void); *
davide.aliprandi@st.com 2:9f389fd8fb2e 230 *------------------------------------------------------------------------*/
davide.aliprandi@st.com 2:9f389fd8fb2e 231 /**
davide.aliprandi@st.com 2:9f389fd8fb2e 232 * @brief I2S callback which is executed whenever PCM data are ready, i.e. once
davide.aliprandi@st.com 2:9f389fd8fb2e 233 * each millisecond.
davide.aliprandi@st.com 2:9f389fd8fb2e 234 * @param narg Narg flag.
davide.aliprandi@st.com 2:9f389fd8fb2e 235 * @retval None.
davide.aliprandi@st.com 2:9f389fd8fb2e 236 */
davide.aliprandi@st.com 2:9f389fd8fb2e 237 void i2s_callback(int narg);
davide.aliprandi@st.com 2:9f389fd8fb2e 238
davide.aliprandi@st.com 2:9f389fd8fb2e 239 /**
davide.aliprandi@st.com 2:9f389fd8fb2e 240 * @brief Sending PCM data via USB.
davide.aliprandi@st.com 2:9f389fd8fb2e 241 * @param None.
davide.aliprandi@st.com 2:9f389fd8fb2e 242 * @retval None.
davide.aliprandi@st.com 2:9f389fd8fb2e 243 */
davide.aliprandi@st.com 2:9f389fd8fb2e 244 void usb_handler(void);
davide.aliprandi@st.com 2:9f389fd8fb2e 245
davide.aliprandi@st.com 2:9f389fd8fb2e 246
davide.aliprandi@st.com 2:9f389fd8fb2e 247 /*** Expansion Board's Instance Variables ***/
davide.aliprandi@st.com 2:9f389fd8fb2e 248
davide.aliprandi@st.com 2:9f389fd8fb2e 249 /* ACTION 6 --------------------------------------------------------------*
davide.aliprandi@st.com 2:9f389fd8fb2e 250 * Declare here the component's static and non-static data, one variable *
davide.aliprandi@st.com 2:9f389fd8fb2e 251 * per line. *
davide.aliprandi@st.com 2:9f389fd8fb2e 252 * *
davide.aliprandi@st.com 2:9f389fd8fb2e 253 * Example: *
davide.aliprandi@st.com 2:9f389fd8fb2e 254 * int instance_id; *
davide.aliprandi@st.com 2:9f389fd8fb2e 255 * static int number_of_instances; *
davide.aliprandi@st.com 2:9f389fd8fb2e 256 *------------------------------------------------------------------------*/
davide.aliprandi@st.com 2:9f389fd8fb2e 257 public:
davide.aliprandi@st.com 2:9f389fd8fb2e 258
davide.aliprandi@st.com 2:9f389fd8fb2e 259 /* I2S Audio Device (exclusive). */
davide.aliprandi@st.com 2:9f389fd8fb2e 260 I2S dev_i2s;
davide.aliprandi@st.com 2:9f389fd8fb2e 261
davide.aliprandi@st.com 2:9f389fd8fb2e 262
davide.aliprandi@st.com 2:9f389fd8fb2e 263 protected:
davide.aliprandi@st.com 2:9f389fd8fb2e 264
davide.aliprandi@st.com 2:9f389fd8fb2e 265 /* USB Audio Device. */
davide.aliprandi@st.com 2:9f389fd8fb2e 266 USBAudio *_usb_audio;
davide.aliprandi@st.com 2:9f389fd8fb2e 267 bool _usb_enabled;
davide.aliprandi@st.com 2:9f389fd8fb2e 268
davide.aliprandi@st.com 2:9f389fd8fb2e 269 /* PDM to PCM conversion library. */
davide.aliprandi@st.com 2:9f389fd8fb2e 270 PDM2PCMAudio *_pdm2pcm;
davide.aliprandi@st.com 2:9f389fd8fb2e 271
davide.aliprandi@st.com 2:9f389fd8fb2e 272 /* PDM to PCM conversion parameters. */
davide.aliprandi@st.com 2:9f389fd8fb2e 273 uint32_t _volume;
davide.aliprandi@st.com 2:9f389fd8fb2e 274
davide.aliprandi@st.com 2:9f389fd8fb2e 275 /* Microphone parameters. */
davide.aliprandi@st.com 2:9f389fd8fb2e 276 uint32_t _frequency;
davide.aliprandi@st.com 2:9f389fd8fb2e 277 uint32_t _channels;
davide.aliprandi@st.com 2:9f389fd8fb2e 278
davide.aliprandi@st.com 2:9f389fd8fb2e 279 /* Size of the buffers to store audio data. */
davide.aliprandi@st.com 2:9f389fd8fb2e 280 uint32_t _PDM_samples_one_ms;
davide.aliprandi@st.com 2:9f389fd8fb2e 281 uint32_t _PDM_samples_two_ms;
davide.aliprandi@st.com 2:9f389fd8fb2e 282 uint32_t _PCM_samples_one_ms;
davide.aliprandi@st.com 2:9f389fd8fb2e 283
davide.aliprandi@st.com 2:9f389fd8fb2e 284 /* Input and output audio buffers. */
davide.aliprandi@st.com 2:9f389fd8fb2e 285 uint16_t *_PDM_buffer_two_ms; /* Input double-buffered PDM audio data, from microphones. */
davide.aliprandi@st.com 2:9f389fd8fb2e 286 int16_t *_PCM_buffer_n_ms; /* Output n-ms-buffered PCM audio data, to USB. */
davide.aliprandi@st.com 2:9f389fd8fb2e 287
davide.aliprandi@st.com 2:9f389fd8fb2e 288 /* Support audio buffers for processing data. */
davide.aliprandi@st.com 2:9f389fd8fb2e 289 uint16_t *_PDM_buffer_one_ms;
davide.aliprandi@st.com 2:9f389fd8fb2e 290 int16_t *_USB_PCM_buffer_one_ms;
davide.aliprandi@st.com 2:9f389fd8fb2e 291 int16_t *_USER_PCM_buffer_one_ms;
davide.aliprandi@st.com 2:9f389fd8fb2e 292
davide.aliprandi@st.com 2:9f389fd8fb2e 293 /* Indexes of the output PCM buffer. */
davide.aliprandi@st.com 2:9f389fd8fb2e 294 static uint32_t _PCM_buffer_read_index;
davide.aliprandi@st.com 2:9f389fd8fb2e 295 static uint32_t _PCM_buffer_write_index;
davide.aliprandi@st.com 2:9f389fd8fb2e 296
davide.aliprandi@st.com 2:9f389fd8fb2e 297 /* User-defined PCM-data-ready callback. */
davide.aliprandi@st.com 2:9f389fd8fb2e 298 Callback<void(int16_t *PCM_buffer, uint16_t PCM_buffer_bytes)> _callback;
davide.aliprandi@st.com 2:9f389fd8fb2e 299 bool _callback_attached;
davide.aliprandi@st.com 2:9f389fd8fb2e 300
davide.aliprandi@st.com 2:9f389fd8fb2e 301 /* Accessing shared areas: the PCM buffer. */
davide.aliprandi@st.com 2:9f389fd8fb2e 302 static SingletonPtr<PlatformMutex> _mutex;
davide.aliprandi@st.com 2:9f389fd8fb2e 303
davide.aliprandi@st.com 2:9f389fd8fb2e 304 /* Expansion board identifier. */
davide.aliprandi@st.com 2:9f389fd8fb2e 305 uint8_t _XNucleoCCA02M1_Id;
davide.aliprandi@st.com 2:9f389fd8fb2e 306
davide.aliprandi@st.com 2:9f389fd8fb2e 307 /* Number of expansion boards. */
davide.aliprandi@st.com 2:9f389fd8fb2e 308 static uint8_t _number_of_boards;
davide.aliprandi@st.com 2:9f389fd8fb2e 309
davide.aliprandi@st.com 2:9f389fd8fb2e 310 #ifdef X_NUCLEO_CCA02M1_DEBUG
davide.aliprandi@st.com 2:9f389fd8fb2e 311 /* Signals for debugging purposes. */
davide.aliprandi@st.com 2:9f389fd8fb2e 312 DigitalOut _i2s_signal;
davide.aliprandi@st.com 2:9f389fd8fb2e 313 DigitalOut _usb_signal;
davide.aliprandi@st.com 2:9f389fd8fb2e 314 DigitalOut _buffer_overrun;
davide.aliprandi@st.com 2:9f389fd8fb2e 315 DigitalOut _buffer_underrun;
davide.aliprandi@st.com 2:9f389fd8fb2e 316 #endif
davide.aliprandi@st.com 2:9f389fd8fb2e 317 };
davide.aliprandi@st.com 2:9f389fd8fb2e 318
davide.aliprandi@st.com 2:9f389fd8fb2e 319 #endif /* __X_NUCLEO_CCA02M1_CLASS_H */
davide.aliprandi@st.com 2:9f389fd8fb2e 320
davide.aliprandi@st.com 2:9f389fd8fb2e 321 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/