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.

[参考译文] TM4C1290NCPDT:Tiva Micro 上的 UDMA 演示

Guru**** 2539500 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1005939/tm4c1290ncpdt-udma-demo-on-tiva-micro

器件型号:TM4C1290NCPDT
您好:
在 TI 的 UDMA 演示中、乒乓方式用于接收数据(请参阅下面的代码)。 接收变量  g_ui8RxBufA 当前设置为256字节。  我的问题是、当在中断处理程序中设置 UDMA_MODE_STOP 时、当远程端发送的数据小于256字节时、我们如何知道实际接收到的字节?
Dennis
  //
  //检查 DMA 控制表以查看乒乓"A"传输是否为
  //完成。  "A"传输使用接收缓冲器"A"和主缓冲器
  //控制结构。
  //
  ui32Mode = ROM_uDMAChannelModeGet (UDMA_CHANGE_UART1RX | UDMA_PRI_SELECT);
  //
  //如果主控制结构体指示停止,则表示"A"
  //接收缓冲完成。  UDMA 控制器仍应接收
  //将数据输入"B"缓冲区。
  //
  if (ui32Mode = uDMA_MODE_STOP)
  {
    //
    //递增计数器以指示数据已接收到缓冲区 A 中  
    //一个实际应用,此应用将用于向主线程发出信号
    //数据已接收,因此主线程可以处理数据。
    //
    G_ui32RxBufACount++;
    //
    //使用主缓冲区为"A"缓冲区设置下一个传输
    //控制结构。  进入"B"缓冲器的持续接收为时
    //完成,UDMA 控制器将切换回这个。  这种情况
    //示例重复使用缓冲区 A,但更复杂的应用可能
    //使用一组旋转的缓冲区来增加该时间
    //主线程必须先处理缓冲区中的数据,然后再处理
    //重复使用。
    //
    ROM_uDMAChannelTransferSet (UDMA_CHANGE_UART1RX | UDMA_PRI_SELECT、
                  UDMA_MODE_PINGONG、
                  (void *)(UART1_base + UART_O_DR)、
                  g_ui8RxBufA、sizeof (g_ui8RxBufA);
  }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在收到请求的256个字节之前、不会收到带有 UDMA_MODE_STOP 的中断。 如果发送字节的远程单元未发送256字节、则 UDMA 将无限期地等待。 由于这种情况、当事先不知道要接收的字节数时、使用 UDMA 从外设接收是不切实际的。

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

    您好:

    除了从外设传输数据外、您是否更好地使用 uDMA 操作来获取接收数据的实际大小?

    Dennis

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

    当从外设接收到未知数量的字节时、例如当数据包由结束字符或超时定义时、我使用中断、而不是 DMA。 当数据包的长度由数据包早期发送的字节定义时、您可以使用中断、然后在读取长度后通过 DMA 完成数据包读取。

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

    您好:

    我想您说的是、使用中断并从 FIFO 中读取字符、确定数据包的长度、然后切换至 DMS 以获取其余数据?

    您是否有这样做的代码段示例或大纲?

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

    是的、这就是我的建议。 我没有一个示例、因为它非常特定于协议。

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

    您能否描述协议、至少足以识别数据包的大小?

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

    协议如下:

    一个数据包

    <2字节计数><5个保留字节> <2字节校验和>

    注:客户端可以发送上述格式的一系列数据包。 如您所见、固定大小 DMA 操作对于确定接收到的数据并不实用。

    您是否有代码段的大纲、说明如何执行前面建议的混合解决方案?

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

    好的、让我来处理它。 计划是在接收4个字符后将 UART1 FIFO 设置为中断。 然后、中断例程将读取命令和数据包长度。 它将设置 UDMA 以读取数据包的其余部分。 使用16x8 FIFO 时、中断响应和设置 DMA 的接收时间将为12个字符。  

    数据的波特率是多少? UART 上是否有任何硬件流控制?

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

    您好:

    波特率为115200、无硬流控制。  但是、我们确实使用 RTS 和 CTS 进行流量控制。

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

    这是基本流程。

    1) 1)设置 UART 以使用 FIFO 并在接收4个字符后中断。 还应将 UDMA 设置为执行基本传输、但尚未启用 UDMA 通道。

    2) 2)在 UART 中断例程中、从 FIFO 读取前三个字符。 从第二个和第三个字符中、确定剩余字符数。 禁用 UART RX 中断、完成 UDMA 初始化设置传输大小、启用 UDMA 通道并启用 UART RX DMA 中断。

    3) 3)第二次进入 UART 中断例程时、整个数据包应该已经被接收。 现在、您可以重新启用 UART RX 中断以准备接收下一条命令。 您可以使用静态枚举来跟踪 中断是用于接收命令还是用于完成数据包。

    基本上、为每个接收到的数据包执行 UART RX 中断例程两次。 使用 RTS 和 CTS 控制数据流应该不会影响中断延迟。 如果中断的执行时间必须保持在绝对的最小值、您可以嵌入来自 TivaWare 函数的源代码、而不是调用它们。 通常、您可以优化应用程序的代码、从而节省呼叫/返回时间。

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

    尊敬的 Bob:

    在建议的大纲中、如果逻辑检索错误的数据长度(出于任何原因)、DMA 操作将被冻结、并且永远不会获得预期的数据长度。

    是否有一个捕捉或处理逻辑来解决两个器件之间的数据通信中可能发生的这种类型的错误?

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

    尊敬的 Dennis:

    为了处理外设接收到的数据少于 UDMA 预期的情况、您需要使用一个计时器、该计时器将根据预期的数据量中断。 如果定时器在 DMA 事务完成之前超时、则必须假定数据包无效。 您可以通过禁用通道来中止 UDMA 传输。 然后、您将重新初始化 UDMA 传输、并且您必须有一些机制来告知源重新传输数据包。

    在第一个 UART 中断例程中、您设置并启动 UDMA、然后设置并启动计时器。 如果第二个 UART 中断首先发生、(接收到正确数量的数据)您将禁用计时器。 如果定时器中断首先发生(接收到的数据不够)、则禁用 UDMA 通道、然后通知源重新启动数据包传输。

    超时周期的精确度取决于传输源的可预测性。 如果您轮询 UART 或仅使用 UART 中断、您实际上会遇到相同的问题。  正是由于 DMA、您在数据包时间上超时、而不是单个字节。