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.

[参考译文] MSP432P401R:UART DMA 以48kHz 的频率发送样本

Guru**** 2769415 points

Other Parts Discussed in Thread: PCM2903C

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/705926/msp432p401r-uart-dma-send-samples-at-48khz

器件型号:MSP432P401R
主题中讨论的其他器件:PCM2903C

您好!

我无法通过 DMA 通过 UART 发送48kHz 采样。

我将通过 DMA UART TX 发送510个样本的值块。

问题是、另一方面、我没有收到所有样本。 在大约10秒的时间内、我将发送5457个值块、而在另一侧仅接收904个值块。

我认为 UART TX 配置不够快:(波特460800)

const eUSCI_UART_Config uartConfig =
{
EUSCI_A_UART_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源
6、
8、
32、
EUSCI_A_UART_NO_奇 偶校验、
EUSCI_A_UART_LSB_FIRST、
EUSCI_A_UART_One_stop_bit、
EUSCI_A_UART_MODE、
EUSCI_A_UART_overSAMPLING_BAUDRATE_GEN
}; 

UART 波特率是否超过460800? 如果是、则 BRDIV、UCxBRF UCxBRS 的值是多少?

编辑:我在  BRDIV=3、UCxBRRF=4和 UCxBRS=2时能够将波特率更改为921600、但是我每发送3个块就会丢失2个数据块

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

    我不确定我是否理解您的问题,但根据“我的数学原理”,通过 UART 每秒发送545块510个样本,其中每个样本是一个字节,需要至少545*510*10 = 2779500波特,这比921600波特要高得多。


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

    您的意思是每秒545个块?
    如果我每秒获得48000个样本、其中510是一个块、那么我需要每秒发送94个块、对吧?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Michael、

    我认为我理解。 在您的第一篇文章中,您写道“在大约10秒的时间内,我将发送5457个值块...?”。 因此我计算出每秒5457/10个数据块...
    但是、"样本"的大小是多少字节?

    BR
    Christoph
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    因此、我可以将其设置为最大值1000000bps、其中 BRDIV=3、UCxBRF=0和 UCxBRS=0
    仍然会丢失2/3的封装。

    现在我不明白为什么它可以处理它呢?
    48000个样本/秒 x 48位= 2304000位/秒->这可以在288000波特率下处理、对吧?

    在1.000.000bps 的最大速度下、它可以处理高达8.000.000位/秒的数据、对吧?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Christoph、

    感谢您的指出。 我认为我的代码有问题。 它不应该是如此多的数据块。
    我的 DMA 当时不能正常工作。
    让我检查一下
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    因此、DMA 是可以的、我现在已将每个块的值从510更改为1020。
    它现在发送270个块/秒* 1020字节,即275400字节/秒。

    275400字节/s 是来自 ADC 的3个16位值。

    采样率不完全是48000Hz、但几乎是46000Hz、这就是为什么275400/(6个值)= 45900 (8位)个样本/秒的原因

    但是275400Bytes/s 等于275400bps 对吧? 如果 MSP432进行一个波特率为8位的传输。

    那么,即使将它设置为1.000.000 bps,它怎么也不能实现它呢?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    "BPS"(不太正确的"波特")是位/秒、而不是字节/秒。 UART 字节为(1+8+1)=10位[一个停止位]。

    计算方式略有不同:48000次采样/秒* 3次采样* 2字节/采样* 10位/字节= 2880000位/秒、即2.88Mbps。 我已经以3Mbps 运行了 MSP432 UART (检查您的 FTDI 芯片--我记得以前的芯片不能与之匹配),但我找不到能够跟上步伐的接收器(Windows 软件)。 (我想我可以写一个。)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Bruce、
    我认为1字节是8位、对吧?
    那么、为什么要乘以10位/字节?

    如何将 MSP432 UART 设置为3Mbps?

    我已经制作了一个与 Qt 一起运行的定制软件、我可以毫无问题地更改代码上的波特率。

    我使用的是 FT231X、在其数据表中、它显示:
    " FT231X 支持所有标准波特率和从183波特到高达3MBaud 的非标准波特率。"
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    要从 SMCLK=24MHz 获得3Mbps、除以8 (无过采样)。 我听说有一个浮动的电子表格可以实现这一点、但这个特定的组合非常简单。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bruce、

    我将波特率更改为3Mbps、当我从 PC 发送命令时、MSP432不会接收所有字节。

    缺少一些字节。  这是因为 MSP432 UART 的限制是1Mbps 吗?

    我在 PCM_VCORE1运行了一个晚上、这是否正常?

    GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_PJ、GPIO_PIN2 | GPIO_PIN3、GPIO_PRIMARY_MODULE_Function);
    cs_setExternalClockSourceFrequency (32768、48000000);
    PCM_setCoreVoltageLevel (PCM_VCORE1);
    FlashCtl_setWaitState (FLASH_BANK0、2);
    FlashCtl_setWaitState (FLASH_BANK1、2);
    CS_startHFXT (false);
    
    CS_initClockSignal (CS_MCLK、CS_HFXTCLK_select、CS_Clock_divider);
    CS_initClockSignal (CS_SMCLK、CS_HFXTCLK_select、CS_Clock_divider); 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不知道1Mbps 时的 MSP432 UART 限制。 这是否记录在某个位置?

    Rx 端和 Tx 端以相同的速度运行、因此您也增加了 Rx。 这意味着(对于背对背字节)您的 Rx ISR 具有(48/3*10=160)个时钟、可在下一个时钟到达之前移走一个 Rx 字节。 这听起来很像、但 ISR 中的数据处理(strcmp、memset)会增加。 请考虑在 main()中执行这些操作。

    如果您在 SPI+DMA ISR 中执行操作[参考其他线程]、UART ISR 也会延迟。

    我怀疑 UART Rx 数据在此应用中相对罕见/间或。 您最简单的权变措施(至少目前)可能是对发送方的数据进行同步、即在字节之间设置人工延迟。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Bruce、

    PC 和 MSP432设置为3Mbps、我不知道它是 PC、MSP432旁边的 FTDI 芯片还是 MSP432本身、还是无法以该速度接收的1m USB 电缆长度。
    我现在将禁用 ADC、仅以3Mbps 速率测试 UART、并使用非常简单的值来检查通信。
    您是否能够以3Mbps 的速率与 PC 进行 MSP432 UART 通信?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    哪个方向会丢失字节?

    我这里没有我的材料、但在这个主题中:

    e2e.ti.com/.../2262639

    我修改了 OP 程序、UART 以4Mbps、全双工(几乎)连续运行约半小时(直到我感到无聊)的速度完美运行。 该程序使用 DMA 和环回(在引脚上)、这会影响 USB、电缆、PC 和(大部分) MSP432固件、仅测试 USCI。

    在这种情况下----我怀疑,在这种情况下----问题正在发生转变,即一笔交易结束与下一笔交易开始之间的差距。 该间隙会随着您加快 UART 速度而缩小。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bruce、
    因此、UART RX EUSCIA0_IRQHandler 可能太慢、无法生成值。

    一旦发送了5个字节、我就使用 DMA 和 DMA 来配置 UART RX 并触发 DMA_INT3。
    因此、PC 被限制为发送到 MSP432的5个字节、这是可以的。

    现在、MSP432从 PC 接收所有字节!

    但是、当发出10000个数据包时、我的 UART DMA TX 将丢失4个数据包(4x 1020Bytes)。
    发出20.000个包时为8个包。

    我无法将 TX 增加到4Mbps、因为 FDTI 芯片只能处理3Mbps。 也许我必须对字节进行调整才能进行转换、或者使用更快的 UARTto USB 串行转换器。

    编辑: PL2303HXD 可驱动高达12Mbps 的波特率

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

    MSP432 UART 是否有方法与 FTDI 芯片使用握手通信?

    我知道 MSP432实际上是在 PC 上向外发送所有字节。 我已经使用针对 UART 的 DMA_TX 中断对其进行了测量、并对我设置的时间进行计数

    但几秒钟后、一些字节会丢失。
    我只需在整个时间内以200字节发送相同的缓冲区。 我可以看到、以5kHz 的频率发送的所有数据在11kHz 字节处都是正常的位、这些数据将丢失。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Michael、
    eUSCI 外设不支持 UART 的握手。 恐怕与处理 CTS/RTS 相关的开销会禁止更高的吞吐量。

    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    供参考。 可通过以下链接获取 eUSCI 波特率计算器。
    -Bob L.

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

    现在、我使用 MSP432 Launchpad 红色测试了 FT231X 和 Launchpad 的 UART 内置版本。
    我使用 Tera Term 检查接收字节并将波特率设置为3Mbs。

    我将以46kHz 的频率发送相同的204字节数据包。 (array[204]={0、1、2、3、4、5、6、7..203})
    LaunchPad 用户 UART 和 FDTI 这两个 UART 似乎都能顺利处理、就 tera 而言、我看到所有字节都没有丢失。

    我认为问题在于 Qt 应用程序收到串行数据、但我看不到任何关于 tera 的信息、我只看到了封装、它们在最初看起来是一样的。

    此致、

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

    您好!

    所以这个问题不是来自我的 QT 应用程序。
    我研究了 tera 项输出、发现 Lanchpad MSP432 (红色)有时会发送超过204字节的更多数据:

    但 MSP432会发送所有字节、我不会覆盖 DMA 通道:

    if (!DMA_isChannelEnabled (DMA_CH0_EUSCIA0TX))//检查 DMA TX 是否就绪
    {
    DMA_setChannelControl (UDMA_PRI_SELECT | DMA_CH0_EUSCIA0TX、UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_1);
    DMA_setChannelTransfer (UDMA_PRI_SELECT | DMA_CH0_EUSCIA0TX、UDMA_MODE_BASIC、m_buffer/* data_array1[swapbuffer]*/、
    (void*) UART_getTransmitBufferAddressForDMA (EUSCI_A0_BASE)、Size_缓冲 区 TX);
    DMA_enableChannel (0);
    } 

    有什么想法吗? 它可以是 MSP 吗? 缓冲器上的内存问题?

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

    这是获取 DMA 错误消息的正确方法吗? 启用 DMA_INTERR 并检查是否调用了 DMA 处理程序?

    INTERRUPT_enableInterrupt (DMA_INTERR);
    }
    ...
    void dma_ERR_IRQHandler (void)
    {
    errorDMA = dma_getErrorStatus();
    } 

    我不知道还有什么可以看的、FDTI 和板载用户 UART 在3Mpbs 下处理这个问题。 我认为这可能是 MSP432存储器问题

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

    您好、Michael、

    正如您提到 Tera Term 时所说的、我假设您将 Microsoft Windows 用作客户端应用程序的主机操作系统。

    在这种情况下、您应该尝试调整串行端口的 USB 设置、因为我担心所需传输速度的默认 USB 数据包大小太小(例如:Windows 7)。

    HTH

    Christoph

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

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

    Michael、

      随着波特率的增加、误差也会增加。   因此、即使您将 BRCLK 增加到允许的最大值(24MHz)、在不引入大量误差的情况下仍无法获得超过460800的性能。

      通过使用更高的波特率、您实际上正在使用低频模式的目标、因为 BRCLK 和波特率之间的关系不大于16倍。

    此致、

    Chris

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

    感谢您的回答。 我尝试将 MSP432用作声卡、但使用 UART 并不是一个好主意。
    我使用的是 PCM2903C、它已经有 USB 和 MSP432用于其他应用。


    此致、

    Michael