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.

[参考译文] EVM430-FR6047:串行 UART A 不进行转换

Guru**** 2594620 points
Other Parts Discussed in Thread: EVM430-FR6047

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/704859/evm430-fr6047-serial-uart-a-not-transmiting

器件型号:EVM430-FR6047
主题中讨论的其他器件:MSPWARE

您好!

简介:串行 eUSCI_A0不会向主机 PC 发送任何串行数据。  

我已经开始使用 EVM 进行开发、并尝试在 eUSCI_A0上配置和使用串行 UART。 在 EVM 上、组装接头 J2上的引脚后、它应通过 ezFET 进行通信(如下所示):  

我已经如图所示配置了 eUSCI_A0寄存器:

void serial_init (void)
{

EUSCI_A_UART_initParam param ={0};
param.selectClockSource = EUSCI_A_UART_CLOCKSOURCE_SMCLK;//SMCLK=>(DCO) 16MHz/DIVS_4 ---- ACLK=LFXTCLK=37.768 kHz
param.clockPrescalar = 69;4/57600
param.firstModReg = 0;
param.secondModReg = 4;
param.parity = EUSCI_A_UART_NO_parity;
param.msborLsbFirst = EUSCI_A_UART_LSB_FIRST;
param.numerofStopBits = EUSCI_A_UART_Oe_STOP_BIT;
param.uartMode = EUSCI_A_UART_MODE;
param.oversaming= EUSCI_A_UART_LOW_FREQUENCY BAUDRATE_generation;

//设置 P2SEL1.x GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P2、GPIO_PIN0 + GPIO_PIN1、GPIO_secondary 模块_function);// P2.0 UCA0TXD 和 P2.1 UCA0RXD if (STATUS_FAIL = EUSCI_A_UART_init (EUSCI_A0_BASE、&param)){ 返回; } PMM_unlockLPM5 (); EUSCI_A_UART_ENABLE (EUSCI_A0_BASE); EUSCI_A_UART_clearInterrupt (EUSCI_A0_BASE、EUSCI_A_UART_receive_interrupt); EUSCI_A_UART_clearInterrupt (EUSCI_A0_BASE、EUSCI_A_UART_Transmit 中断); EUSCI_A_UART_enableInterrupt (EUSCI_A0_BASE、EUSCI_A_UART_Transmit 中断); //启用中断 //启用 USCI_A0 RX 中断 EUSCI_A_UART_enableInterrupt (EUSCI_A0_BASE、EUSCI_A_UART_receive_interrupt); //启用中断 __ENABLE_INTERRUPT(); }


下面是时钟初始化例程:

void clock_init (void)
{
//
*配置 CS 模块
* MCLK = 16MHz (从 DCOCLK)
* SMCLK = 8MHz (从 DCOCLK)
* ACLK = LFXTCLK 32.768KHz
*//
解锁 CS 寄存
器 CSCTL0_H = CSKEY >> 8;

//将 DCO 设置为16MHz
CSCTL4 | DCOSEL = DCOTL1;

// SELA 选择 ACLK 源
//


SELA 选择 SMCLK 源// SELM 选择 MCLK 源//对于 EVM HFXCLK = 8MHz、LFXCLK = 32.768kHz、//设置 ACLK = LFXTCLK、SMCLK = DCO、MCLK = HFXTCLK
CSCTL2 =__CLK | SELK | SELK | SELCLK | SEL_ SELK | SELK | SELK CLK | SEL_ SELK | SEL_ SELCLK

// DIVA 选择 ACLK 源分频
器// DIVS 选择 SMCLK 源分频
器// DIVM 选择 MCLK 源分频
器 CSCTL3 =(DIVA__1 | DIVS_4 | DIVM_1);

CSCTL4 &=(HFXTDRIVE_0);
CSCTL4 &=(HFXTHRESD4和=
(HFXTHRESD4)
| CFXT0)| CFXTREFW4 | CFXTREFW4 (HSCTL4);CFXTREFW4 = 1)
CSCTL4 |=(LFXTBYPASS =0);

CSCTL4 &=~(HFXTOFF);
CSCTL4 &=~(LFXTOFF);

//锁定 CS 寄存
器 CSCTL0_H = 0;//
} 

调试时、UCA0寄存器如下所示:

主:

uint8_t RXData = 0、TXData = 0;
uint8_t check = 0;

