<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>I2S mic to USB audio (nRF5 SDK v17.0.2)</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/98843/i2s-mic-to-usb-audio-nrf5-sdk-v17-0-2</link><description>Hello, 
 nRF5 SDK v17.0.2, Keil5 
 USB audio demo and I2S demo, 
 i2s cannect two mic(L and R), 16bit 48K STEREO, 
 how to put i2s data to usb audio? 
 i add function to USB audio demo as follow: 
 
 don&amp;#39;t know if it sucess, so some audio data lost. </description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Wed, 03 May 2023 09:12:42 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/98843/i2s-mic-to-usb-audio-nrf5-sdk-v17-0-2" /><item><title>RE: I2S mic to USB audio (nRF5 SDK v17.0.2)</title><link>https://devzone.nordicsemi.com/thread/423474?ContentTypeID=1</link><pubDate>Wed, 03 May 2023 09:12:42 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:c1ffe34f-cbf8-497b-96f4-9f7bff0ab46b</guid><dc:creator>yoyou</dc:creator><description>&lt;p&gt;&lt;span&gt;Hi&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;app_usbd_audio_class_tx_start()&amp;nbsp; return code&amp;nbsp; same time 17 or 8.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="background-color:#99cc00;font-size:150%;"&gt;now i2s put audio to usb audio&amp;nbsp;already worked,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;My solution is:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;1.usb audio one frame 192 Byte, i2s the same 192 Byte, (the same frame length).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;2.call&lt;span style="color:#0000ff;"&gt;&amp;nbsp;app_usbd_audio_class_tx_start()&amp;nbsp;&lt;/span&gt; in &lt;span style="color:#0000ff;"&gt;_sof_ev_handler(uint16_t framecnt)&lt;/span&gt;&amp;nbsp;,and&amp;nbsp;retain data until successfully sent that (NRF_SUCCESS == ret).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;last question:&amp;nbsp; is i2s not support 24bit 48Khz?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;pre class="ui-code" data-mode="text"&gt;  config.format    = NRF_I2S_FORMAT_I2S;
  config.alignment = NRF_I2S_ALIGN_LEFT;
  config.mode = NRF_I2S_MODE_MASTER;
    config.ratio     = NRF_I2S_RATIO_32X;
	config.mck_setup = NRF_I2S_MCK_32MDIV21;
	config.channels = NRF_I2S_CHANNELS_STEREO;
	config.sample_width = NRF_I2S_SWIDTH_24BIT; 
