Page 1 of 4

T5 3.12.25 i2s使用问题

Posted: 2025年 Dec 22日 11:31
by chen12

版本:wukong V3.12.25
平台:T5
硬件:自定义开发板
软件:tuyaos_demo_examples
硬件使用INMP441接开发板i2s0
在tuyaos_demo_examples新增了一个i2s测试的demo,代码如下:

Code: Select all

/**
* @file examples_driver_gpio.c
* @author www.tuya.com
* @brief 一个简单的tkl gpio接口使用演示程序,可以通过命令行执行
* @version 0.1
* @date 2022-05-20
*
* @copyright Copyright (c) tuya.inc 2022
*
*/

#include "tuya_iot_config.h"

#include "tuya_cloud_types.h"
#include "tal_log.h"
#include "tal_thread.h"
#include "tal_system.h"
#include "tkl_gpio.h"
#include "tkl_output.h"

#include <driver/i2s.h>
#include <driver/i2s_types.h>

STATIC THREAD_HANDLE sg_i2s_handle;


static RingBufferContext *m_ringbuffer = NULL;
uint8_t ch1_temp[100] = {0};

static int ch1_rx_data_handle_cb(uint32_t size)
{
        //os_printf("%s, size: %d \n", __func__, size);
        ring_buffer_read(m_ringbuffer, ch1_temp, size);
        TAL_PR_DEBUG("rx ch1_temp[0]: 0x%2x \n", ch1_temp[0]);

    return size;
}
/**
* @brief gpio task
*
* @param[in] param:Task parameters
* @return none
*/
STATIC VOID __example_i2s_task(VOID* param)
{
    i2s_config_t i2s_config = DEFAULT_I2S_CONFIG();
    bk_err_t ret = BK_OK;
    uint32_t size = 0;

    //init i2s driver
    bk_i2s_driver_init();

    //init i2s configure
    i2s_config.role = I2S_ROLE_MASTER;
    i2s_config.samp_rate = I2S_SAMP_RATE_48000;
    bk_i2s_init(I2S_GPIO_GROUP_0, &i2s_config);
    TAL_PR_DEBUG("init i2s driver and config successful \r\n");

    /* 配置第一个通道用于接收数据,每帧数据的size为(640/2)字节 */
    ret = bk_i2s_chl_init(I2S_CHANNEL_1, I2S_TXRX_TYPE_RX, 640, ch1_rx_data_handle_cb, &m_ringbuffer);
    if (ret != BK_OK) {
        TAL_PR_DEBUG("bk_i2s_chl_init fail \n");
        return;
    }

    /* 启动I2S开始接收数据 */
    bk_i2s_start();
}

/**
* @brief examples_adc_init_and_read
*
* @return none
*/
VOID example_i2s(INT_T argc, CHAR_T *argv[])
{
    OPERATE_RET rt = OPRT_OK;

    STATIC THREAD_CFG_T thrd_param = {
        .priority = THREAD_PRIO_2,
        .stackDepth = 1024,
        .thrdname = "i2s"
    };
    TUYA_CALL_ERR_LOG(tal_thread_create_and_start(&sg_i2s_handle, NULL, NULL, __example_i2s_task, NULL, &thrd_param));

    return;
}

烧录执行example_i2s后,打印如下:
[01-01 08:02:58 ty D][7004][tal_thread.c:224] Thread:i2s Exec Start. Set to Running Stat 0x607004d0
apll_clk: 98304000, sample_rate: 48000, smp_ratio: 15
bit_ratio: 32, bit_ratio_b: 0
[01-01 08:02:58 ty D][7004][example_driver_i2s.c:57] init i2s driver and config successful
看起来是初始化成功了,并且用示波器测试clk和DIN都有信号,但是却一直没有执行到ch1_rx_data_handle_cb里面


Re: T5 3.12.25 i2s使用问题

Posted: 2025年 Dec 22日 11:36
by heixia.wang@tuya.com

rx是用于接收的,一般接收使用slave
//init i2s driver
bk_i2s_driver_init();

Code: Select all

	//init i2s configure
	i2s_config.role = I2S_ROLE_SLAVE;
	i2s_config.samp_rate = I2S_SAMP_RATE_48000;
	bk_i2s_init(I2S_GPIO_GROUP_0, &i2s_config);
	os_printf("init i2s driver and config successful \r\n");

	ret = bk_i2s_chl_init(I2S_CHANNEL_1, I2S_TXRX_TYPE_RX, 640, ch1_rx_data_handle_cb, &ch1_rx_rb);
	if (ret != BK_OK) {
		os_printf("bk_i2s_chl_init fail \n");
		return;
	}

	bk_i2s_start();

Re: T5 3.12.25 i2s使用问题

Posted: 2025年 Dec 22日 11:41
by chen12

但是我这边接的是dmic,dmic能当主机吗?


Re: T5 3.12.25 i2s使用问题

Posted: 2025年 Dec 22日 11:44
by heixia.wang@tuya.com

可以的


Re: T5 3.12.25 i2s使用问题

Posted: 2025年 Dec 22日 11:45
by chen12

刚刚试了下,改成了I2S_ROLE_SLAVE,还是不行,麻烦帮忙看下还有什么其他地方配置需要改吗


Re: T5 3.12.25 i2s使用问题

Posted: 2025年 Dec 22日 11:51
by heixia.wang@tuya.com

配置上看没有问题,我们也有数字麦在用,这个文件您核对一下,是否对应修改合入了


Re: T5 3.12.25 i2s使用问题

Posted: 2025年 Dec 22日 11:56
by chen12

看起来是有这个patch


Re: T5 3.12.25 i2s使用问题

Posted: 2025年 Dec 22日 13:40
by heixia.wang@tuya.com

那可以排查下硬件接线方面的问题,以及采样率是否一致


Re: T5 3.12.25 i2s使用问题

Posted: 2025年 Dec 22日 13:42
by chen12

我看INMP441这款dmic,支持频率60hz-15khz,但是没看到怎么改dmic的频率的,你们使用的dmic能改频率吗?


Re: T5 3.12.25 i2s使用问题

Posted: 2025年 Dec 22日 14:10
by heixia.wang@tuya.com

从机不能改采样率,和dmic发出来的实际采样率一致就行,你这款48k是最高支持的采样率,不一定是实际使用的采样率;我在网上搜到别人的demo里配的是16k,不清楚你们这款默认是什么配置,你可以用逻辑分析仪看一下,