我遇到了一个我无法解决的问题,而且我的想法也用完了……
我正在使用带有 ESP32Wrover 模块的独特硬件。我正在使用带有 arduino 和 idf 框架的 Platformio,platformio 5.3.0 版本(Arduino v2.0.6 和 ESP-IDF 到 v4.4.3)。
需要实现以下功能:
1. 具有网络服务器功能的以太网
2. 具有 20MHz SPI 时钟的时间关键型 SPI 测量、x4 突发测量、片选扩展、18us 周期。阅读必须是连续的。
3. 两通道PWM信号~8kHz频率启用100ms禁用900ms(用MCPWM实现)
所有功能都已单独实现并运行良好。为了进行确定性操作,我将所有与测量相关的内容分配给核心 1上的中断被禁用,core1 上的看门狗被禁用,delay() 函数从未被调用,所有函数和变量都在 RAM 中(使用 DMA_ATTR 和 IRAM_ATTR 属性)。
core0 做以太网的事情,core1 做测量。Core1 具有用于过滤测量数据的附加算法。但是,如果 SPI 测量正在运行或 PWM 信号在输出端处于活动状态,以太网就会断开(设备无法获取 IP 地址,并且会反复连接/断开连接)。如果禁用 SPI 测量和 MCPWM,则以太网可以正常工作。
如果我在 core1 上使用以下代码,并定期调用它:
代码:
全选
SPI2->data_buf[0] = *txBuf;
// Start transfer
spi_ll_master_user_start(SPI2);
while (SPI2->cmd.usr); // Wait for SPI bus ready
*rxBuf = (uint16_t) SPI2->data_buf[0];
以太网坏了。或者,如果我只是定期调用 spi_ll_master_user_start() 函数并等待 SPI2->cmd.usr,而不打扰 data_buf[],我仍然会损坏以太网操作...如果我从 core1 中删除此代码,则以太网可以正常工作。
可能是什么问题?