&lt;/pre&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;thanks&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Best regards&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2S mic to USB audio (nRF5 SDK v17.0.2)</title><link>https://devzone.nordicsemi.com/thread/423151?ContentTypeID=1</link><pubDate>Tue, 02 May 2023 00:36:22 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:4fef7be5-6880-45f2-9a32-7f441498be51</guid><dc:creator>yoyou</dc:creator><description>&lt;p&gt;&lt;img style="max-height:331px;max-width:540px;" alt=" " src="https://devzone.nordicsemi.com/resized-image/__size/1080x662/__key/communityserver-discussions-components-files/4/pastedimage1682986172193v2.png" /&gt;&lt;/p&gt;
&lt;p&gt;call&amp;nbsp;&lt;span&gt;app_usbd_audio_class_tx_start() got return code 17 when failed,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;total count: successed 12402, got&amp;nbsp;APP_USBD_AUDIO_USER_EVT_TX_DONE&amp;nbsp; 12401, failed 10578.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;failed means lost data, if call again in DOWN event maybe&amp;nbsp;repeat data or wrong order.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#ff0000;"&gt;is our a old project use nRF52840,&amp;nbsp;&amp;nbsp;Too many functions to migrate to Zephyr.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#ff0000;"&gt;please help slove it.&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2S mic to USB audio (nRF5 SDK v17.0.2)</title><link>https://devzone.nordicsemi.com/thread/422909?ContentTypeID=1</link><pubDate>Fri, 28 Apr 2023 08:49:11 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:7d6d0e88-7401-420f-9322-945a345a2d28</guid><dc:creator>Sigurd</dc:creator><description>&lt;p&gt;Are you getting the&amp;nbsp;APP_USBD_AUDIO_USER_EVT_TX_DONE event?&lt;/p&gt;
&lt;p&gt;Maybe you can use that event to call&amp;nbsp;app_usbd_audio_class_tx_start() again&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2S mic to USB audio (nRF5 SDK v17.0.2)</title><link>https://devzone.nordicsemi.com/thread/422393?ContentTypeID=1</link><pubDate>Wed, 26 Apr 2023 00:47:39 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:10e0eb3f-f4ab-42df-801a-2d8d84abd3ab</guid><dc:creator>yoyou</dc:creator><description>&lt;p&gt;if change to wait for success&lt;/p&gt;
&lt;p&gt;&lt;img style="max-height:156px;max-width:587px;" alt=" " src="https://devzone.nordicsemi.com/resized-image/__size/1174x312/__key/communityserver-discussions-components-files/4/pastedimage1682469966433v2.png" /&gt;&lt;/p&gt;
&lt;p&gt;will no audio on PC.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2S mic to USB audio (nRF5 SDK v17.0.2)</title><link>https://devzone.nordicsemi.com/thread/422391?ContentTypeID=1</link><pubDate>Wed, 26 Apr 2023 00:39:52 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:6c2d54ba-81bf-47f1-bf32-c14500738f13</guid><dc:creator>yoyou</dc:creator><description>&lt;p&gt;Hi,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;a lot of failed that return code 17&lt;/p&gt;
&lt;p&gt;&lt;img style="max-height:155px;max-width:533px;" alt=" " src="https://devzone.nordicsemi.com/resized-image/__size/1066x310/__key/communityserver-discussions-components-files/4/pastedimage1682469373845v9.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img style="max-height:361px;max-width:530px;" alt=" " src="https://devzone.nordicsemi.com/resized-image/__size/1060x722/__key/communityserver-discussions-components-files/4/pastedimage1682469407019v10.png" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;img style="max-height:333px;max-width:546px;" alt=" " src="https://devzone.nordicsemi.com/resized-image/__size/1092x666/__key/communityserver-discussions-components-files/4/pastedimage1682469472926v11.png" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Best regards&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2S mic to USB audio (nRF5 SDK v17.0.2)</title><link>https://devzone.nordicsemi.com/thread/422323?ContentTypeID=1</link><pubDate>Tue, 25 Apr 2023 13:52:14 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:d7a08943-43ca-4151-b03f-0302d9104ef1</guid><dc:creator>Sigurd</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;Could you check the return code of&amp;nbsp;&lt;span&gt;app_usbd_audio_class_tx_start()?&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2S mic to USB audio (nRF5 SDK v17.0.2)</title><link>https://devzone.nordicsemi.com/thread/421865?ContentTypeID=1</link><pubDate>Sat, 22 Apr 2023 01:37:52 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:a9b8509b-f38f-4e07-9768-d7e5e1387146</guid><dc:creator>yoyou</dc:creator><description>&lt;p&gt;&lt;span&gt;Hi,&amp;nbsp; thanks for reply&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;three days ago, i&amp;#39;v try call it in&amp;nbsp;hp_sof_ev_handler(),&amp;nbsp; it lose more data.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img style="max-height:329px;max-width:436px;" alt=" " src="https://devzone.nordicsemi.com/resized-image/__size/872x658/__key/communityserver-discussions-components-files/4/pastedimage1682127176409v1.png" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;if possible, please check it on nrf52840-DK.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Best regards&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2S mic to USB audio (nRF5 SDK v17.0.2)</title><link>https://devzone.nordicsemi.com/thread/421755?ContentTypeID=1</link><pubDate>Fri, 21 Apr 2023 12:29:22 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:e91a65cb-3f34-4469-bd80-b105eaf03f92</guid><dc:creator>Sigurd</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
[quote user="yuyou"]i&amp;#39;v try,but it never to be called.&amp;nbsp;[/quote]
&lt;p&gt;Are&amp;nbsp;hp_sof_ev_handler being called?&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;Try moving the code to&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;hp_sof_ev_handler()&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2S mic to USB audio (nRF5 SDK v17.0.2)</title><link>https://devzone.nordicsemi.com/thread/421608?ContentTypeID=1</link><pubDate>Fri, 21 Apr 2023 00:34:20 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:ce230d01-4229-4955-b24f-8df7f3467a3d</guid><dc:creator>yoyou</dc:creator><description>&lt;p&gt;Hi,&amp;nbsp; thanks for reply&lt;/p&gt;
&lt;p&gt;i&amp;#39;v try,but it never to be called.&amp;nbsp; see code&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img style="max-height:240px;max-width:320px;" src="https://devzone.nordicsemi.com/resized-image/__size/640x480/__key/communityserver-discussions-components-files/4/pastedimage1682037179541v1.png" alt=" " /&gt;&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;#include &amp;lt;stdint.h&amp;gt;
#include &amp;lt;stdbool.h&amp;gt;
#include &amp;lt;stddef.h&amp;gt;

#include &amp;quot;nrf.h&amp;quot;
#include &amp;quot;app_util.h&amp;quot;
#include &amp;quot;nrf_drv_usbd.h&amp;quot;
#include &amp;quot;nrf_drv_clock.h&amp;quot;
#include &amp;quot;nrf_gpio.h&amp;quot;
#include &amp;quot;nrf_delay.h&amp;quot;
#include &amp;quot;nrf_drv_power.h&amp;quot;

#include &amp;quot;app_usbd.h&amp;quot;
#include &amp;quot;app_usbd_core.h&amp;quot;
#include &amp;quot;app_usbd_string_desc.h&amp;quot;
#include &amp;quot;app_usbd_audio.h&amp;quot;
#include &amp;quot;app_error.h&amp;quot;
#include &amp;quot;boards.h&amp;quot;
#include &amp;quot;i2s_audio.h&amp;quot;


#include &amp;quot;nrf_log.h&amp;quot;
#include &amp;quot;nrf_log_ctrl.h&amp;quot;
#include &amp;quot;nrf_log_default_backends.h&amp;quot;

