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.
您好!
我正在尝试使用 UART 在 MSP430FR4133和 MSP430FR6877 MCU 之间建立通信。 MSP430FR4133采用32.768KHz 的外部晶振来工作。 下面是我用于 UART 初始化的代码片段:
void inituart()
{
P1SEL0 |=(BIT0 | BIT1);
UCA0CTLW0 &=~μ m (UCSYNC);
UCA0CTLW0 |= UCSWRST; //将 eUSCI 复位
UCA0CTLW0 |= UCSSEL_UCLK; // CLK = UCLK
UCA0BR0 = 3; //32000/9600
UCA0BR1 = 0x00;
UCA0MCTLW ~(UCOS16);
UCA0CTLW0 &=~μ m (UCSWRST); //初始化 eUSCI
UCA0IE |= UCRXIE;
}
我发送的字符串如下
guckfactor_array[8]='\0';
guckfactor_array[7]=(((int) digit8)+ 0x30);
guckfactor_array[6]=(((int) digit7)+ 0x30);
guckfactor_array[5]=(((int) digit6)+ 0x30);
guckfactor_array[4]=(((int) digit5)+ 0x30);
guckfactor_array[3]=((( int ) digit4 )+ 0x30 );
guckfactor_array[2]=((( int ) digit3 )+ 0x30 );
guckfactor_array[1]=(((int) digit2)+ 0x30);
guckfactor_array[0]=(((int) digit1)+ 0x30 );
inituart();
UARTPutString (guckfactor_array);
在代码中、字符串是通过将每个数字分配给数组元素并将其转换为 ASCII 来构建的。
用于向 UART 发送数据的片段如下
void UARTPutString (字符*str)
{
无符号 int i=0;
while (str[i]!='\0')//检查 NULL 字符以终止循环
{
while (!(UCA0IFG 和 UCTXIFG));
UCA0TXBUF = str[i];
__ delay_cycles (10);
I++;
}
}
但是,当第一个字节被写入时UCA0TXBUF
,UCTXIFG
标志被重置,但UCTXCPTIFG
标志保持未设置状态。 因此、程序在 while 条件下进入一个无限循环。 似乎是数据没有被成功的传输到移位寄存器TXBUF
.我怎么知道数据是否被 TXBUF 放入移位寄存器? 我在 PuTTY 上没有看到任何内容。我由此推断出什么?请查看代码并建议解决方案。CCS 版本为12.0.0
谢谢。此致。
Pratik.
您是否清除了 LOCKLPM5?
您已经通过 UCLK 选择了一个外部时钟源。 您是否配置了该引脚? 您可以选择内部时钟是 SMCLK 和 MODCLK。
如果在上电清除后的任何其他时间调用您的初始化可能会失败。 UCSYNC 是在 UCSWRST 置位时不能更改的位之一。 两个都是在上电时。
比特率不是9600。 这将需要设置调制位。 如果两个 MSP430使用相同的设置、则没问题。 (如果使用调制模式、它们必须相同。)
感谢您的答复 David!
是的、我已经在 PMCTL0中清除了 LOCKLPM5。
还为 SMCLK 配置了引脚。 正如您建议的、我在设置 UCSWRST 后移动了 USync 清除部分。
现在、我能够在 Docklight (在我的 PC 上)上接收控制器发送的数据。
但是、当我从 PC 向控制器发送数据时、似乎有一个问题。
控制器不会为接收数据而跳转至 ISR
以下是更新后的用于 MSP430FR4133的 UART 初始化函数
P1SEL0 |=(BIT0 | BIT1);
UCA0CTLW0 |= UCSWRST; //将 eUSCI 复位
UCA0CTLW0 &=~μ m (UCSYNC);
UCA0CTLW0 |= UCSSEL__SMCLK; // CLK = SMCLK
UCA0BR0 = 0x68; // 1000000/9600
UCA0BR1 = 0x00;
UCA0CTLW0 &=~μ m (UCSWRST); //初始化 eUSCI
UCA0IE |= UCRXIE;
ISR 函数如下
#if defined (__TI_Compiler_version__)|| defined (__IAR_SYSTEMS_ICC__)
#pragma vector=USCI_A0_vector
__interrupt void USCI_A0_ISR (void)
#Elif 已定义(_ GNU _)
void __attribute__((interrupt (USCI_A1_vector))) USCI_A1_ISR (void)
#else
#错误编译器不受支持!
#endif
{
switch (__even_in_range (UCA0IV、USCI_UART_UCTXCPTIFG))
{
USCI_NONE:中止;
案例 USCI_UART_UCRXIFG:
while (!(UCA0IFG&UCTXIFG));
gucrcvChar = UCA0RXBUF;
gucRxBuffer[guiRXIndex]= gucrcvChar;
guiRXIndex++;
中断;
USCI_UART_UCTXIFG 情况:中断;
案例 USCI_UART_UCSTTIFG:中断;
案例 USCI_UART_UCTXCPTIFG:中断;
}
}
您是否在某处启用中断? (__enable_interrupt ();)