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.

[参考译文] CC430F6137:UART 错误通信

Guru**** 2609895 points
Other Parts Discussed in Thread: MSP-FET

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/757494/cc430f6137-uart-erroneous-communication

器件型号:CC430F6137
主题中讨论的其他器件:MSP-FET

我已通过 JTAG 将 MSP-FET USB 编程器连接到 EM-CC430F6137。 我在基本 UART 测试中使用了以下示例代码:

#include 


/**
* main.c
*/

void main (void)
{

//设置 UART (UCA0CTL0和 UCA0CTL1)

//1. 在设置 USCI 模块
UCA0CTL1 |= UCSWRST;


UCA0CTL1 |= UCSSEL_2之前、始终设置 UCSWRST; //使用 SMCLK 作为时钟源

//设置波特率
UCA0BR0=9; // UCBRx 的低位为9
UCA0BR1 = 0; // UCBRx 的高电平位为0
UCA0MCTL |= UCBRS_1 + UCBRS_0; //第二级调制为1 (9600波特率)
//UCA0STAT = UCLISTEN; //启用内部环回


/2。 清除 UCSWRST
UCA0CTL1 &=~UCSWRST; //清除 SW 复位,恢复操作

// 3. 启用 UART TX 和 RX 中断
UCA0IE |= UCRXEIE | UCTXIE;

_ENABLE_INTERRUPTS ();

//LPM0;

}

// USCI A 发送器中断
#pragma vector=USCI_A0_VECTOR
__INTERRUPT void USCIA0TX_ISR (void){

开关(UCA0IV、4){
情况0:中断;
案例2:
while (!(UCA0IFG & UCTXIFG)); //等待缓冲区
UCA0TXBUF = UCA0RXBUF;
中断;
案例4:中断;
默认:中断;
}
}

当我连接到 IDE 的串行终端时、我返回一些奇怪的输出:

我想、这必须来自调试器、因为当我从 EMCC430F6137板上拔下 JTAG 电缆时、我仍然会得到这些结果。

我尝试的另一件事是将这些代码行添加到上面的代码中:

(笑声)


P1DIR |= BIT6; //将 P1.6设置为 TX
P1SEL|= BIT5 + BIT6; //选择 P1.5 & P1.6以使用 UART 功能
... 

然后我尝试使用 TLL 串行电缆 以及*nix 程序"screen"@ 115200的波特率(如下图所示)

第二种方法也不起作用。 我不会从电路板获得任何输出。