static bool nLoop=false;
//#define LED_USB_RESUME (BSP_BOARD_LED_0)
//#define LED_USB_START  (BSP_BOARD_LED_1)
//#define LED_AUDIO_RX   (BSP_BOARD_LED_2)
//#define LED_AUDIO_TX   (BSP_BOARD_LED_3)

/**
 * @brief USB audio samples size
 */
#define BUFFER_SIZE  (48)

/**
 * @brief Enable power USB detection
 *
 * Configure if example supports USB port connection
 */
#ifndef USBD_POWER_DETECTION
#define USBD_POWER_DETECTION true
#endif

/**
 * @brief Audio class user event handler
 */
static void hp_audio_user_ev_handler(app_usbd_class_inst_t const * p_inst, app_usbd_audio_user_event_t   event);
static void mic_audio_user_ev_handler(app_usbd_class_inst_t const * p_inst, app_usbd_audio_user_event_t   event);

/* Channels and feature controls configuration */

/**
 * @brief   Input terminal channel configuration
 */
#define HP_TERMINAL_CH_CONFIG()                                                                       \
        (APP_USBD_AUDIO_IN_TERM_CH_CONFIG_LEFT_FRONT | APP_USBD_AUDIO_IN_TERM_CH_CONFIG_RIGHT_FRONT)

/**
 * @brief   Feature controls
 *
 *      general
 *      channel 0
 *      channel 1
 */
#define HP_FEATURE_CONTROLS()                                               \
        APP_USBD_U16_TO_RAW_DSC(APP_USBD_AUDIO_FEATURE_UNIT_CONTROL_MUTE),  \
        APP_USBD_U16_TO_RAW_DSC(APP_USBD_AUDIO_FEATURE_UNIT_CONTROL_MUTE),  \
        APP_USBD_U16_TO_RAW_DSC(APP_USBD_AUDIO_FEATURE_UNIT_CONTROL_MUTE)



/**
 * @brief   Input terminal channel configuration
 */
#define MIC_TERMINAL_CH_CONFIG()                                                                       \
        (APP_USBD_AUDIO_IN_TERM_CH_CONFIG_LEFT_FRONT | APP_USBD_AUDIO_IN_TERM_CH_CONFIG_RIGHT_FRONT)

/**
 * @brief   Feature controls
 *
 *      general
 *      channel 0
 *      channel 1
 */
#define MIC_FEATURE_CONTROLS()                                                                     \
        APP_USBD_U16_TO_RAW_DSC(APP_USBD_AUDIO_FEATURE_UNIT_CONTROL_MUTE),                         \
        APP_USBD_U16_TO_RAW_DSC(APP_USBD_AUDIO_FEATURE_UNIT_CONTROL_MUTE),                         \
        APP_USBD_U16_TO_RAW_DSC(APP_USBD_AUDIO_FEATURE_UNIT_CONTROL_MUTE)


/* Microphone descriptors */

/**
 * @brief   Audio class specific format descriptor
 */
APP_USBD_AUDIO_FORMAT_DESCRIPTOR(m_mic_form_desc, 
                                 APP_USBD_AUDIO_AS_FORMAT_I_DSC(    /* Format type 1 descriptor */
                                    2,                  						/* Number of channels */
                                    2,                              /* Subframe size */
                                    16,                             /* Bit resolution */
                                    1,                              /* Frequency type */
                                    APP_USBD_U24_TO_RAW_DSC(48000)) /* Frequency */
                                );

/**
 * @brief   Audio class input terminal descriptor
 */
APP_USBD_AUDIO_INPUT_DESCRIPTOR(m_mic_inp_desc, 
                                APP_USBD_AUDIO_INPUT_TERMINAL_DSC(
                                    1,                                     /* Terminal ID */
                                    APP_USBD_AUDIO_TERMINAL_IN_MICROPHONE, /* Terminal type */
                                    2,                         						 /* Number of channels */
                                    MIC_TERMINAL_CH_CONFIG())              /* Channels config */
                                );

/**
 * @brief   Audio class output terminal descriptor
 */
APP_USBD_AUDIO_OUTPUT_DESCRIPTOR(m_mic_out_desc, 
                                 APP_USBD_AUDIO_OUTPUT_TERMINAL_DSC(
                                    3,                                     /* Terminal ID */
                                    APP_USBD_AUDIO_TERMINAL_USB_STREAMING, /* Terminal type */
                                    2)                                     /* Source ID */
                                );

/**
 * @brief   Audio class feature unit descriptor
 */
APP_USBD_AUDIO_FEATURE_DESCRIPTOR(m_mic_fea_desc, 
                                  APP_USBD_AUDIO_FEATURE_UNIT_DSC(
                                    2,                      /* Unit ID */
                                    1,                      /* Source ID */
                                    MIC_FEATURE_CONTROLS()) /* List of controls */
                                 );

/* Headphones descriptors */

/**
 * @brief   Audio class specific format III descriptor
 */
