Part Number:CC3235MODSFOther Parts Discussed in Thread: CC3200, CC3200MOD
CC3235MODSF开发板,SPI采用master模式,数据宽度两个字节,发射和接收通道都连接上DMA,双DMA通道,用的tirtos系统上跑WIFI-AP模式,调用sl_Recv接收上位机数据通过DMA到SPI发射出去,SPI DMA接收到的数据通过sl_Send发送到上位机。问题来了,当我发送和接收的数据包很小的时候没有问题,整个过程很流畅,当数据增大到1460字节一个包(DMA大小设置为1460字节),SPI发射没问题,但是SPI RX DMA接收了一包1460然后调用sl_Send发送过后就卡死了,程序卡死在等待第二包1460接收上,第二次触发SPI-RX-DMA没有反应,SPI没有工作卡死了,经过测试只要不调用sl_Send,SPI RX DMA 就能流畅工作,sl_Send函数是阻塞等待的,意思是我在保证sl_Send发送完1460字节后再启动调用SPI RX DMA ,结果还是卡死了。同样的代码放在CC3200开发板上就没问题,CC3200开发板上用的freertos系统,到底是什么原因呢?
Nick Sun:
您好,
感谢您的对TI产品的关注!为更加有效地解决您的问题,我需要多一些时间查看这个问题,稍后会为您解答。
,
HS:
用的TCP socket,发送的sl_Send函数有大小要求吗,为什么发送小包几十个字节就没问题,发送一千个字节或几百个字节就卡死了,SPI的下一次DMA接收就不工作了
,
HS:
我发现论坛里有和我一样问题的人,但是都没看到解决方案,这是新一代产品的BUG吗,还是tirtos系统的BUG
,
Nick Sun:
您好,
我需要更多说明。 sl_send 和 sl_recv 是 WiFi 命令。您是说这些数据是通过 WiFi 发送到主机还是通过 SPI 硬连线?
你能否提供一下问题部分的示例代码,以便我可以调试它并了解发生了什么?
,
HS:
SPI硬连接的是另一个设备,CC3235做主;然后建立了一个TCP socket,用到了SimpleLink,CC3235做AP;实现的功能就是循环接收SPI数据通过 sl_send给站点发过去,站点是电脑上的网络调试工具;然后遇到的BUG就是我上面所述的
,
Nick Sun:
您好,
为了更好解决您的问题,已帮您升级到E2E英文论坛由专业英文工程师帮您解决。
感谢您的支持。
,
HS:
经过我试验,验证了一个问题,SPI函数SPI_transfer();和sl_Send();函数不能同时工作,我把这两个函数放在两个线程调用就会卡死,spi就会没有原因的停止工作;如果把这两个函数放在一个线程,阻塞等待sl_Send();返回后再执行SPI_transfer();这样就完全没问题。这会不会是一个BUG啊,看文档秒速sl_Send();阻塞的时候是在通过内部的SPI与NWK通信,在这期间如果使用SPI_transfer();调用了DMA,就直接死了啊,系统线程没有死,就死在SPI一直不能启动了。能不能帮忙想想到底是为什么啊,你们也试试我上述操作。
,
HS:
还有一个很重要的实验结论,同样的操作我用CC3200MOD这款芯片实现就不会出现这种问题,SPI_transfer();和sl_Send();可以同事工作,是因为CC3200老一代芯片内部与NWK通信方式不一样的原因吗,因为CC3200没有内部SPI总线 (LSPI)
,
HS:
找到原因了,外设GSPI的DMA通道号不能比LSPI的DMA通道号低,主要还是一次性DMA长度太长了,导致sl_Send函数使用LSPI时直接把GSPI的DMA停掉了,GSPI的DMA通道得用比LSPI高优先级的通道6和7通道,之前默认用的30和31,这个设定太隐蔽了,花了我好长时间找问题,也是很费劲。
,
Nick Sun:
您好,
很高兴您的问题能被解决,也感谢您的分享这个问题供大家参考学习。
感谢您的支持。