我缺少什么?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、淋洗液
    上面所示的代码没有意义、因为您在代码执行中不循环或在启用中断时停止 CPU、在我们的许多示例中就是如此。 原样的代码意味着在中断启用后、CPU 将继续执行代码、但在程序存储器空间中不存在代码。
    我建议您在 Code Composer Studio 的 TI-Resource Explorer 中使用我们经过测试的 UART 代码示例之一、该示例可免费下载、以防您仍不使用它。
    例如、在" cc430x613x_uscia0_UART_01.c"示例中、您可以看到 CPU 在 UART 和中断初始化之后在 LPM0中停止。

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

    您好、Peter、感谢您花时间查看我的代码。 上述代码与您建议的文件完全相同(LPM 实现除外-已注释掉)。 我还继续将建议的文件(AD litteram)的内容复制/粘贴到 main.c 中、但结果完全相同。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、淋洗液
    我指向了代码示例、以便为您提供有关如何解决 CPU 尝试从未初始化的程序存储器执行代码问题的参考。 如代码示例的标头和 UART CC430的另一个标头所述、这些仅在接收字符时传输某些内容。 不确定您是否知道这一点。 因此、要查看 CC430中的某个器件、您需要向其发送至少一个字符。
    我将修改代码以永久传输一个字符、而无需接收。

    此致
    Peter
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、淋洗液
    我在 while (1)中将代码修改为永久传输一个和同一个字符。
    这是其中一项更改。
    另一个变化是特意配置时钟系统以将 frm FLL 和32kHz 晶体作为时钟基准、因为集成的 REFO 可能会有 x %的偏差、这可能会损坏波特率、因此是故障的可能原因之一。
    我还将波特率更改为9600、因为我没有硬件、在这里我可以使用 CCS 中的终端测试115200。 我使用了 G2xx Launchpad 调试部分、该部分仅提供9600。 这样、代码就可以正常工作。
    此时、我还要求检查您的端、您将为连接到 PC 的 UART 反向通道使用哪种硬件、它是否能够以115200波特运行、因为这可能也是您端问题的一部分。

    此致
    Peter

    #include
    #include // 01/04/2019

    char TXData = 0x55; //为初始化 TXData // 01/04/2019
    //传输'U'
    int main (空)

    WDTCTL = WDTPW + WDTHOLD; //停止 WDT

    PMAPPWD = 0x02D52; //获取对端口映射寄存器的写入访问
    P1MAP5 = PM_UCA0RXD; //将 UCA0RXD 输出映射到 P1.5
    P1MAP6 = PM_UCA0TXD; //将 UCA0TXD 输出映射到 P1.6
    P2MAP7 = PM_SMCLK; //将 SMCLK 映射到 P2.7 // 01/04/2019
    PMAPPWD=0; //锁定端口映射寄存器

    P1DIR |= BIT6; //将 P1.6设置为 TX 输出
    P1SEL |= BIT5 + BIT6; //选择 P1.5和 P1.6以使用 UART 功能

    P2DIR |= BIT7; //将 P2.7切换到输出方向// 01/04/2019
    P2SEL |= BIT7; //为 P2.7选择 SMCLK 函数// 01/04/2019

    //初始化 LFXT1 // 01/04/2019
    P5SEL |= 0x03; //选择 XT1 // 01/04/2019
    UCSCTL6 |= XCAP_3; //内部负载电容 // 2018年4月1日

    //循环直到 XT1故障标志被清除 // 2018年4月1日
    操作 // // 2018年4月1日

    UCSCTL7 &=~XT1LFOFFG; //清除 XT1故障标志 // 2018年4月1日
    } while (UCSCTL7&XT1LFOFFG); //测试 XT1故障标志 // 2018年4月1日

    //将 DCO 初始化为2.45MHz
    _bis_SR_register (SCG0); //禁用 FLL 控制环路 // 2018年4月1日
    UCSCTL0 = 0x0000; //设置可能的最低 DCOx、MODx // 2018年1月4日
    UCSCTL1 = DCORSEL_3; //将 RSELx 设置为 DCO = 4.9MHz // 2018年4月1日
    UCSCTL2 = FLLD_1 + 74; //将 DCO 乘法器设置为2.4576MHz // 2018年1月4日
    //(N + 1)* FLLRef = Fdco
    //(74 + 1)* 32768 = 2.4576MHz
    //设置 FLL Div = fDCOCLK/2
    _BIC_SR_register (SCG0); //启用 FLL 控制环路 // 2018年4月1日


    UCA0CTL1 |= UCSWRST; //**将状态机置于重置中**
    UCA0CTL1 |= UCSSEL_2; // SMCLK
    //UCA0BR0 = 9; // 1MHz 115200 (请参阅用户指南)// 01/04/2019
    //UCA0BR1 = 0; // 1MHz 115200 // 01/04/2019
    //UCA0BR0 = 21; // 2.4576MHz/115200 // 01/04/2019
    //UCA0BR1 = 0; // // 01/04/2019
    UCA0BR0 = 0x00FF; // 2.4576MHz/9600 // 01/04/2019
    UCA0BR1=0; // // 01/04/2019
    UCA0MCTL |= UCBRS_1 + UCBRF_0; //调制 UCBRSx=1、UCBRFx=0
    UCA0CTL1 &=~UCSWRST; //**初始化 USCI 状态机**
    UCA0IE |= UCRXIE; //启用 USCI_A0 RX 中断

    while (1) //主循环 // 01/04/2019

    while (!(UCA0IFG & UCTXIFG)); //等待 TX 缓冲区为// 01/04/2019做好准备
    //下一个传输
    UCA0TXBUF = TXData; //将数据加载到缓冲区/发送// 2019年4月1日

    //由于 while (1)而从未达到代码 // 01/04/2019
    _bis_SR_register (LPM0_bits + GIE); //输入 LPM0、中断被启用
    __no_operation(); //用于调试器


    //回显 RXed 字符,确认 TX 缓冲区已准备就绪
    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    #pragma vector=USCI_A0_Vector
    _interrupt void USCI_A0_ISR (void)
    #Elif defined (_GNU_)
    void __attribute__((中断(USCI_A0_Vector)) USCI_A0_ISR (void)
    其他
    错误编译器不受支持!
    #endif

    switch (__evo_in_range (UCA0IV、4))

    情况0:中断; //向量0 -无中断
    案例2: //向量2 - RXIFG
    while (!(UCA0IFG&UCTXIFG)); // USCI_A0 TX 缓冲器就绪?
    UCA0TXBUF = UCA0RXBUF; // TX -> RXed 字符
    中断;
    案例4:中断; //向量4 - TXIFG
    默认值:break;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、淋洗液
    您能否向我们提供有关状态的最新信息? 您是否能够启动和运行通信? 您是否需要进一步的支持? 如果没有、请关闭螺纹。 非常感谢。

    此致
    Peter
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好。 感谢您的回复。 我无法建立 UART 通信(即使使用更新的代码也无法建立通信)。 在初始开机自检中连接电缆和串行接口。 我将假定 TTL 电缆目前不适合所需的参数。 请随意关闭此主题。 非常感谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、淋洗液
    非常感谢作出澄清。 我将关闭该线程。 将来、请单击"此问题已解决"按钮。 这将为我们提供反馈、并自动从您的一侧关闭该线程。

    此致
    Peter