APP_USBD_AUDIO_FORMAT_DESCRIPTOR(m_hp_form_desc, 
                                 APP_USBD_AUDIO_AS_FORMAT_III_DSC(    /* Format type 3 descriptor */
                                    2,                                /* Number of channels */
                                    2,                                /* Subframe size */
                                    16,                               /* Bit resolution */
                                    1,                                /* Frequency type */
                                    APP_USBD_U24_TO_RAW_DSC(48000))   /* Frequency */
                                );

/**
 * @brief   Audio class input terminal descriptor
 */
APP_USBD_AUDIO_INPUT_DESCRIPTOR(m_hp_inp_desc, 
                                APP_USBD_AUDIO_INPUT_TERMINAL_DSC(
                                    1,                                     /* Terminal ID */
                                    APP_USBD_AUDIO_TERMINAL_USB_STREAMING, /* Terminal type */
                                    2,                         						 /* Number of channels */
                                    HP_TERMINAL_CH_CONFIG())               /* Channels config */
                               );

/**
 * @brief   Audio class output terminal descriptor
 */
APP_USBD_AUDIO_OUTPUT_DESCRIPTOR(m_hp_out_desc, 
                                 APP_USBD_AUDIO_OUTPUT_TERMINAL_DSC(
                                    3,                                      /* Terminal ID */
                                    APP_USBD_AUDIO_TERMINAL_OUT_HEADPHONES, /* Terminal type */
                                    2)                                      /* Source ID */
                                );

/**
 * @brief   Audio class feature unit descriptor
 */
APP_USBD_AUDIO_FEATURE_DESCRIPTOR(m_hp_fea_desc, 
                                  APP_USBD_AUDIO_FEATURE_UNIT_DSC(
                                    2,                     /* Unit ID */
                                    1,                     /* Source ID */
                                    HP_FEATURE_CONTROLS()) /* List of controls */
                                 );

/* Interfaces lists */

/**
 * @brief Interfaces list passed to @ref APP_USBD_AUDIO_GLOBAL_DEF
 */
#define HP_INTERFACES_CONFIG() APP_USBD_AUDIO_CONFIG_OUT(0, 1)

/**
 * @brief Interfaces list passed to @ref APP_USBD_AUDIO_GLOBAL_DEF
 */
#define MIC_INTERFACES_CONFIG() APP_USBD_AUDIO_CONFIG_IN(2, 3)

/*lint -save -e26 -e64 -e123 -e505 -e651*/


/**
 * @brief Headphone Audio class instance
 */
APP_USBD_AUDIO_GLOBAL_DEF(m_app_audio_headphone,
                          HP_INTERFACES_CONFIG(),
                          hp_audio_user_ev_handler,
                          &amp;amp;m_hp_form_desc,
                          &amp;amp;m_hp_inp_desc,
                          &amp;amp;m_hp_out_desc,
                          &amp;amp;m_hp_fea_desc,
                          0,
                          APP_USBD_AUDIO_AS_IFACE_FORMAT_PCM,
                          192,
                          APP_USBD_AUDIO_SUBCLASS_AUDIOSTREAMING,
                          1
);



/**
 * @brief Microphone Audio class instance
 */
APP_USBD_AUDIO_GLOBAL_DEF(m_app_audio_microphone,
                          MIC_INTERFACES_CONFIG(),
                          mic_audio_user_ev_handler,
                          &amp;amp;m_mic_form_desc,
                          &amp;amp;m_mic_inp_desc,
                          &amp;amp;m_mic_out_desc,
                          &amp;amp;m_mic_fea_desc,
                          0,
                          APP_USBD_AUDIO_AS_IFACE_FORMAT_PCM,
                          192,
                          APP_USBD_AUDIO_SUBCLASS_AUDIOSTREAMING,
                          3
);


/*lint -restore*/

/**
 * @brief Internal audio temporary buffer
 */
static int16_t  m_temp_buffer[2 * BUFFER_SIZE];
static int err_count=0,tx_count=0,tx_done=0;

#define BUFFER_TX_SIZE  (1024)
static int16_t  m_tx_buffer[BUFFER_TX_SIZE];
static int16_t  m_tx_start_idx=0,m_tx_deal_idx=0;
static int havedata=0, dealdata=0;

/**
 * @brief The size of last received block from the microphone
 */
static size_t m_temp_buffer_size;

/**
 * @brief Actual headphones mute
 */
static uint8_t  m_mute_hp;

/**
 * @brief Actual sampling frequency
 */
static uint32_t m_freq_hp;

/**
 * @brief Actual microphone mute state
 */
static uint8_t  m_mute_mic;

/**
 * @brief Actual microphone sampling frequency
 */
static uint32_t m_freq_mic;

/**
 * @brief Audio class specific request handle (headphones)
 */
