Cod*_*odo 5 microcontroller spi freertos esp32
使用ESP-IDF(ESP32 SDK)的ESP32应用程序与同一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 = 0x0c和初始化size = 0x0c.0x0c是12个字节,即10个字节四舍五入到下一个字.
在交易结束时,值为length = 0x07和size = 0x0c(长度可能略有不同).因此,事务只读取7个字节,然后以某种方式终止.或者更确切地说DMA操作终止.
代码非常简单:
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);
Run Code Online (Sandbox Code Playgroud)
似乎在SPI 从设备驱动程序文档\xe2\x80\x93 中发现的以下警告\xe2\x80\x93 也适用于从从设备接收数据的 SPI 主设备:]
\n\n\n\n\n警告:由于 ESP32 的设计特性,如果主设备发送的字节数或从设备驱动程序中传输队列的长度(以字节为单位)不大于 8 且可被整除第四,SPI 硬件可能无法将最后 1 到 7 个字节写入接收缓冲区。
\n
我现在已经将发送方更改为发送至少 12 个字节和 4 的倍数,问题就消失了。
\n\n如果您认为它只是因为运气而起作用并且我的假设是错误的,请现在告诉我。
\n