完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
/* * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: CC0-1.0 */ #include #include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/i2s_std.h" #include "esp_system.h" #include "esp_check.h" #include "es8311.h" #include "driver/gpio.h" #define TEST_HEAD 0 #define GPIO_LED_IO GPIO_NUM_48 /* I2C port and GPIOs */ #define I2C_NUM (0) #if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32H2 #define I2C_SCL_IO (GPIO_NUM_6) #define I2C_SDA_IO (GPIO_NUM_7) #else #define I2C_SCL_IO (GPIO_NUM_18) #define I2C_SDA_IO (GPIO_NUM_17) #endif /* I2S port and GPIOs */ #define I2S_NUM (0) #define I2S_MCK_IO (GPIO_NUM_16)//0 #define I2S_BCK_IO (GPIO_NUM_9)//4 #define I2S_WS_IO (GPIO_NUM_45)//5 #if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32H2 #define I2S_DO_IO (GPIO_NUM_2) #define I2S_DI_IO (GPIO_NUM_3) #else #define I2S_DO_IO (GPIO_NUM_8)//18 #define I2S_DI_IO (GPIO_NUM_NC)//19 #endif /* Example configurations */ #define EXAMPLE_RECV_BUF_SIZE (2400) #define EXAMPLE_SAMPLE_RATE (16000) #define EXAMPLE_MCLK_MULTIPLE (384) // If not using 24-bit data width, 256 should be enough #define EXAMPLE_MCLK_FREQ_HZ (EXAMPLE_SAMPLE_RATE * EXAMPLE_MCLK_MULTIPLE) #define EXAMPLE_VOICE_VOLUME CONFIG_EXAMPLE_VOICE_VOLUME #if CONFIG_EXAMPLE_MODE_ECHO #define EXAMPLE_MIC_GAIN CONFIG_EXAMPLE_MIC_GAIN #endif static const char *TAG = "i2s_es8311"; static const char err_reason[][30] = {"input param is invalid", "operation timeout" }; static i2s_chan_handle_t tx_handle = NULL; static i2s_chan_handle_t rx_handle = NULL; /* Import music file as buffer */ #if CONFIG_EXAMPLE_MODE_MUSIC extern const uint8_t music_pcm_start[] asm("_binary_canon_pcm_start"); extern const uint8_t music_pcm_end[] asm("_binary_canon_pcm_end"); #endif esp_err_t gpio_init(void) { gpio_config_t io_conf = {}; //disable interrupt io_conf.intr_type = GPIO_INTR_DISABLE; //set as output mode io_conf.mode = GPIO_MODE_OUTPUT; //bit mask of the pins that you want to set,e.g.GPIO18/19 io_conf.pin_bit_mask = 1ULL< 0) { ESP_LOGI(TAG, "[music] i2s music played, %d bytes are written.", bytes_write); } else { ESP_LOGE(TAG, "[music] i2s music play failed."); abort(); } vTaskDelay(1000 / portTICK_PERIOD_MS); } vTaskDelete(NULL); } #else static void i2s_echo(void *args) { int *mic_data = malloc(EXAMPLE_RECV_BUF_SIZE); if (!mic_data) { ESP_LOGE(TAG, "[echo] No memory for read data buffer"); abort(); } esp_err_t ret = ESP_OK; size_t bytes_read = 0; size_t bytes_write = 0; ESP_LOGI(TAG, "[echo] Echo start"); while (1) { memset(mic_data, 0, EXAMPLE_RECV_BUF_SIZE); /* Read sample data from mic */ ret = i2s_channel_read(rx_handle, mic_data, EXAMPLE_RECV_BUF_SIZE, &bytes_read, 1000); if (ret != ESP_OK) { ESP_LOGE(TAG, "[echo] i2s read failed, %s", err_reason[ret == ESP_ERR_TIMEOUT]); abort(); } /* Write sample data to earphone */ ret = i2s_channel_write(tx_handle, mic_data, EXAMPLE_RECV_BUF_SIZE, &bytes_write, 1000); if (ret != ESP_OK) { ESP_LOGE(TAG, "[echo] i2s write failed, %s", err_reason[ret == ESP_ERR_TIMEOUT]); abort(); } if (bytes_read != bytes_write) { ESP_LOGW(TAG, "[echo] %d bytes read but only %d bytes are written", bytes_read, bytes_write); } vTaskDelay(1000 / portTICK_PERIOD_MS); } vTaskDelete(NULL); } #endif void app_main(void) { int cnt = 0; printf("i2s es8311 codec example startn-----------------------------n"); if(gpio_init() != ESP_OK){ ESP_LOGE(TAG, "gpio init failed"); abort(); } else { ESP_LOGI(TAG, "gpio init success"); } #if TEST_HEAD while(1){ printf("my cnt: %dn", cnt++); vTaskDelay(5000 / portTICK_PERIOD_MS); if(gpio_set_level(GPIO_LED_IO, 0) != ESP_OK){ ESP_LOGE(TAG, "gpio initxxx failed"); abort(); } else { ESP_LOGI(TAG, "GPIO_LED_IO Off"); } vTaskDelay(5000 / portTICK_PERIOD_MS); if(gpio_set_level(GPIO_LED_IO, 1) != ESP_OK){ ESP_LOGE(TAG, "gpio initxxx failed"); abort(); } else { ESP_LOGI(TAG, "GPIO_LED_IO On"); } //gpio_set_level(GPIO_NUM_48, 1); } #endif gpio_set_level(GPIO_LED_IO, 1); /* Initialize i2s peripheral */ if (i2s_driver_init() != ESP_OK) { ESP_LOGE(TAG, "i2s driver init failed"); abort(); } else { ESP_LOGI(TAG, "i2s driver init success"); } /* Initialize i2c peripheral and config es8311 codec by i2c */ if (es8311_codec_init() != ESP_OK) { ESP_LOGE(TAG, "es8311 codec init failed"); abort(); } else { ESP_LOGI(TAG, "es8311 codec init success"); } #if CONFIG_EXAMPLE_MODE_MUSIC /* Play a piece of music in music mode */ xTaskCreate(i2s_music, "i2s_music", 4096, NULL, 5, NULL); #else /* Echo the sound from MIC in echo mode */ xTaskCreate(i2s_echo, "i2s_echo", 8192, NULL, 5, NULL); #endif } #endif用的es8311的例程,根据打印提示i2c的初始化已经通过了,但是i2c的时钟没有波形出来 |
|
相关推荐
1个回答
|
|
在使用ESP32S3-WROOM-1开发板进行I2C通信时,如果没有波形显示,可能是由以下几个原因导致的:
1. **I2C引脚连接问题**:确保I2C的SDA(数据线)和SCL(时钟线)引脚已经正确连接到目标设备。检查是否有焊接问题或连接不良。 2. **I2C设备未供电**:确保I2C设备已经得到适当的电源供应。 3. **I2C设备地址问题**:检查I2C设备的地址是否正确设置,并且与代码中的地址匹配。 4. **I2C时钟频率设置问题**:检查代码中设置的I2C时钟频率是否过高或过低,导致通信问题。尝试调整时钟频率,例如使用标准的100kHz或400kHz。 5. **I2C驱动问题**:确保ESP32S3的I2C驱动已经正确安装和配置。 6. **硬件故障**:如果以上步骤都无法解决问题,可能是开发板或I2C设备的硬件故障。尝试使用其他设备或开发板进行测试。 7. **示波器或逻辑分析仪设置问题**:如果你正在使用示波器或逻辑分析仪来观察I2C波形,确保它们的设置是正确的,例如合适的探头、时钟设置和触发条件。 8. **软件问题**:检查你的代码是否有逻辑错误或配置错误,这可能导致I2C通信失败。 9. **电源干扰**:I2C通信可能受到电源干扰的影响,确保电源线和信号线远离可能产生干扰的设备。 10. **软件滤波设置**:在某些情况下,示波器或逻辑分析仪的软件滤波设置可能会影响波形的显示。检查并调整这些设置以获得清晰的波形。 解决这些问题后,你应该能够在示波器或逻辑分析仪上看到I2C通信的波形。如果问题仍然存在,可能需要进一步的硬件诊断或软件调试。 |
|
|
|
只有小组成员才能发言,加入小组>>
486 浏览 1 评论
551浏览 6评论
461浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
443浏览 5评论
445浏览 4评论
415浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 15:21 , Processed in 0.825269 second(s), Total 79, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号