static void hp_audio_user_class_req(app_usbd_class_inst_t const * p_inst)
{
    app_usbd_audio_t const * p_audio = app_usbd_audio_class_get(p_inst);
    app_usbd_audio_req_t * p_req = app_usbd_audio_class_request_get(p_audio);

    UNUSED_VARIABLE(m_mute_hp);
    UNUSED_VARIABLE(m_freq_hp);

    switch (p_req-&amp;gt;req_target)
    {
        case APP_USBD_AUDIO_CLASS_REQ_IN:

            if (p_req-&amp;gt;req_type == APP_USBD_AUDIO_REQ_SET_CUR)
            {
                //Only mute control is defined
                p_req-&amp;gt;payload[0] = m_mute_hp;
            }

            break;
        case APP_USBD_AUDIO_CLASS_REQ_OUT:

            if (p_req-&amp;gt;req_type == APP_USBD_AUDIO_REQ_SET_CUR)
            {
                //Only mute control is defined
                m_mute_hp = p_req-&amp;gt;payload[0];
            }

            break;
        case APP_USBD_AUDIO_EP_REQ_IN:
            break;
        case APP_USBD_AUDIO_EP_REQ_OUT:

            if (p_req-&amp;gt;req_type == APP_USBD_AUDIO_REQ_SET_CUR)
            {
                //Only set frequency is supported
                m_freq_hp = uint24_decode(p_req-&amp;gt;payload);
            }

            break;
        default:
            break;
    }
}

/**
 * @brief Audio class specific request handle (microphone)
 */
static void mic_audio_user_class_req(app_usbd_class_inst_t const * p_inst)
{
    app_usbd_audio_t const * p_audio = app_usbd_audio_class_get(p_inst);
    app_usbd_audio_req_t * p_req = app_usbd_audio_class_request_get(p_audio);

    UNUSED_VARIABLE(m_mute_mic);
    UNUSED_VARIABLE(m_freq_mic);

    switch (p_req-&amp;gt;req_target)
    {
        case APP_USBD_AUDIO_CLASS_REQ_IN:

            if (p_req-&amp;gt;req_type == APP_USBD_AUDIO_REQ_SET_CUR)
            {
                //Only mute control is defined
                p_req-&amp;gt;payload[0] = m_mute_mic;
            }

            break;
        case APP_USBD_AUDIO_CLASS_REQ_OUT:

            if (p_req-&amp;gt;req_type == APP_USBD_AUDIO_REQ_SET_CUR)
            {
                //Only mute control is defined
                m_mute_mic = p_req-&amp;gt;payload[0];
            }

            break;
        case APP_USBD_AUDIO_EP_REQ_IN:
            break;
        case APP_USBD_AUDIO_EP_REQ_OUT:

            if (p_req-&amp;gt;req_type == APP_USBD_AUDIO_REQ_SET_CUR)
            {
                //Only set frequency is supported
                m_freq_mic = uint24_decode(p_req-&amp;gt;payload);
            }

            break;
        default:
            break;
    }
}

/**
 * @brief User event handler @ref app_usbd_audio_user_ev_handler_t (headphones)
 */
static void hp_audio_user_ev_handler(app_usbd_class_inst_t const * p_inst,app_usbd_audio_user_event_t   event)
{
    app_usbd_audio_t const * p_audio = app_usbd_audio_class_get(p_inst);
    UNUSED_VARIABLE(p_audio);
    switch (event)
    {
        case APP_USBD_AUDIO_USER_EVT_CLASS_REQ:
            hp_audio_user_class_req(p_inst);
            break;
				case APP_USBD_AUDIO_USER_EVT_RX_DONE:
        {
            /* Block from headphones copied into buffer, send it into microphone input */
            if(nLoop){
							ret_code_t ret = app_usbd_audio_class_tx_start(&amp;amp;m_app_audio_microphone.base, m_temp_buffer, m_temp_buffer_size);
							//if (NRF_SUCCESS == ret) bsp_board_led_invert(LED_AUDIO_RX);
						}else{
							uint16_t c = put_data(m_temp_buffer, m_temp_buffer_size);//I2S
						}
            break;
        }
        break;
    }
}
/*
	Call this in I2S check_rx_data(),16bit 48Khz STEREO, size=80
*/
uint16_t usb_put_data(const uint16_t* p_buff, uint16_t size)
{
	for(int i=0;i&amp;lt;size;i++)
	{
		m_tx_buffer[m_tx_start_idx]=p_buff[i];
		m_tx_start_idx%=BUFFER_TX_SIZE;
	}
	m_temp_buffer_size=size; havedata+=size;

	//if(tx_done)return size;
//	ret_code_t ret = app_usbd_audio_class_tx_start(&amp;amp;m_app_audio_microphone.base, p_buff, size*2);
//	if (NRF_SUCCESS == ret)
//	{
//		//bsp_board_led_invert(LED_AUDIO_RX);
//	}
	return size;
}

/**
 * @brief User event handler @ref app_usbd_audio_user_ev_handler_t (microphone)
 */
static void mic_audio_user_ev_handler(app_usbd_class_inst_t const * p_inst,app_usbd_audio_user_event_t   event)
{
    app_usbd_audio_t const * p_audio = app_usbd_audio_class_get(p_inst);
    UNUSED_VARIABLE(p_audio);

    switch (event)
    {
        case APP_USBD_AUDIO_USER_EVT_CLASS_REQ:
            mic_audio_user_class_req(p_inst);
            break;
        case APP_USBD_AUDIO_USER_EVT_TX_DONE:
        {
            if(tx_count%500==1)
							NRF_LOG_INFO(&amp;quot;mic DOWN %d  %d  (have:%d - deal:%d = %d)\n&amp;quot;,tx_count,tx_done,havedata,dealdata,havedata-dealdata);
						tx_done++; dealdata+=m_temp_buffer_size;
											
            //bsp_board_led_invert(LED_AUDIO_TX);
            break;
        }
        default:
            break;
    }
}

