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.

SPI通信下的DMA

SPI数据帧定义为:起始符(4byte)+数据类型(1byte)+数据长度(2byte)+数据+结束符。接收数据时需要先判断起始符是否正确。DMA触发源选择URXIFG时,先判断起始符,再根据数据长度设置DMAxSZ,中间的耗时会影响之后的数据接收。请问有什么其他解决方案呢?

  • SPI DAM 先设置长度为4,中断后判断起始符,确认后然后再设置DMA长度为3,中断后读数据长度,再设置DMA长度,再中断。

    中间都为低功耗模式,可能没有比较好的方案。

  •    这个要看具体情况了,不同的情况,处理也不一样.如果楼主确实为这个所困扰,有个方法可以试一下,就是用2个MDA来做个切换。一下仅供参考,楼主要分析自己的系统看是否适合。

    1. 从楼主的帧格式分析,帧头部分(起始位[4] + 数据类型[1]+数据长度[2])的长度是固定的,可以为这个设置一个DMA操作。

    2. DMA结束后,先直接把数据长度数据长度[2])作为DMA的处理长度,然后在判断帧头数据是否符合协议要求,如果不符合,则关闭DMA。如果符合,则继续操作。

    3. 如果楼主要根据数据类型做分支保存接收到的数据,建议先开启一个BUFF,作为公共接收取,判断数据接收完成后在

    分派到各个数据区。

    4. 如果楼主系统不能按照这个来做,就只有降低spi 速率或增加字间距,为处理留足够的时间.

       我们在进行通信时一般都会遇到类似的问题,如果我们严格按照协议的要求,一步一步操作,往往会因为时间冲突造成数据丢失。所以,在分析系统之前,先就要分析字间距和处理时间,然后找出一个合理的时间分配来处理。

  • Triton Zhang 说:

       这个要看具体情况了,不同的情况,处理也不一样.如果楼主确实为这个所困扰,有个方法可以试一下,就是用2个MDA来做个切换。一下仅供参考,楼主要分析自己的系统看是否适合。

    1. 从楼主的帧格式分析,帧头部分(起始位[4] + 数据类型[1]+数据长度[2])的长度是固定的,可以为这个设置一个DMA操作。

    2. DMA结束后,先直接把数据长度数据长度[2])作为DMA的处理长度,然后在判断帧头数据是否符合协议要求,如果不符合,则关闭DMA。如果符合,则继续操作。

    3. 如果楼主要根据数据类型做分支保存接收到的数据,建议先开启一个BUFF,作为公共接收取,判断数据接收完成后在

    分派到各个数据区。

    4. 如果楼主系统不能按照这个来做,就只有降低spi 速率或增加字间距,为处理留足够的时间.

       我们在进行通信时一般都会遇到类似的问题,如果我们严格按照协议的要求,一步一步操作,往往会因为时间冲突造成数据丢失。所以,在分析系统之前,先就要分析字间距和处理时间,然后找出一个合理的时间分配来处理。

    1.“然后在判断帧头数据是否符合协议要求,如果不符合,则关闭DMA。如果符合,则继续操作”,a),DMA1收到帧头以后,启动DMA2?b),在何处判断帧头?关闭DMA是指DMA1吗?

     

     2.拟采用外加一个触发信号,从机正确接收到帧头后发送触发信号,主机接收到以后回复从机一个字节(0x66)以产生时钟,从机接收到此字节(0x66)后发送给主机0x55,主机收到0x55后开始发送数据。过程稍繁琐。对于近乎周期性的数据发送此方案如何?