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:
davide.aliprandi@st.com
Date:
Tue Feb 28 11:20:53 2017 +0100
Revision:
0:d5552d432108
Library to handle the X-NUCLEO-CCA02M1 MEMS Microphones Expansion Board.

Who changed what in which revision?

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