int main (void){
uint32_t I = 0;
TXData = 0x01; 
while (1){ serial_trasmitDataByte (TXData); // TXData = TXData+1; 对于(i = 0;i < 100000;i++); GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN0); } 返回(0); }


// // ////这是 USCI_A0中断矢量处理例程。 //// ********* #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_) #pragma vector=USCI_A0_vector __interrupt #elif defined (__GNU__) __attribute__(interrupt (USCI_A0_vector))#endif void USCI_A0_ISR __interrupt #elt #elif defined (__GTIC_属性_(UCA_UCI_IN_IN_INTRIF_IN_IN_INTRIBUCI_IN_UCAINTRIEL )(UCA0_INTRUCAINTR USCI_NONE 案例:中断; USCI_UART_UCRXIFG 案例: RXData = EUSCI_A_UART_receiveData (EUSCI_A0_BASE); if (!(RXData = TXData))//检查值 { while (1); } 支票=1; 中断; USCI_UART_UCTXIFG 案例: TXData = TXData+1; 中断; }

中断按预期运行、但我在主机 PC 串行通信上未接收到任何数据。 我缺少什么吗??


还尝试使用 MSPWARE 示例(msp430fr60x7_euscia0_UART_03.c)代码、但未成功。 同样、配置寄存器但未接收到数据

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

    尊敬的 Marcos:

    您使用的电路板与 EVM430-FR6047主页上的设计文件之间似乎存在差异。 您能否确认您在哪里获得了电路板、何时获得电路板?

    参考 EVM430-FR6047 (EVM430-FR6047原理图(修订版 B))的当前设计原理图、原理图上的 J3应为电路板上的 J2。 因此、您使用的 TX 和 RX 引脚应为 UCA1TXD 和 UCA1RXD。 但在代码中、您只配置了 UCA0而不是 UCA1。  

    if (STATUS_FAIL = EUSCI_A_UART_init (EUSCI_A0_BASE、&param)){ 

    您可能需要更新 UCA1的代码。 或者、您也可以使用电路板 J5上的 RXD 和 TXD 引脚、这些引脚用于 UCA0RXD 和 UCA0TXD。

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

    您好、Wei、

    感谢您的回复和支持!

    大约一个月前、我从位于巴西的德克萨斯州团队那里获得了这份报告。

    我将代码更改为 EUSCI_A1_BASE。 现在、由于 RX (远程)看起来工作正常、我可以正确接收串行数据。 TX 仍然不工作。 数据被放置在 UCA1TXBUF 中、但是从不在主机的软件中接收。

    发送中断仍然有效。  

    由于通过终端(主机)发送的数据和 MSP 接收的数据是正确的、我假设连接和配置现在是正确的。 现在、TX 有什么问题?

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    serial_trasmitDataByte()的外观是什么? 当您到达该位时、TXIFG 未置位。 这是否会导致任何问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bruce、

     serial_trasmitDataByte()基本上是 driverlib 方法的封装:

    #define serial_PERIF_ADDR EUSCI_A1_BASE
    
    /**
    *@简要
    * 通过先前配置的接口*发送一个字节
    *
    / void serial_trasmitDataByte (uint8_t uC_txData)
    {
    eUSCI_A_UART_transmitData (serial_PERIF_ADDR、uC_txData);
    }
    
    void eUSCI_A_uart_transmitData (uint16_t baseAddress、uint8_t transmitData)
    {
    //如果未使用中断,则轮询标志
    if (!(HWREG16 (baseAddress + OFS_UCAxIE)& UCTXIE)){
    //轮询发送中断标志
    while (!(HWREG16 (baseAddress + OFS_UCAxIFG)& UCTXIFG));
    }
    
    HWREG16 (baseAddress + OFS_UCAxTXBUF)= transmitData;
    } 

    [引用用户="Bruce McKenneny47378]]到您到达该位置时、TXIFG 未设置。 这是否会导致任何问题?

    没错。 对于第一个字节、它未设置、但在序列中进行了设置。 因此、它应适用于以下字节。  

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    实际上、TXIFG 永远不会在这里置位、因为 ISR 会在置位时尽快将其清零。 但是、正如您所说的、这个函数与 TXIFG 无关(只要 TXIE 被置位)。

    因此、我想我们回到了常见的问题:接线、P1SELx、您的更改中的拼写错误。 暂停时、您的程序会执行什么操作?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    基本上、当发生传输中断或将接收到的数据归于同一变量时、我会向变量添加+1。 此外、切换 LED 以显示每个传输。 请参阅以下内容:

    int main (void){
    uint32_t i = 0;
    
    TXData = 0x01;
    while (1){
    serial_trasmitDataByte (TXData);
    GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN0);
    for (i = 0;i < 1000000;i++);
    }
    
    返回(0);
    }
    #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__)
    #pragma vector=USCI_A1_vector
    __interrupt
    #elif defined (__GCUC__)
    #endif
    void USCI_A1_ISR_ISR(void)
    {
    switch (__evenu_in_uCTI_IN_OUT_RANGE、UCAUSCI_UCC_UART_UTI_NOT_UCTG)
    }
    USCI_NONE 案例:中断;
    USCI_UART_UCRXIFG 案例:
    TXData = EUSCI_A_UART_receiveData (EUSCI_A1_BASE);
    中断;
    USCI_UART_UCTXIFG 案例:
    TXData += 1;
    中断;
    案例 USCI_UART_UCSTTIFG:中断;
    案例 USCI_UART_UCTXCPTIFG:break;
    }
    } 

    断点在 RX 和 TC 上工作  

    下面是 P1SEL1.2 (TX)和 P1SEL1.3 (RX)的配置。 如数据表中所述、应将其设置为进行 UART 传输、并将 P1SEL0清零。
    我不知道 P1DIR 寄存器应该处于哪个状态、但应该在设置了 EUSCI_A1后进行配置。  

    程序正常运行。 执行 serial_trasmitDataByte(),然后切换 led 和 transmit interruption 例程。  

    在布线方面、它基本上是 EVM 随附的 eZ-FET USB 调试器。 已放置跳线、并且已成功接收从主机发送到远程设备的数据。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当我读取数据表[SLASEB7B]表6-26时、SEL0位应为1、SEL1位为0。 (这与 UCA0/P2.0-1相反。) 我不确定您的 Rx 是如何工作的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    马科斯

    我们在下面的演示应用中还有一个 UART 示例。

    software-dl.ti.com/.../index_FDS.html

    在 hal 文件夹中、您将找到 hal_UART.c 和 hal_UART.h、它们以57、600波特提供了一个位于 P1.2 (TX)和 P1.3 (RX)上的 UART 接口。

    如果这是与 PC 通信、请确保 PC 端的波特率设置正确。 请告诉我、您是否能够使该示例正常工作。