Unable to pass I2S read ES8311 Audio data

Publish in 2023-01-06 09: 39: 36

Use WM-W800-SDK-202207-V1. 00. 08 ENGINEERING.

right ES8311 Use I2C After configuration, unavailable I2S Make a read, The read process waits. Don't know what the problem is, is ES8311 and I2S Configuration error, Or am I using it the wrong way.

The code is as follows:

#ifndef __I2C_H__
#define __I2C_H__

#include "wm_gpio. h"
#include "wm_gpio_afsel. h"
#include "wm_i2c. h"

#define I2C_FREQ  (100 * 1000) 

#define I2C_SCL WM_IO_PA_01 // Control line
#define I2C_SDA WM_IO_PA_04 // Data cable

/**
 * @brief I2C initialize
 */
static inline void i2c_init (void) 
{
    // Configuration pin
    wm_i2c_scl_config (I2C_SCL) ; 
    wm_i2c_sda_config (I2C_SDA) ; 
    // Set clock rate
    tls_i2c_init (I2C_FREQ) ; 
}

#endif
#ifndef __I2S_H__
#define __I2S_H__

#include "wm_gpio. h"
#include "wm_gpio_afsel. h"
#include "wm_i2s. h"
#include "wm_pwm. h"

#define I2S_MCLK WM_IO_PB_07
#define I2S_BCLK WM_IO_PB_08
#define I2S_LRCK WM_IO_PB_09
#define I2S_DI WM_IO_PB_10
#define I2S_DO WM_IO_PB_11

/**
 * @brief I2S initialize
 */
static inline void i2s_init (void) 
{
    wm_i2s_ck_config (I2S_BCLK) ; 
    wm_i2s_ws_config (I2S_LRCK) ; 
    wm_i2s_di_config (I2S_DI) ; 
    wm_i2s_do_config (I2S_DO) ; 
}

static inline void i2s_mclk_out (u8 div) 
{
    u8 channel = 4; 

    tls_pwm_stop (channel) ; 
    wm_pwm4_config (I2S_MCLK) ;  // I2S_MCLK  attention
    tls_pwm_out_mode_config (channel,  WM_PWM_OUT_MODE_INDPT) ; 
    tls_pwm_cnt_type_config (channel,  WM_PWM_CNT_TYPE_EDGE_ALIGN_OUT) ; 
    tls_pwm_freq_config (channel,  0,  div - 1) ; 
    tls_pwm_duty_config (channel,   (div - 1)  / 2) ; 
    tls_pwm_loop_mode_config (channel,  WM_PWM_LOOP_TYPE_LOOP) ; 
    tls_pwm_out_inverse_cmd (channel,  DISABLE) ; 
    tls_pwm_output_en_cmd (channel,  WM_PWM_OUT_EN_STATE_OUT) ; 
    tls_pwm_start (channel) ; 
}

#endif
#include "driver/es8311. h"

#include "wm_gpio. h"
#include "wm_gpio_afsel. h"
#include "wm_i2c. h"
#include "wm_pwm. h"

#include "util/error. h"

static u8 init_data[][2] = {
    {0x00,  0x1F}, 
    {0x45,  0x00}, 
    {0x01,  0x30}, 
    {0x02,  0x90}, 
    {0x03,  0x19}, 
    {0x16,  0x03}, 
    {0x04,  0x19}, 
    {0x05,  0x00}, 
    {0x06,  0x0F}, 
    {0x07,  0x01}, 
    {0x08,  0xFF}, 
    {0x0B,  0x00}, 
    {0x0C,  0x00}, 
    {0x10,  0x1F}, 
    {0x11,  0x7F}, 
    {0x00,  0xC0}, 
    {0x0D,  0x01}, 
    {0x01,  0x3F}, 
    {0x14,  0x1A}, 
    {0x12,  0x00}, 
    {0x13,  0x10}, 
    {0x09,  0x0C}, 
    {0x0A,  0x0C}, 
    {0x0E,  0x02}, 
    {0x0F,  0x44}, 
    {0x15,  0x00}, 
    {0x1B,  0x05}, 
    {0x1C,  0x65}, 
    {0x17,  0xFF},  // ADC volume 0xBF = 0
    {0x37,  0x08}, 
    {0x32,  0xFF},  // DAC volume 0xBF = 0
    {0x44,  0x00},  // loopback test.  on:  0x88;  off: 0x00;  mic--" speak
}; 

