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.

[参考译文] CCS/LAUNCHCC3220MODASF:CCS/LAUNCHCC 3220 MODASF:SPI + DMA 发送的字节不能超过2047字节

Guru**** 2589300 points
Other Parts Discussed in Thread: MSP430FR6989

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/760971/ccs-launchcc3220modasf-ccs-launchcc-3220-modasf-spi-dma-can-not-send-more-than-2047-bytes

器件型号:LAUNCHCC3220MODASF
主题中讨论的其他器件:MSP430FR6989

工具/软件:Code Composer Studio

你好
我正在使用 CCS/LAUNCHCC 3220 MODASF:从模式下的 SPI + DMA。 主器件是 MSP430FR6989。
通常(10到20字节)的数据通信是舒适的。
但是、当我尝试从器件发送50K 字节的数据时、我意识到从一开始只能发送2047字节。
导致此限制的原因是什么?
是否有办法避免这种情况?
该 SDK 是 simplelink_cc32xx_sdk_2_30_00_05。
我将随附我的代码。

/*
*==== transferCompleteFxn ===
* SPI_TRANSFCTION ()的回调函数。
*
空 transferCompleteFxn (SPI_Handle handle、SPI_Transaction *事务)

SEM_post (&slaveSpiSem);//进行从属保存

/*
*==== slaveThread ====
*从器件 SPI 在同时接收消息的同时向主器件发送消息
来自主设备的*消息。
*
void * slaveThread (void * arg0)

SPI_Handle slaveSpi;

状态= SEM_INIT (&slaveSpiSem、0、0);
if (status!= 0){
UART_PRINT ("创建 slaveSem\n"时出错);

while (1);

SPI_Params_init (&spiParams);
spiParams.frameFormat = SPI_POL0_PHA1;
spiParams.mode = SPI_SLAVE;
spiParams.transferCallbackFxn = transferCompleteFxn;
spiParams.transferMode = SPI_MODE_CALLACK;

slaveSpi = SPI_open (Board_SPI_slave、&spiParams);

transaction.count = i;//i=49304

transaction.txBuf =(void *) gnDataBytePoint;
transaction.rxBuf =(void *) gsCmdRcvBuffer;

/*
*设置 SPI 传输;Board_SPI_SLAVE_READY 将设置为通知
*主设备从设备就绪。
*
transferOK = SPI_transfer (slaveSpi、事务);
usleep(1000);  
GPIO_WRITE (Board_SPI_MASTER_READY、1);//重置设置
if (transferOK){
/*等待传输完成*/
SEM_WAIT (&slaveSpiSem);//从 DMA 回调

谢谢你。

H.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、H.Wt、

    执行大传输时、SPI 驱动程序会将传输拆分为1024字块。 您的 SPI 传输是否总是在字节2047时失败? 在这种情况下、当驱动程序执行第3个1024字块的传输时、由于某种原因无法启动该传输。

    您在 CC3220和您正在使用的 MSP430之间是否有任何流控制机制? 我看到您在开始时切换 GPIO、以向主器件发出信号、通知其应开始传输、 但是、如果主器件持续发送数据、则主器件可能会在 SPI DMA 缓冲器交换过程中禁用 CC3220上的从器件 SPI 的这段时间内发送数据。 驱动程序能够处理大小超过1024字节的传输、但您需要记住重新加载 DMA 缓冲区所需的时间。

    此致、
    Michael
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Michael 先生

    感谢您的回答。

    数据传输方向从器件(cc 3220)发送到主器件(MSP 430)。 它不仅指向从器件侧 DMA 传输的传输指针吗?
    是否有事件触发器需要知道 DMA 缓冲器何时被重新加载?
    现在、主器件侧已确认接收到的数据、就在接收到2048字节正确数据后、在1个 NULL (0)字节后为剩余字节插入了0 x 5 B。
    此外、我尝试从主器件执行大约2048字节的时钟输出、但结果是相同的。

    谢谢你。
    H.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    按照建议、将传输单元设置为2047字节
    我尝试过、但无法检测到 DMA 的结束。
    最终、1023字节的传输成功、并且检测到结束。
    在串行线路上可以看到高达2047字节的传输、因此我希望我能够检测这里的 DMA 结束。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、H.Wt、

    您可以尝试的一个实验是以1024字节的块来中断您的 cc3220到 MSP430的传输。 在8位 SPI 模式中、1024字节是适合一个 DMA 传输请求的最大传输大小。 如果使用1024字节块传输50K 数据、则可能需要查看 SPI 驱动器存在一些问题。 如果即使将传输削减为1024字节数据块也不起作用、则需要对应用/MSP430方面进行更多研究。

    此外、您能否澄清"插入0 x 5 B"的含义?

    此致、
    Michael
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好
    Michael 先生
    很抱歉耽误你的回答。
    通过每1023个字节传输一次、处理可以顺利完成。
    在该处理单元中实施该程序。
    感谢您的建议。
    H.