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/MSP430F5529:在终端软件上接收垃圾值(Teraterm)

Guru**** 2614245 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/655221/ccs-msp430f5529-receiving-garbage-values-on-terminal-software-teraterm

部件号:MSP430F5529

工具/软件:Code Composer Studio

您好,

我正在尝试通过MSP430F5529LP的WFP 4.4 和4.5 UART在Teraterm终端上打印字符串。 我只打印字符串一次,只是为了测试它,我没有将代码置于无限循环中。 问题是在Teraterm上收到字符串一次后,我连续收到垃圾值。

以下是我在字符串后收到的垃圾值:

终端上的波特率和配置代码相同(即11.52万)。 当我在函数中放置断点并在调试中使用step检查主代码时,代码工作正常,除了字符串,我没有收到任何垃圾值。 当我在没有断点的情况下运行代码时,我会在字符串后面收到垃圾值。 我还检查了UCA1TXBUF寄存器中的最后一个值,这是传输的字符串字符的最后一个值。  

下面的"printstring"函数是我为传递字符串而编写的函数:

void printstring(car *buff,char length)
{
	int i;
	for (I=0;i<length;i++,buff ++){
	
		while (!(UCA1IFG&UCTXIFG));
		UCA1TXBUF =*buff;
	} 
}

下面是我正在使用的UART的初始化代码: 
void initUART()
{
P4SEL |= BIT5+BIT4; // WFP 3.3 ,4 = USI_A0 TXD/RXD
UCA1CTL1 |= UCSWRST; //**将状态机置于复位**
UCA1CTL1 || UCSSEL_2; // SMCLK
UCA1BR0 = 9; // 1MHz 11.52万 (请参阅用户指南)
UCA1BR1 = 0; // 1MHz 11.52万
UCA1MCTL || UCBRS_1 + UCBRF_0; //调制UCBRSx=1,UCBRFx=0
UCA1CTL1 &=~UCSWRST; //**初始化USCI状态机**
} 

下面是我正在测试的主要代码:

#include <msp430f5529.h>
#include "UART.h" 
int main (void) { initUART(); _ASM ("NOP"); printstring("Hello",5);}

