乐鑫技术交流
直播中

yqdedli

8年用户 867经验值
擅长:控制/MCU
私信 关注
[问答]

esp32s3使用RMT多通道发送时总有一个通道比别的通道慢20ns,为什么?

Code: Select all
[///esp32s3在使用RMT多通道发送时总有一个通道比别的通道慢20ns//代码如下]//esp32s3在使用RMT多通道发送时总有一个通道比别的通道慢20ns//代码如下rmt_config_t config1;    config1.channel = RMT_CHANNEL_0;    config1.clk_div = 4;    config1.gpio_num = GPIO_NUM_40;    config1.mem_block_num = 1;    config1.rmt_mode = RMT_MODE_TX;    config1.tx_config.carrier_en = false;    config1.tx_config.idle_output_en = true;           // 空闲输出打开    config1.tx_config.idle_level = RMT_IDLE_LEVEL_LOW; // 空闲时候为低电平    config1.tx_config.loop_en = false;                 // 关闭持续发送    rmt_config_t config2 ;    config2.channel = RMT_CHANNEL_1;    config2.clk_div = 4;    config2.gpio_num = GPIO_NUM_39;    config2.mem_block_num = 1;    config2.rmt_mode = RMT_MODE_TX;    config2.tx_config.carrier_en = false;    config2.tx_config.idle_output_en = true;           // 空闲输出打开    config2.tx_config.idle_level = RMT_IDLE_LEVEL_LOW; // 空闲时候为低电平    config2.tx_config.loop_en = false;                 // 关闭持续发送    rmt_config_t config3;    config3.channel = RMT_CHANNEL_2;    config3.clk_div = 4;    config3.gpio_num = GPIO_NUM_38;    config3.mem_block_num = 1;    config3.rmt_mode = RMT_MODE_TX;    config3.tx_config.carrier_en = false;    config3.tx_config.idle_output_en = true;           // 空闲输出打开    config3.tx_config.idle_level = RMT_IDLE_LEVEL_LOW; // 空闲时候为低电平    config3.tx_config.loop_en = false;    rmt_config_t config4;    config4.channel = RMT_CHANNEL_3;    config4.clk_div = 4;    config4.gpio_num = GPIO_NUM_37;    config4.mem_block_num = 1;    config4.rmt_mode = RMT_MODE_TX;    config4.tx_config.carrier_en = false;    config4.tx_config.idle_output_en = true;           // 空闲输出打开    config4.tx_config.idle_level = RMT_IDLE_LEVEL_LOW; // 空闲时候为低电平    config4.tx_config.loop_en = false;        rmt_config(&config1);    rmt_config(&config2);    rmt_config(&config3);    rmt_config(&config4);    rmt_driver_install(config1.channel, 0, 0);    rmt_driver_install(config2.channel, 0, 0);    rmt_driver_install(config3.channel, 0, 0);    rmt_driver_install(config4.channel, 0, 0);    rmt_add_channel_to_group(RMT_CHANNEL_0);    rmt_add_channel_to_group(RMT_CHANNEL_1);    rmt_add_channel_to_group(RMT_CHANNEL_2);    rmt_add_channel_to_group(RMT_CHANNEL_3);   static const rmt_item32_t morse_esp[] = {        {{{1, 1, 1, 0}}},        {{{1, 1, 1, 0}}},        {{{1, 1, 1, 0}}},        {{{1, 1, 1, 0}}},        {{{2, 1, 2, 0}}},        {{{2, 1, 2, 0}}},        {{{2, 1, 2, 0}}},        {{{2, 1, 2, 0}}},        {{{2, 1, 2, 0}}},        {{{2, 1, 2, 0}}},        {{{2, 1, 2, 0}}},        {{{2, 1, 2, 0}}},        {{{0, 0, 0, 0}}}};       while (1)      {        ESP_ERROR_CHECK(rmt_write_items(RMT_CHANNEL_0, morse_esp,sizeof(morse_esp) / sizeof(morse_esp[0]), false));        ESP_ERROR_CHECK(rmt_write_items(RMT_CHANNEL_1, morse_esp,sizeof(morse_esp) / sizeof(morse_esp[0]), false));        ESP_ERROR_CHECK(rmt_write_items(RMT_CHANNEL_2, morse_esp,sizeof(morse_esp) / sizeof(morse_esp[0]), false));        ESP_ERROR_CHECK(rmt_write_items(RMT_CHANNEL_3, morse_esp,sizeof(morse_esp) / sizeof(morse_esp[0]), false));        vTaskDelay(1000 / portTICK_PERIOD_MS);        }

                    

回帖(1)

王玉兰

2024-6-6 18:14:39
根据您提供的代码片段,您正在使用ESP32-S3的RMT模块进行多通道发送。您提到有一个通道比别的通道慢20ns。为了解决这个问题,我们需要分析可能的原因并提供解决方案。

1. 检查GPIO配置:确保所有通道使用的GPIO引脚没有其他功能冲突,如其他外设占用或引脚复用。这可能会导致信号传输延迟。

2. 检查RMT配置:确保所有通道的RMT配置相同,包括clk_div、mem_block_num等参数。不同的配置可能会导致信号传输速度不同。

3. 检查信号完整性:在硬件设计中,确保信号传输路径尽可能短且没有过多的噪声干扰。这有助于减少信号传输延迟。

4. 检查代码逻辑:检查您的代码逻辑,确保所有通道的发送操作是同步进行的。如果某个通道的发送操作比其他通道晚开始,可能会导致20ns的延迟。

5. 检查硬件问题:如果以上步骤都无法解决问题,可能是硬件本身的问题。您可以尝试更换ESP32-S3模块或联系硬件供应商寻求帮助。

以下是一些建议的代码优化:

1. 使用RMT初始化函数确保所有通道配置相同:
```c
rmt_config_t config = {
    .channel = RMT_CHANNEL_0,
    .clk_div = 4,
    .gpio_num = GPIO_NUM_40,
    .mem_block_num = 1,
    .rmt_mode = RMT_MODE_TX,
    .tx_config.carrier_en = false,
    // ...其他配置
};

for (int i = 0; i < NUM_CHANNELS; i++) {
    config.channel = i;
    rmt_config(&config);
}
```

2. 使用RMT驱动函数确保所有通道同步发送:
```c
rmt_item32_t item = {
    .duration0 = DURATION,
    .level0 = LEVEL_HIGH,
    .duration1 = DURATION,
    .level1 = LEVEL_LOW,
    // ...其他配置
};

for (int i = 0; i < NUM_CHANNELS; i++) {
    rmt_write_items(i, &item, 1, false);
}
```

通过以上步骤,您可以尝试解决ESP32-S3使用RMT多通道发送时某个通道比其他通道慢20ns的问题。如果问题仍然存在,请考虑检查硬件或联系技术支持。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分