static void hp_sof_ev_handler(uint16_t framecnt)
{
		ret_code_t ret;
    UNUSED_VARIABLE(framecnt);
    if (APP_USBD_STATE_Configured != app_usbd_core_state_get())
    {
        return;
    }

    size_t rx_size = app_usbd_audio_class_rx_size_get(&amp;amp;m_app_audio_headphone.base);
    m_temp_buffer_size = rx_size;
    if (rx_size &amp;gt; 0)
    {
        ASSERT(rx_size &amp;lt;= sizeof(m_temp_buffer));
        ret = app_usbd_audio_class_rx_start(&amp;amp;m_app_audio_headphone.base, m_temp_buffer, rx_size);
        if (NRF_SUCCESS != ret)
        {
            NRF_LOG_ERROR(&amp;quot;Cannot start RX transfer from headphone\n&amp;quot;);
        }
    }
}

/**
 * @brief USBD library specific event handler.
 *
 * @param event     USBD library event.
 */
static void usbd_user_ev_handler(app_usbd_event_type_t event)
{
    switch (event)
    {
        case APP_USBD_EVT_DRV_SOF:
					{
							for(int i=0;i&amp;lt;m_temp_buffer_size;i++)
							{
								m_temp_buffer[i]=m_tx_buffer[m_tx_deal_idx];
								m_tx_deal_idx%=BUFFER_TX_SIZE;
							}
							app_usbd_audio_class_tx_start(&amp;amp;m_app_audio_microphone.base, m_temp_buffer, m_temp_buffer_size*2);		
					}
            //NRF_LOG_INFO(&amp;quot;APP_USBD_EVT_DRV_SOF&amp;quot;);
            break;
        case APP_USBD_EVT_DRV_SUSPEND:
            //bsp_board_leds_off();
            break;
        case APP_USBD_EVT_DRV_RESUME:
            //bsp_board_led_on(LED_USB_RESUME);
            break;
        case APP_USBD_EVT_STARTED:
            //bsp_board_led_on(LED_USB_START);
            break;
        case APP_USBD_EVT_STOPPED:
            app_usbd_disable();
            //bsp_board_leds_off();
            break;
        case APP_USBD_EVT_POWER_DETECTED:
            NRF_LOG_INFO(&amp;quot;USB power detected&amp;quot;);
						
            if (!nrf_drv_usbd_is_enabled())
            {
                app_usbd_enable();
            }
            break;
        case APP_USBD_EVT_POWER_REMOVED:
            NRF_LOG_INFO(&amp;quot;USB power removed&amp;quot;);
            app_usbd_stop();
            break;
        case APP_USBD_EVT_POWER_READY:
            NRF_LOG_INFO(&amp;quot;USB ready&amp;quot;);
            app_usbd_start();
            break;
        default:
            break;
    }
}



int main(void)
{
    ret_code_t ret;
		nLoop=loop;
    static const app_usbd_config_t usbd_config = {
        .ev_state_proc = usbd_user_ev_handler,
        .enable_sof = true
    };

    ret = NRF_LOG_INIT(NULL);
    APP_ERROR_CHECK(ret);
    NRF_LOG_DEFAULT_BACKENDS_INIT();

    ret = nrf_drv_clock_init();
    APP_ERROR_CHECK(ret);

    NRF_LOG_INFO(&amp;quot;USBD audio init&amp;quot;);NRF_LOG_FLUSH();

    // Initialize LEDs and buttons
    //bsp_board_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS);

    ret = app_usbd_init(&amp;amp;usbd_config);
    APP_ERROR_CHECK(ret);

    app_usbd_class_inst_t const * class_inst_hp =
        app_usbd_audio_class_inst_get(&amp;amp;m_app_audio_headphone);

    ret = app_usbd_audio_sof_interrupt_register(class_inst_hp, hp_sof_ev_handler);
    APP_ERROR_CHECK(ret);

    ret = app_usbd_class_append(class_inst_hp);
    APP_ERROR_CHECK(ret);

    app_usbd_class_inst_t const * class_inst_mic =
        app_usbd_audio_class_inst_get(&amp;amp;m_app_audio_microphone);
    ret = app_usbd_class_append(class_inst_mic);
    APP_ERROR_CHECK(ret);
    
    if (USBD_POWER_DETECTION)
    {
        ret = app_usbd_power_events_enable();
        APP_ERROR_CHECK(ret);
    }
    else
    {
        NRF_LOG_INFO(&amp;quot;No USB power detection enabled\r\nStarting USB now&amp;quot;);NRF_LOG_FLUSH();

        app_usbd_enable();
        app_usbd_start();
    }
    NRF_LOG_INFO(&amp;quot;USBD audio started&amp;quot;);NRF_LOG_FLUSH();
		//bsp_board_leds_on();//test
    //NRF_LOG_INFO(&amp;quot;USBD audio will loop&amp;quot;);
		i2s_audio_init();

    while (true)
    {
        while (app_usbd_event_queue_process())//must loop call this, if not non device in PC
        {
            /* Nothing to do */
        }

        UNUSED_RETURN_VALUE(NRF_LOG_PROCESS());
        /* Sleep CPU only if there was no interrupt since last loop processing */
        __WFE();
    }
		return 0;
}

