TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP430FR2433: msp430fr2433串口接收异常

Part Number:MSP430FR2433Other Parts Discussed in Thread:HDC1080

之前检测串口发现1字节接收确实没有问题,现在发现多字节接收怎么有时候会出现错误的字节?例如:PC串口助手发送 96 A5 5A 69给MSP430,发现有时会出现5A变为10的情况出现

Susan Yang:

能否给出相关代码?另外您使用的是开发板配合串口调试助手来调试?

,

user6518570:

#include "include.h"#define MAX_STRBUF_SIZE32 /* 串口接收的最大数据 */unsigned char g_u32RevCnt = 0;/* 接收字符串自加变量 */
unsigned char gAr32_u8xString[MAX_STRBUF_SIZE]; /* 串口接收字符串数组 *//**********************************************************************函数名称:void Init_GPIO( void )*函数功能:串口IO初始化*入口参数:无*出口参数:无*备注:无
*********************************************************************/
void Init_GPIO( void )
{P2DIR = 0xFF;P2REN = 0xFF;P2OUT = 0x00;}/**********************************************************************函数名称:void Transform_Str(unsigned char l_u8Data)*函数功能:串口发送单字节函数*入口参数:要发送的数据(l_u8Data)*出口参数:无*备注:无
*********************************************************************/
void Transform_Str(unsigned char l_u8Data)
{while(!(UCA1IFG&UCTXIFG));UCA1TXBUF = l_u8Data;
}/**********************************************************************函数名称:int putchar(int ch)*函数功能:putchar重定义函数*入口参数:无*出口参数:无*备注:无
*********************************************************************/
int putchar(int ch)
{UCA1TXBUF = ch;while(!(UCA1IFG & UCTXIFG));return ch;
}/**********************************************************************函数名称:void Usart_Init( void )*函数功能:串口初始化*入口参数:无*出口参数:无*备注:无
*********************************************************************/
void Usart_Init( void )
{Init_GPIO();PM5CTL0 &= ~LOCKLPM5;FRCTL0 = FRCTLPW | NWAITS_1;__bis_SR_register(SCG0);// disable FLLCSCTL3 |= SELREF__REFOCLK;// Set REFO as FLL reference sourceCSCTL0 = 0;// clear DCO and MOD registersCSCTL1 &= ~(DCORSEL_7);// Clear DCO frequency select bits firstCSCTL1 |= DCORSEL_5;// Set DCO = 16MHzCSCTL2 = FLLD_0 + 487;// DCOCLKDIV = 16MHz__delay_cycles(3);__bic_SR_register(SCG0);// enable FLLwhile(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1));// FLL lockedCSCTL4 = SELMS__DCOCLKDIV | SELA__REFOCLK;// set default REFO(~32768Hz) as ACLK source, ACLK = 32768Hz// default DCOCLKDIV as MCLK and SMCLK sourceP2SEL0 |= BIT5 | BIT6;UCA1CTLW0 |= UCSWRST;UCA1CTLW0 |= UCSSEL__SMCLK;// Baud Rate calculation// 16000000/(16*9600) = 8.681// Fractional portion = 0.681// User's Guide Table 14-4: UCBRSx = 0xD6// UCBRFx = int ( (8.681-8)*16) = 11UCA1BR0 = 8;// 16000000/16/115200UCA1BR1 = 0x00;UCA1MCTLW = 0xD600 | UCOS16 | UCBRF_11;UCA1CTLW0 &= ~UCSWRST;// Initialize eUSCIUCA1IE |= UCRXIE;// Enable USCI_A0 RX interrupt__bis_SR_register(GIE);//interrupts enabled}/**********************************************************************函数名称:void USCI_A1_ISR(void)*函数功能:串口接收中断*入口参数:无*出口参数:无*备注:无
*********************************************************************/
#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
{switch(__even_in_range(UCA1IV,USCI_UART_UCTXCPTIFG)){case USCI_NONE: break;case USCI_UART_UCRXIFG://接收中断while(!(UCA1IFG & UCTXIFG));UCA1TXBUF = UCA1RXBUF;__no_operation();break;case USCI_UART_UCTXIFG: break;case USCI_UART_UCSTTIFG: break;case USCI_UART_UCTXCPTIFG: break;default: break;}
}

,

user6518570:

是的 板子是我自己的 串口调试助手负责发送

,

user6518570:

这是为什么呀? 

,

Susan Yang:

我会在之后拿板子测试一下。请您先参考下类似的问题

https://e2echina.ti.com/support/microcontrollers/msp430/f/msp-low-power-microcontroller-forum/107588/msp430-uart 

,

user6518570:

好的

,

user6518570:

我有一个疑问 因为我的工作区内还配置了硬件IIC相关内容,不知硬件IIC的UCTXIFG与串口的UCTXIFG是否会互相影响?虽然前面我加了寄存器前缀(UCB0IFG&UCRXIFG) / (UCA0IFG&UCRXIFG)   但他们同时工时是会互相影响吗?

,

Susan Yang:

单从您现在给出的代码,并没有什么问题。能否给出完整工程,我在开发板上试一下

user6518570 说:不知硬件IIC的UCTXIFG与串口的UCTXIFG是否会互相影响?

您现在i2c使用的是eUSCI_B?

,

user6518570:

1、是的 ,i2c使用的是eUSCI_B。

2.、我根据之前您发的链接,参考了一下在中断里尽量不写while类型的函数,现象有所缓解,好像没有出错的现象,第一次发指令也能正常读取我HDC1080内的温湿度,但是关于UCB0RXBUF的读取第二次就会出错,我不知道是不是串口与硬件IIC之间的影响。温湿度读取函数,单独拿出来是没有问题的; 

3.3515.MSP_I2C_TEST.zip

,

Susan Yang:

user6518570 说:我不知道是不是串口与硬件IIC之间的影响。

这样的话,建议将串口单独拿出来新建工程来测试

,

user6518570:

请问没有接收完的UCA1RXBUF里的数据如何丢弃或者清空,我发现我规定只接收32字节数据,当发送多余32字节时,发现UCA1RXBUF里剩下的数据还存在,会在下一次发送指令时放在第一位覆盖写入

,

Susan Yang:

user6518570 说:请问没有接收完的UCA1RXBUF里的数据如何丢弃或者清空

一般来说,BUF每次满了后都会产生中断,用户能读取BUF中的数据。建议尝试下面的方式

case 2: // 中断向量 2 - 接收中断
rxbuff[ rxcount ] = UCA1RXBUF;
rxcount ++ ;
if((rxcount == 3 ) || (UCA1RXBUF == 0x0D ) )
{rxflag = 1;
}

中断程序里只缓存数据,当检测到特定字符或者到一定数量之后,置位flag,然后根据这个flag 在主程序里处理 buff的数据。

赞(0)
未经允许不得转载:TI中文支持网 » MSP430FR2433: msp430fr2433串口接收异常
分享到: 更多 (0)

© 2024 TI中文支持网   网站地图 鲁ICP备2022002796号-1