完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
但是断电以后,I2S_Read又会取得全部都是0的数据。每次我都要先烧录运行一下 ADF的pipeline_passthru例程,然后再烧录我的DSP程序,才能正常的I2S_Read, 这也是我无意中发现的。
请问是我的硬件有什么问题吗?还是我用的代码有问题? i2s_config_t i2s_read_config = { .mode = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_RX, .sample_rate = 44100, .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, .communication_format = I2S_COMM_FORMAT_STAND_I2S, .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, .intr_alloc_flags = ESP_INTR_FLAG_LEVEL2 | ESP_INTR_FLAG_IRAM, .dma_buf_count = 3, .dma_buf_len = I2S_READLEN, .use_apll = true, .tx_desc_auto_clear = true, .fixed_mclk = 0 }; i2s_pin_config_t i2s_read_pin_config = { .bck_io_num = GPIO_NUM_5, .ws_io_num = GPIO_NUM_25, .data_out_num = GPIO_NUM_26, .data_in_num = GPIO_NUM_35 }; i2s_driver_install(I2S_NUM, &i2s_read_config, 0, NULL); i2s_set_pin(I2S_NUM, &i2s_read_pin_config); /*******************/ printf("[filter-dsp] Initializing MCLK output...rn"); PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0_CLK_OUT1); WRITE_PERI_REG(PIN_CTRL, 0xFFF0); /*******************/ printf("[filter-dsp] Enabling Passthrough mode...rn"); size_t i2s_bytes_read = 0; size_t i2s_bytes_written = 0; int16_t i2s_buffer_read[I2S_READLEN / sizeof(int16_t)]; int16_t i2s_buffer_write[I2S_READLEN / sizeof(int16_t)]; while (true) { i2s_bytes_read = I2S_READLEN; i2s_read(I2S_NUM, i2s_buffer_read, I2S_READLEN, &i2s_bytes_read, 100); /* left channel filter */ for (uint32_t i = 0; i < i2s_bytes_read / 2; i += 2) { // printf("left: %drn", i2s_buffer_read[i]); i2s_buffer_write[i] = processSample(i2s_buffer_read[i]); // printf("left OUT: %drn", i2s_buffer_write[i]); } /* right channel filter */ for (uint32_t i = 1; i < i2s_bytes_read / 2; i += 2) i2s_buffer_write[i] = dummyfilter(i2s_buffer_read[i]) ; esp_err_t err = i2s_write(I2S_NUM, i2s_buffer_write, i2s_bytes_read, &i2s_bytes_written, 100); ESP_ERROR_CHECK_WITHOUT_ABORT(err); } 我用的开发板是 ESP32 LYRAT 4.3,板载的DAC是8388。我要实现的功能其实非常简单, 模拟信号从LINE IN输入,我I2S_READ读取,处理数据后, I2S_WRITE输出。 上述代码运行没有任何报错,但是i2s_read返回的都是0。 没有人遇到跟我一样的问题吗?网上搜了很多资料,发现没人反馈这个问题。 |
|
相关推荐
1个回答
|
|
我将分步骤分析可能的原因并提供解决方案。
1. 首先,检查您的硬件连接。确保I2S设备的连接正确,包括数据线、时钟线和电源线。如果连接有问题,可能会导致I2S_Read返回0。 2. 检查您的i2s_config_t配置。您提供的配置如下: ```c i2s_config_t i2s_read_config = { .mode = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_RX, .sample_rate = 44100, // ... 其他配置 }; ``` 这个配置看起来是正确的,但请确保其他配置项(如数据宽度、通道格式等)与您的硬件和需求相匹配。 3. 您提到在断电后,I2S_Read会返回全0的数据。这可能是因为I2S设备在断电后需要一定的时间来初始化和稳定。在这种情况下,您可以尝试在I2S_Read之前添加一些延时,以确保I2S设备已经准备好。 4. 您提到需要先烧录运行ADF的pipeline_passthru例程,然后再烧录您的DSP程序,才能正常使用I2S_Read。这可能表明您的DSP程序在初始化I2S设备时存在问题。请检查您的DSP程序中的I2S初始化代码,确保它正确地配置了I2S设备。 |
|
|
|
只有小组成员才能发言,加入小组>>
1132 浏览 1 评论
575浏览 6评论
477浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
461浏览 5评论
462浏览 4评论
435浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 02:18 , Processed in 0.761399 second(s), Total 82, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号