- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在我的 esp32 微 Controller 上使用麦克风传感器。目前,它正在运行 ESP-IDF 框架。麦克风是 sph0645lm4h-b。我正在使用 I2S 协议(protocol)连接到传感器。
I2S 配置如下所示:
void i2s_init()
{
i2s_config_t i2s_config = {
.mode = I2S_MODE_MASTER | I2S_MODE_RX, // I2S_MODE_TX Only TX
.sample_rate = 17000,
.bits_per_sample = 32,
// .channel_format = I2S_CHANNEL_FMT_ALL_LEFT, //2-channels
.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
.communication_format = (i2s_comm_format_t)I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB,
.dma_buf_count = 8,
.dma_buf_len = 64,
.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1 //Interrupt level 1
};
i2s_pin_config_t pin_config = {
.bck_io_num = 26,
.ws_io_num = 25,
.data_out_num = -1, //Not used
.data_in_num = 27
};
i2s_driver_install(I2S_NUM, &i2s_config, 0, NULL);
i2s_set_pin(I2S_NUM, &pin_config);
}
收集数据的代码:
i2s_init(); //initializes mics
int samples_value, samples_data;
samples_value = i2s_pop_sample(I2S_NUM, &samples_data, 2);
printf("%d,", samples_data);
当我将代码上传到微 Controller 时,我得到了令人困惑的数据。输出从真正的负值和 1 交替出现。
数据:
-191725568,1,-191823872,1,-191889408,1,-192020480,1,-192118784,1,-190152704,1,-190054400,1,-190021632,1
我不确定这是否是我应该从麦克风传感器接收的数据,我在 I2S documentation 上读到i2s_pop_sample 已贬值,因此我尝试使用 i2s_read,但收到 StoreProhibited 错误。
i2s_read 代码:
int *samples;
int s;
samples = &s; //pointer initialization
i2s_read(I2S_NUM,&samples,4,4,2);
错误:
Guru Meditation Error: Core 0 panic'ed (StoreProhibited). Exception was unhandled.
Core 0 register dump:
PC : 0x400d7552 PS : 0x00060b30 A0 : 0x800d1c9f A1 : 0x3ffcc950
A2 : 0x00000000 A3 : 0x3ffccaa8 A4 : 0x00000004 A5 : 0x00000004
A6 : 0x00000002 A7 : 0x00000005 A8 : 0x800d1e72 A9 : 0x3ffcc900
A10 : 0x3d87e746 A11 : 0x00000000 A12 : 0x00000001 A13 : 0x00000002
A14 : 0x7f800000 A15 : 0x00000000 SAR : 0x00000015 EXCCAUSE: 0x0000001d
EXCVADDR: 0x00000004 LBEG : 0x40002390 LEND : 0x4000239f LCOUNT : 0x00000000
Backtrace: 0x400d7552:0x3ffcc950 0x400d1c9c:0x3ffcc990 0x400e9994:0x3ffccae0
最佳答案
由于 i2s_pop_sample()
已弃用,我将解决 i2s_read()
问题。
调用 i2s_read()
的方式是使用指针作为数据缓冲区并传递整数作为指针。
这是取自 ESP-IDF manual 的 i2c_read()
原型(prototype).
esp_err_t i2s_read(i2s_port_ti2s_num, void *dest, size_t size, size_t *bytes_read, TickType_t ticks_to_wait)
i2s_num
是 i2s 端口号dest
是要读取数据的缓冲区的地址size
是缓冲区的大小bytes_read
是一个指向 size_t
的指针,它将读取写入的字节数ticks_to_wait
是超时您传递给 i2s_read()
的参数有两个问题。你这样调用它:
int *samples;
int s;
samples = &s;
i2s_read(I2S_NUM,&samples,4,4,2);
您将 &samples
作为缓冲区的地址传递。因此,您告诉 i2s_read()
的是读取 4 个字节的数据并将它们存储在 samples
中,这没有多大意义,因为它是一个指针。您应该只传递 &s
作为缓冲区,并跳过使用 samples
进行处理。
第二个问题是您将 4
作为 bytes_read
参数传递。我真的很惊讶这个甚至被编译了。这使得i2s_read()
尝试存储一个size_t
以及在地址4处读取的字节数,这肯定会导致某种异常。
试试这个:
int32_t sample;
size_t bytes_read;
i2s_read(I2S_NUM, &sample, 4, &bytes_read, 2);
这个:
int
的存储大小做出任何假设,并保证 sample
为 4 字节(32 位)整数i2s_read() 读取的数据而创建的 4 字节整数
size_t
,以便 i2s_read()
可以存储它读取的字节数。如果您想知道实际读取了多少字节,就在 bytes_read
中。
关于c - 调用 i2s_read 函数时 ESP32 上出现 StoreProhibited 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54065822/
我正在尝试在我的 esp32 微 Controller 上使用麦克风传感器。目前,它正在运行 ESP-IDF 框架。麦克风是 sph0645lm4h-b。我正在使用 I2S 协议(protocol)连
我是一名优秀的程序员,十分优秀!