int es8311_i2c_get_reg (u8 addr,  u8 *val) 
{
    tls_i2c_write_byte (ES8311_I2C_ADDRW,  1) ; 
    GOTO_IF (tls_i2c_wait_ack ()  == WM_SUCCESS,  err) ; 
    tls_i2c_write_byte (addr,  0) ; 
    GOTO_IF (tls_i2c_wait_ack ()  == WM_SUCCESS,  err) ; 
    tls_i2c_write_byte (ES8311_I2C_ADDRR,  1) ; 
    GOTO_IF (tls_i2c_wait_ack ()  == WM_SUCCESS,  err) ; 
    *val = tls_i2c_read_byte (0,  1) ; 
    return WM_SUCCESS; 
err: 
    LOG ("es8311 i2c get reg fail") ; 
    return WM_FAILED; 
}

int es8311_i2c_set_reg (u8 addr,  u8 val) 
{
    tls_i2c_write_byte (ES8311_I2C_ADDRW,  1) ; 
    GOTO_IF (tls_i2c_wait_ack ()  == WM_SUCCESS,  err) ; 
    tls_i2c_write_byte (addr,  0) ; 
    GOTO_IF (tls_i2c_wait_ack ()  == WM_SUCCESS,  err) ; 
    tls_i2c_write_byte (val,  0) ; 
    GOTO_IF (tls_i2c_wait_ack ()  == WM_SUCCESS,  err) ; 
    tls_i2c_stop () ; 
    return WM_SUCCESS; 
err: 
    LOG ("es8311 i2c set reg fail") ; 
    return WM_FAILED; 
}

int es8311_init (void) 
{
    for  (size_t i = 0;  i  " sizeof (init_data)  / sizeof (init_data[0]) ;  i++) 
    {
        GOTO_IF (es8311_i2c_set_reg (init_data[i][0],  init_data[i][1])  == WM_SUCCESS,  err) ; 
        tls_os_time_delay (10) ;  // Prevent excessive speed
    }
    return WM_SUCCESS; 
err: 
    LOG ("es8311 init fail") ; 
    return WM_FAILED; 
}
#include "wm_include. h"

#include "driver/es8311. h"
#include "driver/i2c. h"
#include "driver/i2s. h"

#include "util/debug. h"

#define DEMO_DATA_SIZE  (1024) 

static u32 i2s_demo_rx[DEMO_DATA_SIZE] = {0}; 

static void show_rx_data (u16 len) 
{
    printf ("recv %d\r\n",  len) ; 
    for  (u16 i = 0;  i  " len;  i++) 
    {
        printf ("%08X ",  i2s_demo_rx[i]) ; 
        if  (i % 16 == 15) 
        {
            printf ("\n") ; 
        }
    }
}

void callback (uint32_t *data,  uint16_t *len) 
{
    printf ("x\n") ; 
}

void i2s_config (void) 
{
    I2S_InitDef opts = {
        . I2S_Mode_MS = I2S_MODE_SLAVE, 
        . I2S_Mode_SS = I2S_CTRL_MONO, 
        . I2S_Mode_LR = I2S_LEFT_CHANNEL, 
        . I2S_Trans_STD = I2S_Standard, 
        . I2S_DataFormat = I2S_DataFormat_16, 
        . I2S_AudioFreq = 12500, 
        . I2S_MclkFreq = 8000000, 
    }; 

    wm_i2s_port_init (&opts) ; 
    wm_i2s_register_callback (NULL) ; 
}


void UserMain (void) 
{
    i2c_init () ; 
    i2s_init () ; 

    printf ("[i2c] init \n") ; 
    printf ("[i2s] init \n") ; 

    i2s_mclk_out (5) ; 

    printf ("[i2s] mclk out \n") ; 

    DBG (es8311_init ()  == WM_SUCCESS) ; 

    printf ("[es8311] init \n") ; 

    printf ("[i2s] read start \n") ; 

    i2s_config () ; 

    wm_i2s_rx_int ( (int16_t *) i2s_demo_rx,  DEMO_DATA_SIZE) ;  // Wait here indefinitely
    show_rx_data (DEMO_DATA_SIZE) ; 

    printf ("[i2s] read end  \n") ; 

    while  (1) 
    {
        tls_os_time_delay (1000) ; 
    }
}

See more

follower
0
Be viewed
3. 5k
isme
isme Certified specialist 2023-01-06
Chilled big watermelon

Recommended reference to this SDK, There's a ready-made one inside codec Driver code. http: //ask. winnermicro. com/article/74. html

2 Multiple replies
Magical_Lin
Magical_Lin 2023-06-19
This guy is lazy, Nothing written!

Have you succeeded

Write an answer

Please login to post your answer, Click to log in

publish
problem

Share
Friend

Cell phone
browse

Scan code mobile browsing