乐鑫技术交流
直播中

klysa

13年用户 1294经验值
私信 关注
[问答]

关于以太网+时间关键的SPI+MCPWM问题求解

我遇到了一个我无法解决的问题,而且我的想法也用完了……

我正在使用带有 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 中删除此代码,则以太网可以正常工作。

可能是什么问题?


回帖(1)

戚來麒

2023-3-2 09:49:13
SPI 是否与以太网 mac 共享任何资源?核心1是否保留了任何导致故障的内部总线?
举报

更多回帖

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