乐鑫技术交流
直播中

李泽明

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

如何让ESP32在SPI总线上充当从设备呢?

我一直在尝试让 ESP32 在我设计的 SPI 总线上充当从设备。总线目前也被串行闪存设备占用(当然是单独的片选信号)。我倾注了所有文档、勘误表和示例代码来实现此功能。我相信我已经正确配置了 SPI3 外围设备,包括将所有缓冲区放置在支持 DMA 的内存中并利用默认外围引脚位置来确保可靠的吞吐量,但我看到了一些奇怪的行为。
如果我在没有尝试访问其他串行闪存设备的情况下操作 SPI 总线,ESP32 似乎会按预期做出响应。但是,如果我完全访问串行闪存设备,则无法实现 ESP32 SPI 外设的正常运行。
我注意到的第一件事是,当 ESP32 的芯片选择未激活时,它似乎正在驱动 MISO 引脚(总线访问旨在用于串行闪存)。这是硬件的根本故障……搜索论坛没有发现任何其他关于此的投诉,所以我想知道是否其他用户正在使用专用总线进行 SPI 通信
其次,我注意到当总线流量为 100% 串行闪存事务(ESP32 的芯片选择未激活)时,我的传输后回调在 8192 个时钟(1024 字节)后被触发。如果我简单地执行串行闪存内容的读取(串行闪存的内容非零),我可以复制这种现象。传输后回调正在接收 spi_slave_transaction_t 结构信息,指示总数据长度为 8192 位,交易数据长度为 8192 位,但 rx_buffer 指针指向的数据大部分为零,不代表 SPI 总线数据串行闪存。后来我确定数据中包含一些反映尝试访问的闪存地址的内容。
在实验中,我从串行闪存中读取 128 字节的数据块,从地址 0x00000000 开始。如果我执行其中的八个操作(从闪存中读取总共 1024 个字节),我将在事务后回调中获得一致的数据内容。来自我的代码的此数据的诊断转储揭示了似乎是数据中出现的增量地址的证据。触发的事件似乎总是以 0x03000000 开头,后跟值 0x03000080、0x03000100、0x03000180、0x03000200、0x03000280、0x03000300 和 0x03000380。这些地址值与主机在每次读取 128 字节时尝试访问的基地址相关联。从我的诊断代码中捕获的第一块数据如下所示。
这可能是硬件内部正在做什么的线索吗?
在多从总线配置上运行时,任何人都可以证实这种行为吗?
有什么解决方法吗?
代码:
  • SPI3 长度:8192,传输长度:8192,pTx:1073539608,pRx:1073543708,RxData:
  • 03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

回帖(2)

李英健

2023-3-1 16:55:16
rx 缓冲区中报告的数据确实与来自总线的 MOSI 数据相关……我错误地期望数据跟踪 MISO 信息(来自串行闪存的数据)而不是主机发送的数据。

举报

李丽波

2023-3-1 16:55:23
首先,您确定 ESP32 的 CS 引脚确实保持高电平吗?如果有疑问,你能把它硬连线到高水平吗?其次,您是否能够发布您的代码,或者最好是将版本削减到显示问题的最低限度?
举报

更多回帖

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