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/MSP432P401R:MSP432P401R UART

Guru**** 1138100 points
Other Parts Discussed in Thread: BOOSTXL-AUDIO
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/683245/ccs-msp432p401r-msp432p401r-uart

器件型号:MSP432P401R

工具/软件:Code Composer Studio

你好、

我正在制作一个使用 UART 的项目。 我想将引脚3.2和3.3上的 EUSCI_A2用于 UART、因为我无法访问顶部的 EUSCI_A0引脚、因为我正在使用覆盖这些引脚的 BoosterPack。 问题是我尝试通过 UART 向另一个 MSP432发送数据、但即使 TXBUF 显示正在发送数据、它也不会接收任何数据。 我尝试将数据回传到接收器缓冲器、当我这么做时、RXBUF 正在接收正确的数据。 我已经尝试了所有操作、但接收器没有获取任何数据。 如果你能帮助我,我将非常感激。

谢谢、

Luis Valerio

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果本地回送成功、但发送到另一个单元失败、则第一个猜测是您的比特率不正确。 (对于本地回送、比特率始终为"正确"。)

    通常的怀疑是(1)您使用的时钟(SMCLK?) 不是你认为的、或者(b)分频器不正确。

    如果您向我们展示初始化代码、则可能有人会看到问题是什么。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    int main (void)
    {
    //保持看门狗
    
    volatile uint32_t i;
    
    WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD;
    
    
    P1->DIR =~μ s (uint8_t) BIT1;
    P1->DIR |= BIT0;
    //P1->OUT &=~BIT0;
    P1->OUT |=0;
    P1->OUT = BIT1;
    //P1->REN = BIT1; //使能上拉电阻(P1.1输出高电平)
    P3->SEL0 |= BIT2 | BIT3;
    P3->SEL1 = 0;
    //P1->IES = BIT1; //高到低转换时的中断
    //P1->IFG = 0; //清除所有 P1中断标志
    //P1->IE = BIT1; //为 P1.1启用中断
    
    EUSCI_A2->CTLW0 |= EUSCI_A_CTLW0_SWRST;//将 eUSCI 置于复位状态
    EUSCI_A2->CTLW0 = EUSCI_A_CTLW0_SWRST |//在复位时保持 eUSCI
    EUSCI_B_CTLW0_ssel_SMCLK; //为 SMCLK 配置 eUSCI 时钟源
    //波特率计算
    EUSCI_A2->BRW = 1; //使用波特率计算器
    EUSCI_A2->MCTLW =(10 << EUSCI_A_MCTLW_BRF_OFS)|
    EUSCI_A_MCTLW_OS16;
    EUSCI_A2->CTLW0 &=~EUSCI_A_CTLW0_SWRST;//初始化 eUSCI
    EUSCI_A2->IE |= EUSCI_A_IE_RXIE; //启用 USCI_A0 RX 中断
    
    //启用 NVIC 上的端口1中断
    //NVIC->ISER[1]= 1 <<(Port1_IRQn)& 31);
    NVIC->ISER[0]= 1 <<((EUSCIA2_IRQn)& 31);
    
    //配置端口 J
    PJ->DIR |=(BIT0| BIT1 | BIT2 | BIT3);
    pj->out &=~(BIT0 | BIT1 | BIT2 | BIT3);
    
    //启用 PCM 粗鲁模式,允许器件进入 LPM3而无需等待外设
    //PCM->CTL1 = PCM_CTL0_KEY_VAL | PCM_CTL1_FORCE_LPM_Entry;
    
    //启用全局中断
    __ENABLE_IRQ();
    
    //设置睡眠深度位
    //SCB->SCR |=(SCB_SCR_SLEEPDEEP_MSK);
    
    SCB->SCR &=~SCB_SCR_SLEEPONEXIT_MSK;//从 ISR 退出时唤醒
    
    //不在退出 ISR 时唤醒
    //SCB->SCR |= SCB_SCR_SLEEPONEXIT_MSK;
    
    //确保 SLEEPONEXIT 立即生效
    _DSB();
    
    //转到 LPM4
    _SLEEP();
    while (1)
    {
    }
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    int main (void)
    {
    volatile uint32_t i;
    
    WDT_A->CTL = WDT_A_CTL_PW | //停止看门狗计时器
    WDT_A_CTL_HOLD;
    
    P2->DIR |= BIT2;
    P2->OUT &=~BIT2; // P1.0输出低电平
    
    //配置 UART 引脚
    P3->SEL0 |= BIT2 | BIT3; //将2个 UART 引脚设置为第二个功能
    
    //配置 UART
    EUSCI_A2->CTLW0 |= EUSCI_A_CTLW0_SWRST;//将 eUSCI 置于复位状态
    EUSCI_A2->CTLW0 = EUSCI_A_CTLW0_SWRST |//在复位时保持 eUSCI
    EUSCI_B_CTLW0_ssel_SMCLK; //为 SMCLK 配置 eUSCI 时钟源
    //波特率计算
    EUSCI_A2->BRW = 1; //使用波特率计算器
    EUSCI_A2->MCTLW =(10 << EUSCI_A_MCTLW_BRF_OFS)|
    EUSCI_A_MCTLW_OS16;
    EUSCI_A2->CTLW0 &=~EUSCI_A_CTLW0_SWRST;//初始化 eUSCI
    EUSCI_A2->IE |= EUSCI_A_IE_RXIE; //启用 USCI_A0 RX 中断
    
    SCB->SCR &=~SCB_SCR_SLEEPONEXIT_MSK;//从 ISR 退出时唤醒
    
    //启用全局中断
    __ENABLE_IRQ();
    
    //在 NVIC 模块中启用 eUSCIA0中断
    NVIC->ISER[0]= 1 <<((EUSCIA2_IRQn)& 31);
    
    while (1)
    {
    // //每次传输之间的任意延迟以观察
    // //通过范围传输的字符
    // 对于(i = 10;i > 0;i-);
    //
    // while (!(EUSCI_A2->IFG 和 EUSCI_A_IFG_TXIFG));
    // EUSCI_A2->TXBUF = TXData; //将数据加载到缓冲区
    //
    __sleep();
    }
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经连接了两个代码、第一个是发送器 UART 配置、第二个是接收器一个。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不确定发送器(第一个入口)是如何传输任何内容的、因为它不启用 EUSCI_A_IE_TXIE 并且没有内联的。 这是您用于本地回送的代码吗?

    我还必须问:您是否记得交叉连接(TXD->RXD、每个方向) Launchpad 之间的引脚?

    我想您以3Mbps 的速率运行 UART、如果您有长电缆、这一速度相当快。 您可能会尝试将其减速一点。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我使用 BOOSTXL-AUDIO BoosterPack 进行语音识别。 在我的程序中、每当识别到语音时、它就会开始通过 UART 传输。 我没有进行交叉连接、因为我必须使用引脚3.2和引脚3.3、因为顶部的其他引脚都被同一 BoosterPack 覆盖。

    AUDIO_STOPCollect (音频);
    识别 State.ledCount = 0;
    LED_off1 ();
    //LED_setColor2 (0、0、255);
    while (!(EUSCI_A2->IFG 和 EUSCI_A_IFG_TXIFG));
    EUSCI_A2->TXBUF =传输数据; //TransData 是我要发送的整数
    
    

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

    交叉连接的意思是在每个电路板上用 P3.3导线连接 P3.2、因此 TXD 在每个方向上连接到 RXD。 (比听起来更容易忘记。)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我能够使它正常工作。 您说得对、SMCLK 被16分频、因此我更改了乘法器。 非常感谢!