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/MSP430F5438A-EP:我的UART通信代码不打印任何内容或'@'终端上带有随机时间的字符

Guru**** 2563960 points
Other Parts Discussed in Thread: MSP430F5438A

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/654529/ccs-msp430f5438a-ep-my-uart-communication-code-prints-out-nothing-or-character-with-random-time-on-the-terminal

部件号:MSP430F5438A-EP
主题中讨论的其他部件:MSP430F5438A

工具/软件:Code Composer Studio

尊敬的社区成员:  

大家好,我是TI主板MSP430F5438A的初学者,现在我正在测试通过USB与UCA1进行的UART通信。

我(认为I)正确配置并设置了UART通信的所有寄存器,因此我启动了CCS提供的终端,并使用我所做的设置。

我所做的设置写在函数'halUsbInit()'中,它在下面的代码中,我也为你们写了一些评论。

使用这些设置,我启动终端时使用:波特率=5.76万,数据位=7 ,奇偶校验位=无,停止位=1,控制流=无。

但是,问题是,当我运行下面的代码时,终端不打印任何内容,而奇怪的是,它有时会打印出'@'字符!

您会为我建议一些原因或解决方案吗?

我所检查的是:

UCA1TXBUF注册并发现它能精确地存储我需要的数据。

通过在LCD上打印这些值来注册值,以检查是否对其进行了精细修改-->是否正常。

非常感谢你能抽出时间。

void halUsbInit(void)

无符号字符I;

(i = 0;i < 255;I++)
  halUsbReceiveBuffer[i]='\0";

缓冲区大小=0;
USB_PORT_SEL || USB_PIN_RXD + USB_PIN_TXD;
USB_PORT_DIR || USB_PIN_TXD;// port_DIR (HI):TXD
USB_PORT_DIR &=~USB_PIN_RXD;// port_DIR (LO):RXD

UCA1CTL1 |= 0x00//UCSWRST;//重置状态,UCSI_A1控制1,此操作修改最低位
UCA1CTL0 = UMODE_0;// UCSI A1 Control 0 = UCUMODE_0;UCUMODE_0表示UART模式
 //此模式。最后第二位,第三位只能在UCSWRST=1时修改,并且似乎是UART模式,因为UCMODE_0是0x00宏

UCA1CTL0 || UC7BIT;// 7位通信。 ,UCA1CTL0:UCSI_A1控制0 --> 1:7位,0:8位
UCA1CTL1 |= UCSSEL_2;//时钟选择:SMCLK
//UCSSEL:宏用于:0x80 =1000 0000:表示SMCLK------- /
UCA1BR0 = 138;// 8MHz/5.76万=138,UCAxBR0:USIC_AX波特率控制0,
UCA1BR1 = 0;// UCAxBR1:USI_AX波特率控制1
 // br0:低字节时钟和BR1:高字节时钟-->格式16位val (UCAxBR0 + UCAxBR1 * 256)
 //对于此情况,即0000 0001 0001 0000

UCA1MCTL = 0xE;//14 -> 1110:超采样已禁用,第二调制(11)
UCA1CTL1 &=~UCSWRST;//重置模式关闭
UCA1IE |= 0x01;//接收启用的中断

__bis_sr_register(GIE);//启用中断
__no_operation();

}

void halUsbShutDown (void)

UCA1IE &=~UCRXIE;//禁用后RX中断
UCA1CTL1 = UCSWRST;//重置状态
USB_PORT_SEL &=~(USB_PIN_RXD + USB_PIN_TXD);//删除分配的RX,TX引脚
USB_PORT_DIR || USB_PIN_TXD;
USB_PORT_DIR || USB_PIN_RXD;
USB_PORT_OUT &=~(USB_PIN_TXD + USB_PIN_RXD);
}

void halUsbSendChar(Char* Character,int I)

CHAR* ERRC="循环";
CHAR* NEXTOPC ="PR ";

IF (UCA1IFG和UCTXIFG)

  halLcdPrintLine(NEXTOPC, 5+I, 0);

同时(!(UCA1IFG和UCTXIFG))
  {
   halLcdPrintLine (ERRC,1,0);
  }
  //UCA1IFG:中断标志寄存器,UCTXIFG:来自UCA1IFG的1位,0:无中断,1:中断
  //在这种情况下,如果两个是相同的->离开时,如果diff ->进入while循环永久,这意味着发生了一些不希望出现的错误