void usb_audio_uninit()
{
	app_usbd_stop();
	app_usbd_disable();
	app_usbd_uninit();
}

&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;quot;nrf_drv_i2s.h&amp;quot;
#include &amp;quot;nrf_delay.h&amp;quot;
#include &amp;quot;app_util_platform.h&amp;quot;
#include &amp;quot;app_error.h&amp;quot;
#include &amp;quot;boards.h&amp;quot;
#include &amp;quot;nrf_queue.h&amp;quot;
#include &amp;quot;nrf_log.h&amp;quot;
#include &amp;quot;nrf_log_ctrl.h&amp;quot;
#include &amp;quot;nrf_log_default_backends.h&amp;quot;

#include &amp;quot;nrfx_i2s.h&amp;quot;
#include &amp;quot;i2s_audio.h&amp;quot;
#include &amp;quot;usbd_audio.h&amp;quot;

#define I2S_SCK_PIN 		0x07
#define I2S_LRCK_PIN 		0x08
#define I2S_SDOUT_PIN 	0xff
#define I2S_SDIN_PIN 		0x28


#define I2S_DATA_BLOCK_WORDS 40

static uint32_t m_buffer_rx32u[3][I2S_DATA_BLOCK_WORDS];
static nrfx_i2s_buffers_t initial_buffers[3];
static int _tx_data_idx=0,_rx_data_idx=0;
static uint32_t* volatile mp_block_to_fill  = NULL;
static uint32_t const * volatile mp_block_to_check = NULL;
static nrfx_i2s_buffers_t* volatile current_buffer=NULL;


static uint16_t 	mic_data[I2S_DATA_BLOCK_WORDS*2];
static int 	 			mic_enc_idx=0,discard=0;
//------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------
static void check_rx_data(uint32_t const * p_block)
{
	bool slog=(rand()%9000==9);
	mic_enc_idx=0;
	// [each data word contains two 16-bit samples]
	for (int i = 0; i &amp;lt; I2S_DATA_BLOCK_WORDS; i++)//from mic
	{
		uint32_t const * p_word = &amp;amp;p_block[i];
		uint16_t actual_sample_l = ((uint16_t const *)p_word)[0];//
		uint16_t actual_sample_r = ((uint16_t const *)p_word)[1];//
		mic_data[mic_enc_idx++]=actual_sample_l;
		mic_data[mic_enc_idx++]=actual_sample_r;
	}
	if(slog)NRF_LOG_INFO(&amp;quot;Mic:  %02x  %02x  %02x  %02x  %02x  %02x\n&amp;quot;,mic_data[0]&amp;amp;0Xffff,mic_data[1]&amp;amp;0Xffff,mic_data[2]&amp;amp;0Xffff,mic_data[3]&amp;amp;0Xffff,mic_data[4]&amp;amp;0Xffff,mic_data[5]&amp;amp;0Xffff);
	uint16_t c =  usb_put_data(mic_data, I2S_DATA_BLOCK_WORDS*2);
}

static void data_handler(nrfx_i2s_buffers_t const *p_released, uint32_t status)
{
	if (NRFX_I2S_STATUS_NEXT_BUFFERS_NEEDED == status)
	{
		if(current_buffer==&amp;amp;initial_buffers[0])
			current_buffer=&amp;amp;initial_buffers[1];
		else if(current_buffer==&amp;amp;initial_buffers[1])
			current_buffer=&amp;amp;initial_buffers[2];
		else current_buffer=&amp;amp;initial_buffers[0];
		nrfx_err_t err = nrfx_i2s_next_buffers_set(current_buffer);
		if (err != NRFX_SUCCESS)
			NRF_LOG_INFO(&amp;quot;Error!, continuing running as if nothing happened, but you should probably investigate.\n&amp;quot;);
	}
	if (p_released)
	{
		if (p_released-&amp;gt;p_tx_buffer != NULL)
		{
			mp_block_to_fill = (uint32_t *)p_released-&amp;gt;p_tx_buffer;
		}
		if (p_released-&amp;gt;p_rx_buffer != NULL)
		{
			mp_block_to_check = p_released-&amp;gt;p_rx_buffer;
			check_rx_data(mp_block_to_check);
		}
	}
}

//------------------------------------------------------------------------------------

