完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在idf的例程中复制项目i2s_basic,我尝试修改采样率来提高i2s的频率,当我设置采样率到150000,使用逻辑分析仪测量bck_io的频率为9.7MHz,我接着往大的设置,尝试了250000,350000....625000。发现bck_io的频率最高只能到15MHZ,设置高了也没有效果。
Code: Select all /* I2S Example This example code will output 100Hz sine wave and triangle wave to 2-channel of I2S driver Every 5 seconds, it will change bits_per_sample [16, 24, 32] for i2s data This example code is in the Public Domain (or CC0 licensed, at your option.) Unless required by applicable law or agreed to in writing, this software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ #include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/i2s.h" #include "driver/gpio.h" #include "esp_system.h" #include "esp_log.h" #include #define SAMPLE_RATE (150000) #define I2S_NUM (0) #define WAVE_FREQ_HZ (100) #define PI (3.14159265) #define I2S_BCK_IO (GPIO_NUM_4) #define I2S_WS_IO (GPIO_NUM_5) #define I2S_DO_IO (-1) #define I2S_DI_IO (GPIO_NUM_18) #define SAMPLE_PER_CYCLE (SAMPLE_RATE/WAVE_FREQ_HZ) static const char* TAG = "i2s_example"; int16_t i2s_readraw_buff[400]; static void setup_triangle_sine_waves(int bits) { int *samples_data = malloc(((bits+8)/16)*SAMPLE_PER_CYCLE*4); unsigned int i, sample_val; double sin_float, triangle_float, triangle_step = (double) pow(2, bits) / SAMPLE_PER_CYCLE; size_t i2s_bytes_write = 0; printf("rnTest bits=%d free mem=%d, written data=%dn", bits, esp_get_free_heap_size(), ((bits+8)/16)*SAMPLE_PER_CYCLE*4); triangle_float = -(pow(2, bits)/2 - 1); for(i = 0; i < SAMPLE_PER_CYCLE; i++) { sin_float = sin(i * 2 * PI / SAMPLE_PER_CYCLE); if(sin_float >= 0) triangle_float += triangle_step; else triangle_float -= triangle_step; sin_float *= (pow(2, bits)/2 - 1); if (bits == 16) { sample_val = 0; sample_val += (short)triangle_float; sample_val = sample_val << 16; sample_val += (short) sin_float; samples_data = sample_val; } else if (bits == 24) { //1-bytes unused samples_data[i*2] = ((int) triangle_float) << 8; samples_data[i*2 + 1] = ((int) sin_float) << 8; } else { samples_data[i*2] = ((int) triangle_float); samples_data[i*2 + 1] = ((int) sin_float); } } ESP_LOGI(TAG, "set clock"); i2s_set_clk(I2S_NUM, SAMPLE_RATE, bits, 2); //Using push // for(i = 0; i < SAMPLE_PER_CYCLE; i++) { // if (bits == 16) // i2s_push_sample(0, &samples_data, 100); // else // i2s_push_sample(0, &samples_data[i*2], 100); // } // or write ESP_LOGI(TAG, "write data"); i2s_write(I2S_NUM, samples_data, ((bits+8)/16)*SAMPLE_PER_CYCLE*4, &i2s_bytes_write, 100); free(samples_data); } void app_main(void) { //for 36Khz sample rates, we create 100Hz sine wave, every cycle need 36000/100 = 360 samples (4-bytes or 8-bytes each sample) //depend on bits_per_sample //using 6 buffers, we need 60-samples per buffer //if 2-channels, 16-bit each channel, total buffer is 360*4 = 1440 bytes //if 2-channels, 24/32-bit each channel, total buffer is 360*8 = 2880 bytes i2s_config_t i2s_config = { .mode = I2S_MODE_MASTER | I2S_MODE_RX, .sample_rate = SAMPLE_RATE, .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT, .channel_format = I2S_CHANNEL_FMT_ALL_LEFT, .communication_format = I2S_COMM_FORMAT_STAND_MSB, .dma_buf_count = 6, .dma_buf_len = 60, .use_apll = true, .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1 //Interrupt level 1 }; i2s_pin_config_t pin_config = { .bck_io_num = I2S_BCK_IO, .ws_io_num = I2S_WS_IO, .data_out_num = I2S_DO_IO, .data_in_num = I2S_DI_IO //Not used }; i2s_driver_install(I2S_NUM, &i2s_config, 0, NULL); i2s_set_pin(I2S_NUM, &pin_config); // i2s_set_clk(I2S_NUM, SAMPLE_RATE, I2S_BITS_PER_SAMPLE_16BIT, 2); size_t bytes_read; while (1) { // setup_triangle_sine_waves(test_bits); i2s_read(I2S_NUM, i2s_readraw_buff, 200, &bytes_read, portMAX_DELAY); printf("read i2s %d:",bytes_read); for(int i = 0;i < 200; i++) { printf("%x ",i2s_readraw_buff); } printf("n"); vTaskDelay(5000/portTICK_RATE_MS); } } |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
172个成员聚集在这个小组
加入小组436 浏览 1 评论
1305 浏览 1 评论
599浏览 6评论
498浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
481浏览 5评论
481浏览 4评论
465浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-14 05:49 , Processed in 0.614450 second(s), Total 40, Slave 35 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号