TI中文支持网
TI专业的中文技术问题咨询交流网站

TDA4VM: SPI使用DMA传输时调用mcal里的Spi.c的Spi_setupEB出错

Part Number:TDA4VM

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吗?

Cherry Zhou:

您好,我们已收到您的问题并升级到英文论坛寻求帮助,链接如下,如有答复将尽快回复您。谢谢!

e2e.ti.com/…/tda4vm-spi_setupeb-error

,

Cherry Zhou:

bingxian lu 说:,但是在使用DMA传输之后,我们设置数据长度为8是出问题的,我想请问,SPI在使用DMA传输的情况下Spi_setupEB只能设置数据长度为32吗?

您好,是的,启用 DMA 时, SPI 只能使用 32 的数据长度或 32 的倍数 (32*2 、 32*3 等)。 这是驱动程序施加的限制。 如果您要传输的数据少于 32,那么则需要在未启用 DMA 的情况下进行传输。

,

bingxian lu:

您好,请问我们在使用DMA传输时,用Spi_setupEB把数据长度设置为大于32(64、96、128)的数值,用示波器和逻辑分析仪发现SPI的波形没有了。只有数据长度设置为32是正常的,这是为什么?

,

bingxian lu:

 追加两个问题,

1、参考例子给的TXBuf和RXBuf放在.bss段的作用是什么?能否不这样修饰TXBuf和RXBuf,直接使用局部变量?

2、参考例子给的把TXBuf、RXBuf用SpiApp_wbCache来修饰有什么作用?可不可以去掉这部分?

,

Cherry Zhou:

跟进给英文论坛的工程师了哈,该条线回复时间相对较长,您也可以自行查看英文论坛工程师的答复,敬请谅解。

,

bingxian lu:

好的  谢谢你

,

Cherry Zhou:

bingxian lu 说:参考例子给的把TXBuf、RXBuf用SpiApp_wbCache来修饰有什么作用?可不可以去掉这部分?

wbCache 调用高速缓存写回函数,关于该函数有以下说明:

/*66 * Writes back the range of memory within the specified starting address67 * and byte count. The range of addresses operated on gets quantized to68 * 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 data70 * 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 data72 * within the range in L2 cache will be written back to external73 */

使用 DMA 时可能需要这一点,工程师这边再和 MCAL 团队确认下。

,

bingxian lu:

那边只回复了一个问题,问的其他问题那边还需要再确认吗?

,

Cherry Zhou:

应该是的,我一起确认下哈。

,

bingxian lu:

好的  麻烦您了

,

Cherry Zhou:

您好是的哈,三个问题工程师都需要确认下。

,

Cherry Zhou:

您好,第二个问题的答复如下:

BSS 部分可以保留存储,但无法初始化。 在 .data 部分,您可以保留存储并将其设置为初始值。 在 .bss 部分中,您无法设置初始值。 对缓冲器来说很有用,因为我们不需要对其进行初始化,只需要保留存储空间。

,

bingxian lu:

好的,谢谢您,剩下的问题麻烦再帮我们跟进一下,我们的项目目前在优化阶段,SPI DMA这部分挺重要的,特别是不能发送大于32个字节的问题(问题1)。麻烦您了

,

Cherry Zhou:

没问题哈,跟进给工程师了,有答复会尽快给到您。

,

Cherry Zhou:

您好,

抱歉回复晚了,其他两个问题的答复如下:

– 为什么需要对缓冲器的高速缓存进行write back?

– 由于 R5 内核不是Cache Coherent一致,因此如果 R5 写入缓冲区,则需要Cache Write back。 同样,在读取缓冲区应用程序之前,需要使这些缓冲区无效。

-为什么需要在 TX 和 RX 缓冲器上使用 wbCache () ?

-因为 R5F 内核和 DMA 引擎都将使用这些缓冲器。

此外,我们正在研究 >32 位 DMA 传输,看下有没有与您相同的问题。请问您是都有任何为了启用更高的 DMA 传输 (例如 64 bit DMA 传输) 而必须进行的修改示例?

,

bingxian lu:

谢谢您的回复。

我们现在传输最大的数据是70多个,按照TI之前回复的意思是DMA传输可以传输32的倍数,我们设置传输缓冲的时候设置了96,如图所示

此时SPI是无作用的,并没有消息发送出来。同样的代码,设置缓冲区为32就可以正常发送。

目前我们暂时的解决办法是把SPI的CS设置成普通IO,发送70个字节数据的时候分3次发送,一次发送32个字节,这样可以暂时解决我们SPI DMA的需求。但是我觉得不能通过MCAL的函数接口一次性发送大于32个字节是有问题的。所以希望TI验证一下这个问题,给我们解答一下。

,

Cherry Zhou:

好的我们再向工程师团队确认下哈。

,

bingxian lu:

您好,请问一下上次问的问题外国友人那边有消息了吗?能帮忙催一下吗?都过去差不多一个月了呢

,

Cherry Zhou:

抱歉给您带来的不便,我们这边先催下工程师,如果下周一还没给到答复,我们会再发邮件催促下,再次抱歉。

,

bingxian lu:

您好,请问该问题有新进展吗?

,

Cherry Zhou:

抱歉暂时还没有,我们这边再跟进看下,给您带来的不便敬请谅解!

,

Cherry Zhou:

您好,

我们的开发人员现在卡在了code patch这里,所以目前还无法reproduce此问题。 不知道您能否帮忙提供下code patch?

,

bingxian lu:

我们只是把CS复用成GPIO然后分几次发送而已,

其他的没什么改变,我们现在想确认的是在DMA传输下,Spi_setupEB是不是只能支持设置大小为32?还是 32 的倍数 (32*2 、 32*3 等)都可以?

,

Cherry Zhou:

好的我们向工程师确认下哈。

赞(0)
未经允许不得转载:TI中文支持网 » TDA4VM: SPI使用DMA传输时调用mcal里的Spi.c的Spi_setupEB出错
分享到: 更多 (0)