This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
TI的大神,您好:
我们在调试SPI DMA时遇到个问题,在调用Spi_setupEB时返回值是E_NOT_OK,经查验发现是在使用SPI DMA传输的时候mcal里的Spi.c的Spi_setupEB函数加了个过滤条件,如下图
该处注释显示在使用SPI DMA时Spi_setupEB设置的数据长度只能是32,我们设置的长度是8,如下图
在未使用DMA传输时我们设置数据长度为8是没问题的,但是在使用DMA传输之后,我们设置数据长度为8是出问题的,我想请问,SPI在使用DMA传输的情况下Spi_setupEB只能设置数据长度为32吗?
,但是在使用DMA传输之后,我们设置数据长度为8是出问题的,我想请问,SPI在使用DMA传输的情况下Spi_setupEB只能设置数据长度为32吗?
您好,是的,启用 DMA 时, SPI 只能使用 32 的数据长度或 32 的倍数 (32*2 、 32*3 等)。 这是驱动程序施加的限制。 如果您要传输的数据少于 32,那么则需要在未启用 DMA 的情况下进行传输。
您好,请问我们在使用DMA传输时,用Spi_setupEB把数据长度设置为大于32(64、96、128)的数值,用示波器和逻辑分析仪发现SPI的波形没有了。只有数据长度设置为32是正常的,这是为什么?
追加两个问题,
1、参考例子给的TXBuf和RXBuf放在.bss段的作用是什么?能否不这样修饰TXBuf和RXBuf,直接使用局部变量?
2、参考例子给的把TXBuf、RXBuf用SpiApp_wbCache来修饰有什么作用?可不可以去掉这部分?
参考例子给的把TXBuf、RXBuf用SpiApp_wbCache来修饰有什么作用?可不可以去掉这部分?
wbCache 调用高速缓存写回函数,关于该函数有以下说明:
/*
66 * Writes back the range of memory within the specified starting address
67 * and byte count. The range of addresses operated on gets quantized to
68 * whole cache lines in each cache. There is no effect on L1P cache.
69 * All cache lines within the range are left valid in L1D cache and the data
70 * within the range in L1D cache will be written back to L2 or external.
71 * All cache lines within the range are left valid in L2 cache and the data
72 * within the range in L2 cache will be written back to external
73 */
使用 DMA 时可能需要这一点,工程师这边再和 MCAL 团队确认下。
您好,第二个问题的答复如下:
BSS 部分可以保留存储,但无法初始化。 在 .data 部分,您可以保留存储并将其设置为初始值。 在 .bss 部分中,您无法设置初始值。 对缓冲器来说很有用,因为我们不需要对其进行初始化,只需要保留存储空间。
您好,
抱歉回复晚了,其他两个问题的答复如下:
- 为什么需要对缓冲器的高速缓存进行write back?
- 由于 R5 内核不是Cache Coherent一致,因此如果 R5 写入缓冲区,则需要Cache Write back。 同样,在读取缓冲区应用程序之前,需要使这些缓冲区无效。
-为什么需要在 TX 和 RX 缓冲器上使用 wbCache () ?
-因为 R5F 内核和 DMA 引擎都将使用这些缓冲器。
此外,我们正在研究 >32 位 DMA 传输,看下有没有与您相同的问题。请问您是都有任何为了启用更高的 DMA 传输 (例如 64 bit DMA 传输) 而必须进行的修改示例?
谢谢您的回复。
我们现在传输最大的数据是70多个,按照TI之前回复的意思是DMA传输可以传输32的倍数,我们设置传输缓冲的时候设置了96,如图所示
此时SPI是无作用的,并没有消息发送出来。同样的代码,设置缓冲区为32就可以正常发送。
目前我们暂时的解决办法是把SPI的CS设置成普通IO,发送70个字节数据的时候分3次发送,一次发送32个字节,这样可以暂时解决我们SPI DMA的需求。但是我觉得不能通过MCAL的函数接口一次性发送大于32个字节是有问题的。所以希望TI验证一下这个问题,给我们解答一下。
我们只是把CS复用成GPIO然后分几次发送而已,
其他的没什么改变,我们现在想确认的是在DMA传输下,Spi_setupEB是不是只能支持设置大小为32?还是 32 的倍数 (32*2 、 32*3 等)都可以?