乐鑫技术交流
直播中

王强

7年用户 1268经验值
私信 关注
[问答]

请问如何增加ESP32-S2以太网SPI接口的CS建立时间?

详细描述,请参考:https://blog.csdn.net/weichushun/articl ... /123128016


如何增加ESP32-S2 以太网SPI接口的CS建立时间?
(1)        问题现象:
偶尔出现_[0;31mE (6321) dm9051.mac: buffer size too small, needs 16444_[。只有降低SPI频率到20MHz才ok。
(2)        问题分析:
通过示波器测量,发现DM9051的cs建立时间和保持时间很紧张,其它信号质量和时序ok,需要增加cs的建立时间和保持时间来试试。

(3)        问题解决:
根据esp32-s2_technical_reference_manual_cn.pdf,



实际测试时发现spi_device_interface_config_t结构体.cs_ena_pretrans不能大于0,否则系统反复重启。


Spi_master.h文件spi_device_interface_config_t
uint16_t cs_ena_pretrans;        ///< Amount of SPI bit-cycles the cs should be activated before the transmission (0-16). This only works on half-duplex transactions.
uint8_t cs_ena_posttrans;       ///< Amount of SPI bit-cycles the cs should stay active after the transmission (0-16)

cs_ena_pretrans—确实有限制,是什么原因导致的?SPI总线接口本身是没有这个限制的,我们用其它单片机试过DM9051的SPI跑40MHz没任何问题。

请问如何使能SPI_CS_SETUP,实现增加CS的建立时间?
                                                                                                                                                                                                                                                                                                                                                                                          

回帖(1)

王霞

2024-6-18 16:25:57
要增加ESP32-S2以太网SPI接口的CS(Chip Select)建立时间,可以按照以下步骤进行操作:

1. **理解问题**:首先,我们需要理解问题的本质。根据你提供的信息,DM9051以太网芯片的CS信号建立时间和保持时间可能不足以满足其正常工作要求,导致偶尔出现缓冲区大小不足的错误。

2. **修改SPI配置**:ESP32-S2的SPI接口可以通过修改SPI配置来调整CS信号的建立时间和保持时间。这通常涉及到修改SPI的时序参数。

3. **查找相关文档**:在进行修改之前,需要查阅ESP32-S2的官方文档,了解如何调整SPI时序参数。这通常涉及到修改SPI的初始化代码。

4. **修改SPI初始化代码**:在ESP-IDF框架中,你可以通过修改`spi_device_interface_config_t`结构体中的`pre_cb`(预处理回调函数)来实现自定义的CS信号处理。例如:

   ```c
   spi_device_interface_config_t devcfg = {
       .command_bits = 0,
       .address_bits = 0,
       .dummy_bits = 0,
       .clock_speed_hz = 10 * 1000 * 1000, // 调整SPI时钟频率
       .duty_cycle_pos = 0,
       .cs_ena_pretrans = 2, // 增加CS建立时间
       .cs_ena_posttrans = 2, // 增加CS保持时间
       .input_delay_ns = 0,
       .flags = SPI_DEVICE_NO_DUMMY,
       .queue_size = 7,
       .pre_cb = my_pre_cb, // 自定义预处理回调函数
       .post_cb = 0,
   };
   ```

5. **自定义预处理回调函数**:在`my_pre_cb`函数中,你可以实现自定义的CS信号处理逻辑,例如通过延时来增加CS的建立时间和保持时间。

   ```c
   void my_pre_cb(spi_transaction_t *t) {
       // 这里可以添加延时函数,例如:
       vTaskDelay(pdMS_TO_TICKS(10)); // 延时10ms
   }
   ```

6. **测试和验证**:修改完SPI配置后,需要重新编译并烧录到ESP32-S2上,然后进行测试以验证是否解决了问题。

7. **调整和优化**:如果问题仍然存在,可能需要进一步调整SPI时序参数或尝试其他解决方案。

请注意,以上步骤仅供参考,具体实现可能因项目和硬件配置的不同而有所差异。在进行修改时,请确保遵循ESP32-S2的官方文档和规范。
举报

更多回帖

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