UCA1TXBUF =*字符;//UCA1TXBUF:8位寄存器,存储8位字符。
}

/**
主要c
*/
内部主(无效)

WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
P1DIR || BIT1;

CHAR REG_BUF[15]={0},";

halLcdInit();
halLcdBackLightInit();
halLcdClearScreen();

halLcdBackLightInit();
halLcdClearScreen();
// halLcdPrintLine ("Baudrate = 5.76万",0,0);
// halUsbInit();

int i;
字符[17]={'E','F',0};
对于(I =0;I < 3;I++)

 halUsbInit();

 halUsbSendChar((Character + I),i);

 char buf[3]={0},";  
 buf[0]=UCA1TXBUF;

 halLcdPrint (buf,0);

 __DELAY周期(10万);

 halUsbShutDown();
 volatile unsigned int k;

 P1OUT ^= BIT1;

 K =2万;
 执行k--;
 while (k!= 0);
}
//halUsbShutDown();

返回0;
}

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

    您的UCA1 UART初始化基于8 MHz SMCLK源,但您确定您的时钟已正确设置为这样吗? 如果提供了,则尚未提供UCS初始化代码。 在修改任何寄存器之前,您还需要将USCI逻辑置于重置状态(UCA1CTL1 |= UCSWRST;),然后清除软件重置启用。 您是否参考过MSP-EXP430F5438用户体验代码示例?

    此致,
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢! 实际上,我也参考过体验示例代码,但我无法从那里了解如何设置时钟设置...您是否建议我使用一种方法或文档来设置通信时钟? 或者,我应该手动测量它们吗? 谢谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    /*修改后的答复*//*其他答复*/
    在我研究了UCS寄存器之后,我进行了如下所写的设置。

    /*UCS设置*/
    UCSCTL1 |= 0x0001;//调制启用
    UCSCTL2 = 0x0100;//设置FLLD 0 (D=1),FLLN 2^8 (N=2^8)
    UCSCTL3 = 0x0000;//设置FLLREF = XT1CLK,FLLRDIV = 000b (n = 1)
    UCSCTL4 = 0x0030;// sils = 000b:选择SMCLK --> DCOCLK,其他:在本代码中不重要
    UCSCTL5 = 0x0000;//所有CLK DIC.factor = 000b --> f/1.
    UCSCTL6 = 0x0080;// XT1DRIVE最低电流混合模式,XTS 0b,SMCLK ON,XT1 ON。 ##Bypass CAP。 Val???

    /*UCA1CTL0,1 settings*/
    UCA1CTL0 |= 0xE8;//UC7BIT=0x10;// 8位通信。 ,偶校验,MSB优先
    UCA1CTL1 |= 0xB5;//B5 = 1011 0101
    //在执行此修改之前,我还具有重置状态

    因此,现在我确信我使用的时钟是8MHz,波特率为11.52万。

    但是,代码仍然不起作用。
    但是有一件事变得更好了(不确定这是否真的更好);它现在在每次向UCA1TXBUF发送字符时都会打印某种字母。
    (以前,它打印出来时有时不一致,但现在它显示了一种恒定的行为。)


    问题是:
    1)我应该尝试什么来调试这种情况?
    2)我再次尝试使用提供的示例代码,但它不起作用;我在板上加载程序时是否遗漏了一些内容?
    3)此寄存器的旁路电容值是什么,我应该如何设置?

    非常感谢你的帮助
    当然,

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的UCS寄存器设置需要大量改进,有关如何将MCLK和SMCLK设置为8 MHz的示例,请参阅msp430x54xA_UCS_2.c。 阅读MSP-EXP430F5438实验板用户指南(SLAU263)后,我也不认为支持5.76万以上的波特率,而且您的USCI设置仍然不正确。 您应该使用逻辑分析仪或示波器屏幕截图来评估您的通信线路。 如果打包的示例代码不起作用,则硬件设置(跳线配置)或终端设置可能存在问题。 UCSCTL6的XCAP位是指MSP-EXP430F5438上预填充的XT1的集成有效负载电容,这些值在数据表的第5.15 节中列出。 您应该研究User Experience代码的HAL_UCS.c函数。

    此致,
    Ryan