int i2s_audio_init(bool k48)
{
	initial_buffers[0].p_tx_buffer = NULL;
	initial_buffers[0].p_rx_buffer = NULL;
	initial_buffers[1].p_tx_buffer = NULL;
	initial_buffers[1].p_rx_buffer = NULL;
	initial_buffers[2].p_tx_buffer = NULL;
	initial_buffers[2].p_rx_buffer = NULL;

	memset(&amp;amp;m_buffer_rx32u, 0x00, sizeof(m_buffer_rx32u));
	initial_buffers[0].p_rx_buffer = m_buffer_rx32u[0];
	initial_buffers[1].p_rx_buffer = m_buffer_rx32u[1];
	initial_buffers[2].p_rx_buffer = m_buffer_rx32u[2];

	nrfx_i2s_config_t config =NRFX_I2S_DEFAULT_CONFIG;
	config.sdin_pin  = I2S_SDIN_PIN;
	config.sdout_pin = I2S_SDOUT_PIN;
	config.sck_pin   = I2S_SCK_PIN;
	config.lrck_pin  = I2S_LRCK_PIN;
	//config.mck_pin = ;

  config.format    = NRF_I2S_FORMAT_I2S;
  config.alignment = NRF_I2S_ALIGN_LEFT;
	config.mode = NRF_I2S_MODE_MASTER;

		config.ratio     = NRF_I2S_RATIO_32X;
		config.mck_setup = NRF_I2S_MCK_32MDIV21;
		config.channels = NRF_I2S_CHANNELS_STEREO;
		config.sample_width = NRF_I2S_SWIDTH_16BIT; 


	nrfx_err_t err_code = nrfx_i2s_init(&amp;amp;config, data_handler);
	if (err_code != NRFX_SUCCESS)
	{
		NRF_LOG_INFO(&amp;quot;I2S init error\n&amp;quot;);
		return err_code;
	}
	current_buffer=&amp;amp;initial_buffers[0];
	err_code = nrfx_i2s_start(&amp;amp;initial_buffers[0], I2S_DATA_BLOCK_WORDS, 0); //start recording
	if (err_code != NRFX_SUCCESS)
	{
		NRF_LOG_INFO(&amp;quot;I2S start error\n&amp;quot;);
		return err_code;
	}

	return err_code;
}

int i2s_audio_stop()
{
	nrfx_i2s_stop();
	nrfx_i2s_uninit();
}

//------------------------------------------------------------------------------------
&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Best regards&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2S mic to USB audio (nRF5 SDK v17.0.2)</title><link>https://devzone.nordicsemi.com/thread/421453?ContentTypeID=1</link><pubDate>Thu, 20 Apr 2023 10:50:24 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:dffffa0c-19c3-4869-b8d3-b9287b382593</guid><dc:creator>Sigurd</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;Try calling it in the&amp;nbsp;&lt;span&gt;usbd_user_ev_handler() when you get the event&amp;nbsp;&lt;/span&gt;&lt;span&gt;APP_USBD_EVT_DRV_SOF . Also remember&amp;nbsp;to check the return code from&amp;nbsp;app_usbd_audio_class_tx_start() if you are suspecting&amp;nbsp;you are losing&amp;nbsp;data.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2S mic to USB audio (nRF5 SDK v17.0.2)</title><link>https://devzone.nordicsemi.com/thread/421419?ContentTypeID=1</link><pubDate>Thu, 20 Apr 2023 09:06:43 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:c2dcf1cb-8921-4548-8a3a-ba9aaaad390d</guid><dc:creator>yoyou</dc:creator><description>&lt;p&gt;Hi, thanks for reply,&lt;/p&gt;
&lt;p&gt;&lt;span&gt;app_usbd_audio_class_rx_start()&amp;nbsp; and APP_USBD_AUDIO_USER_EVT_RX_DONE&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;is recv from PC,then loop back to PC, &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;i don&amp;#39;t need it, my project only recv from I2S and then put the audio data to PC by usb audio.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style="color:#0000ff;"&gt;I2S demo,data_handler()--&amp;gt;check_rx_data(),&lt;/span&gt;got audio data,how to put to usb audio?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;1.Using app_usbd_audio_class_tx_start() directly,&amp;nbsp; i suspect losing some data frames.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;2.put data to a memery buffer first, then where to call&amp;nbsp;app_usbd_audio_class_tx_start()?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;if call it once in first put to buffer,and then call in&amp;nbsp;APP_USBD_AUDIO_USER_EVT_TX_DONE,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;will lost most of audio data.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Best regards&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2S mic to USB audio (nRF5 SDK v17.0.2)</title><link>https://devzone.nordicsemi.com/thread/421413?ContentTypeID=1</link><pubDate>Thu, 20 Apr 2023 08:46:14 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:d3337763-709b-49f7-8007-182b3ce120c3</guid><dc:creator>Sigurd</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;I assume you have taken a look at how it&amp;#39;s done in the usbd_audio example.&lt;/p&gt;
&lt;p&gt;In the&amp;nbsp;&lt;span&gt;usbd_user_ev_handler, you get the event&amp;nbsp;APP_USBD_EVT_DRV_SOF. Here&amp;nbsp;app_usbd_audio_class_rx_start() is called, and when that is completed, you get the&amp;nbsp;APP_USBD_AUDIO_USER_EVT_RX_DONE in&amp;nbsp;hp_audio_user_ev_handler(), and here&amp;nbsp;app_usbd_audio_class_tx_start() is called. In that way, it&amp;#39;s&amp;nbsp;called in a reaction to a SOF event, in the&amp;nbsp;usbd_audio example.&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>