首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SPI事务提前终止- ESP-IDF

SPI事务提前终止- ESP-IDF
EN

Stack Overflow用户
提问于 2018-03-18 13:08:30
回答 1查看 1.7K关注 0票数 8

一个使用ESP32的ESP32应用程序(ESP32 SDK)在同一个SPI总线上与两个SPI从站通信(ILI9341 TFT驱动程序,NRF24L01+ RF收发器)。总的来说,它工作得很好。然而,从RF收发信机接收的一些数据被截断,即只有前几个字节是正确的,其余的是垃圾。

该问题或多或少是可重复的,并且只有在紧接接收截断数据之前与另一个从站(TFT驱动程序)进行SPI通信时才会发生。

有问题的SPI事务是一个全双工事务,它在接收10个字节的同时发送命令字节和10个虚拟字节。它使用VSPI总线和DMA通道1。如果出现问题,只有前几个字节是正确的,而最后的2到6个字节是无效的(0或虚拟字节的值)。

我深入研究了SDK代码(spi_master.c),添加了调试代码,并在DMA的lldesc_t结构中观察到了一个令人惊讶的值:

在事务开始时,使用length = 0x0csize = 0x0c初始化它。0x0c是12个字节,即10个字节四舍五入到下一个单词。

在事务端,值为length = 0x07size = 0x0c (长度可能略有变化)。因此,事务只读取7个字节,然后以某种方式终止。或者更确切地说,DMA操作终止。

  • 您是否同意数据显示提前终止?
  • 提前终止的原因是什么?
  • 是否有一些登记册可以指出问题的原因?

代码非常简单:

代码语言:javascript
复制
uint8_t* buffer = heap_caps_malloc(32, MALLOC_CAP_DMA);

...

memset(buffer, CMD_NOP, len);
spi_transaction_t trx;
memset(&trx, 0, sizeof(spi_transaction_t));
trx.cmd = 0x61;
trx.tx_buffer = buffer;
trx.length = 8 * 10;
trx.rx_buffer = buffer;
trx.rxlength = 8 * 10;

esp_err_t ret = spi_device_transmit(spi_device, &trx);
EN

回答 1

Stack Overflow用户

发布于 2018-03-25 11:52:26

似乎以下警告--在SPI从驱动程序文档中找到--也适用于从中接收数据的SPI主机:]

警告:由于ESP32中的设计特性,如果主程序发送的字节数或从驱动程序中传输队列的长度(以字节为单位)不大于8,并且可除以4,则SPI硬件可能无法将最后一到七个字节写入接收缓冲区。

我现在已经将发送方更改为发送至少12个字节和4的倍数,问题就解决了。

如果你认为这仅仅是因为运气,而我的假设是错误的,那就让我来看看吧。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49348228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档