希望有人能帮我解决这个问题。

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

    首先,请尝试移除6.1 和平行(UART)的和6.2 跳线(这将断开背信道的连接),看看是否可以解决您的问题。

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

    感谢您的快速响应。 我尝试移除6.1 和6.2 跳线,但这根本不打印字符串。 卸下跳线时数据未传输到PC。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    抱歉,我误读了您的原始描述。 您需要将这些跳线放回原位。 您的初始化代码看起来正确,如果UCA1TXBUF中的最后一个值是您打算传输的最后一个值,则它看起来不像是MSP430正在传输任何其他字符。 您是否尝试过其它串行终端? 这可能是TeraTerm的问题。

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

    您好,Nathan,

    它肯定不像MSP430正在传输字符,因为我甚至在传输字符并仍接收垃圾值后尝试将其置于低功耗模式。 已尝试其他端子,如docklight和realterm,它们也会产生相同的结果。 术语侧的设置也很好,没有列出检查这些垃圾值的此类选项。  

    当我运行代码一段时间并在打印垃圾值时暂停代码时,代码将进入中止函数的无限循环,如下所示。 执行步过调试时,不会将代码置于abort函数中。

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

    要不进入中止功能,请确保在main()的末尾包含一个空的while (1)循环。 使用当前代码,它在活动模式下到达main()的末尾,并在一个奇怪的状态下迷失。 此状态可能导致串行通信引脚上的电压波动或类似情况,因此请尝试包括while (1)回路,并查看是否可以解决此问题。

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

    这是否解决了您的问题? 如果是,请将其标记为"已回答"。 如果很快没有响应,则此线程将由于不活动而关闭。

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

    由于我在其他工作中被搁置,因此对未回复表示歉意。 我试着在末尾放置无限循环,结果也是一样的。 终端窗口上的设置似乎正常。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    我开始想知道这是否是主板问题,因为您提供的描述不应导致此问题。 在打印字符串并查看是否仍看到垃圾字节后,能否尝试在代码中禁用USCI (UART)模块(UCA1CTL1 |= UCSWRST;)?

    此外,您能否将终端设置为打印十六进制值,以便我们可以看到实际打印的垃圾位? 希望这能让我们对实际发生的事情有一种了解。

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

    您好,Nathan,

    我也想知道同样的情况。 我尝试了输入while (1)并禁用了UART模块,但我仍然可以看到正在打印的垃圾字节。

    这些是TeraTerm终端上打印的以下字节(十六进制)。 前五个字节是"Hello"字符串字节。 以下是不遵循任何特定模式的垃圾字节。

    我想知道这是否是终端软件问题。 因此,我尝试在不同的终端软件(即Docklite)上打印它,该软件再次打印相同的值,如下所示:

    我开始思考是否是一个启动台问题,然后更换了启动台,但没有得到任何好处。 相同的值也打印在不同的板上。

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

    根据您排除的情况,我再次查看了您的代码,发现了一些可能存在问题的地方。 以下行可能导致了该问题:

    UCA1MCTL || UCBRS_1 + UCBRF_0;

    请尝试将其更改为以下内容:

    UCA1MCTL || UCBRS_4 + UCBRF_0;

    我认为您可能有错误的调制值。 请尝试此操作,并告诉我它是否有效。

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

    你好,Nathan,

    我尝试了您提出的解决方案,但结果仍然相同。 根据我的理解,我没有配置时钟系统模块, UART从SMCLK获取时钟,默认为104.8576万Hz。  参考MSP430x5xx用户指南,针对104.8576万 BRCLK提及的UCBRS值为1,它指的是UCBRS_1。

    因此,我不知道这是否造成了问题。 虽然我检查了示波器上的Tx针脚(即WFP,4.4),并观察到波浪中有一些噪音,而不是在空闲时应该出现的干净逻辑高。

    目前,我正在出差,一到办公室进行分析,就会立即发布CRO波形。

    感谢您积极参与解决Nathan的问题。

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

    是否有此问题的更新?

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

    1.从准确已知的时钟开始。 虽然有时内部RC时钟与我们一样工作,但Xstal是值得去做的一天。请注意它们的准确性。 我曾经有一个块状部分,其12MHz的额定时钟运行频率为9.6Mhz。

    2.确保您的波特率和模块的其它参数设置正确。 不能以主要数字开头。

    3.测试您的传输/缓冲区以避免溢出。

    4.配置UART引脚。

    5.确保传输缓冲区足够长。

    我从传输已知地址开始。

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

    这是我的F2xx系列初始化代码:与您的不是完全相同,但希望通过细微的修改,它适用于您的设备:我进行了快速扫描,两台设备非常相似。

    //reset uart0/eusci_a0
    void uart0_init(UINT32_t bps){
    	uint16_t BRX;								//用于波特率计算,对应数据表
    	中的BRX,BRFx,BRSx uint8_t brfx,brsx;
    	uint8_t OS16;
    	uINT32_t intr;
    	int16; 								//N - INT (N),x 1万
    
    	//配置引脚
    #if defined (UART0_TX)
    	UART0_TX ();
    #endif
    	
    #if defined (UART0_RX)
    	UART0_RX ();
    #endif
    	
    	//配置USCI_A0用于UART模式
    	UCCCTL1 =(1<0);//EULW0_RX										;USCI_AXST = UWST_UST_USTRF_USST //将eUSCI置于RESET中
    	//UCAxCTLW0|= EUSCI_A_CTLW0_sel__SMCLK;	//UCAxCTLW0 |= UCSSEL__SMCLK; // CLK = SMCLK
    	UCAxCTL0 =		(0<7)|//0->					禁用奇偶校验,1->启用奇偶
    										校验(0<6)|//0->奇偶校验,1->偶校验
    					(0<5)|//0->lsb					优先,1->MSB优先
    					(0<4)|//0<-0/0>0					
    										位
    										数据模式/0<-0<-0>1</0>0位 1->idle line multiprocessor mode,1->address-bit multiprocessor mode,3->UART mode with automatic baud rate detection
    					(0<0)|//0->asynchronous					mode,1->synchronous mode
    					0x00;
    	ustr1 =		(2<6)|//0->uclk					,1->aclk,2->smclk,synchronous mode 0x00;ustel =(2<6<6<6>ordlk
    										)
    					|//0->					收到的中断字符不设置ucrxifg,1->收到的中断字符集ucrxifg
    					(0<3)|//0->					不休眠。收到的所有字符集ucrxifg,1->休眠
    					(0<2)|//0->					下一个传输的帧是数据,1->下一个传输的帧是地址
    					|/0<- 					1->transmited下一帧为break;
    					(1<0)|//0->reset					disabled. Reset USCI reset released for operation.(<0)|//0->reset已禁用。已释放USCI重置以进行操作。) 1->USCI保持复位
    					0x00;
    	//波特率计算
    	// 80万/(16*9600)=9600= 52.083
    	//分数部分= 0.083
    	//用户指南表21-4:UCBRSx = 0x04
    	// UCBRFx = int ((UART-52)*16 52.083)=1
    
    	//请参阅数据表中的22.3 10部分
    	//步骤1
    	/ INTN =
    	IF (INTN > 16){
    		//step 3 -高频模式,16过采样
    		OS16 = 1;BRX = INTN / 16;brfx = INTN -(BRX * 16);brsx = 0;
    	}else{
    		//step 2 -低频模式
    		OS16 = 0;BRX = INTN;brfx = 0; Brsx = INTN * 8 -(BRX * 8);		//brfx忽略
    	}
    	//步骤4 -可选
    	//fractN =(F_UART - INTN * bps)* 1万ul / bps;
    	//brsx = 0;									//默认为0
    	//BRX=104;brsx=1;brfx=0;OS16=0;
    
    	如果基于fractx 0,则查找#0
    	如果(fractN <(0 + 529)/ 2) brsx = 0x00;
    		否则,如果(fractN <((529 + 715)/ 2)) brsx = 0x01;
    		否则,如果(fractN <((715 + 835)/ 2)) brsx = 0x02;
    		ELSE IF (frcN <((835 + 1001)/ 2)) brsx = 0x04;
    		ELSE IF (frcN <((1001 + 1252)/ 2) brsx = 0x08;
    		ELSE IF (frcN <((1252 + 1430)/ 2)) brsx = 0x10;
    		ELSE IF (frcN <(((((((1430 + 1670)/ 2)= 0x20)))))))))))
    		否则,如果(fractN <(1670 + 2147)/ 2) brsx = 0x11;
    		否则,如果(fractN <((2147 + 2224)/ 2)) brsx = 0x21;
    		否则,如果(fractN <((2224 + 2503)/ 2)) brsx = 0x22;
    		否则,如果(fractN <((((((2503 + 2224)= 3000)))/ s2)
    		否则,如果(fractN <((3000 + 3335)/ 2)) brsx = 0x25;
    		如果(fractN <((3335 + 3575)/ 2)) brsx = 0x49;
    		否则,如果(fractN <((3575 + 3753)/ 2)) brsx = 0x4a;
    		否则,如果(fractN <(((((3753 + 3553)= 4003))/)
    		否则,如果(fractN <((4003 + 4286)/ 2) brsx = 0x92;
    		否则,如果(fractN <((4286 + 4378)/ 2)) brsx = 0x53;
    		如果(fractN <((4378 + 5002)/ 2)) brsx = 0x55;
    		否则,如果(fractN <((((5002 + 572)= AA) x)
    		否则,如果(fractN <((5715 + 6003)/ 2) brsx = 0x6b;
    		如果(fractN <((6003 + 6254)/ 2)) brsx = 0xad;
    		如果(fractN <(((6254 + 6432)/ 2))) brsx = 0xb5;
    		否则,如果(0xbN <((((((6432 + 6b)= 666))));s67)
    		否则,如果(frecN <(6667 + 7001)/ 2) brsx = 0xd6;
    		否则,如果(frecN <((7001 + 7147)/ 2)) brsx = 0xbx 7;
    		否则,如果(frecN <((7503 + 7861)/ 2)) brsx = 0x800bb;
    		否则,如果(frecN <((((((((7861 + 7xx x = 2)))))) s 4)
    		如果(fractN <((8004 + 8333)/ 2)) brsx = 0xED;
    		如果(fractN <((8333 + 8464)/ 2)) brsx = 0xee;
    		如果(fractN <((8464 + 8572)/ 2)) brsx = 0xbf;
    		如果(fractN <((8572 + 8572 = 0xf);s51)
    		ELSE IF (frcN<(8751 + 9004)/ 2) brsx = 0xef;
    		ELSE IF (frcN<((9004 + 9170)/ 2)) brsx = 0xfb;
    		ELSE IF (frcN <(((9170 + 9288)/ 2))) brsx = 0xFD;
    		ELSE brsx = 0xFE;
    #endif
    
    	UCAxBR0=BRX;								//LSB
    	UCAxBR1=BRX>8;								//MSB
    	//UCAxBR0 =52; // 8万/16/9600
    	//UCAxBR19600 //UCAxBR1 = 0x00;
    	//UCAxMCTLW |= UCOS16 | UCBRF_1;
    	UCAxMCTL =		((brfx和0x0F)<4)|//ucbrsx		:第二调制阶段选择
    					((brsx和0x07)<1)|//first/xf0		
    										调制/0x0已启用;以上<0:/0x1= 0调制/0
    					
    	
    	
    								//工作频率为3MHz
    	//UCAxMCTLW = 0x00a1;
    
    	//UCAxCTLW1 =	(3<0)|//0->DEWILCH					= 2ns,1->DEWILLCH = 50ns,2->DEWILLCH = 100ns,3->DEWILLCH = 200ns
    	//				0x00;
    
    	//UCRXIE || //启用USCI_A0 RX中断
    	UCAxIFG &=~(UCAxTXIFG | UCAxRXIFG);			//清除所有标记
    	UCAxIE &=~(UCAxTXIE | UCAXRXIE);				//禁用所有中断
    
    	//UCAxCTLW0 &=~UCSWRST; //初始化eUSCI
    	UCAxCTL1&&~(1<0);//0->							版本重置,1->启用重置
    }
    

    我的发送程序如下所示:

    		//print uRAM to uart0/2
    		if (!uart0_busy()) uart0_puts(uRAM);
    

    相比之下,您的问题看起来像是不精确的频率/波特率,或缓冲区溢出。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    顺便说一句,我的代码来自MSP432和FR5969,因此许多代码都被注释掉了。