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.

关于MSP430F5638 串口输入中断问题.

Other Parts Discussed in Thread: MSP430F5638, TMS320F28335

请教专家:

我采用MSP430F5638的UCA0 与 TMS320F28335的Scic口进行通信:

MSP430F5638的程序如下:

#include <intrinsics.h>
#include <string.h>
#include "msp430.h"
#include "driverlib/MSP430F5xx_6xx/flash.h"
#include "driverlib/MSP430F5xx_6xx/wdt_a.h"
#include "driverlib/MSP430F5xx_6xx/ucs.h"
#include "driverlib/MSP430F5xx_6xx/pmm.h"
#include "driverlib/MSP430F5xx_6xx/sfr.h"
#include "driverlib/MSP430F5xx_6xx/inc/hw_memmap.h"
#include "IQmathLib.h"
#include "hal.h" // Modify hal.h to select your hardware

#include "Main_F5528_Scan.h"

void INIT_SciB_Char(void);


void main(void)
{

WDTCTL = WDTPW + WDTHOLD; // Stop Watchdog Timer
// for 24MHz MCLK, below.
PMM_setVCore(PMM_BASE, PMM_CORE_LEVEL_3);

initPorts(); // Config all the GPIOS for low-power (output low)
initClocks(24000000); // Config clocks.

P8SEL |= BIT2 + BIT3; // P3.3,4 = USCI_A0 RXD/TXD 触摸屏通信
UCA1CTL1 |= UCSWRST; // 重置UCA0
UCA1CTL1 |= UCSSEL_2; // SMCLK 6MHz
UCA1BR0 = 0x71; // 波特率9600
UCA1BR1 = 0x02; // 波特率9600
UCA1MCTL = 0x00; // No Modulation
UCA1CTL1 &= ~UCSWRST; // **Initialize USCI state machine**

P2SEL |= BIT4 + BIT5; // P4.4,5 = USCI_A1 RXD/TXD F28335通信
UCA0CTL1 |= UCSWRST; // 重起UCA1
UCA0CTL1 |= UCSSEL_2; // SMCLK 6MHz
UCA0BR0 = 0x34; // 波特率1152000
UCA0BR1 = 0x00; // 波特率115200
UCA0MCTL = 0x40;
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**

// setup watchdog as 1 second timer 设置在看门狗模式看门狗定时器的时钟源。
// WDT_A_watchdogTimerInit(WDT_A_BASE,WDT_A_CLOCKSOURCE_SMCLK,WDT_A_CLOCKDIVIDER_512K);
// WDT_A_start(WDT_A_BASE);

UCA0IFG = 0x00; // 清UCA0中断标识
UCA0IE = 0x01; // 使能UCA0中断;
UCA0IE |= UCRXIE; // 使能UCA0接收中断;UCRXIE

UCA1IFG = 0x00; // 清UCA1中断标识
UCA1IE = 0x01; // 使能接收中断;
UCA1IE |= UCRXIE; // 使能UCA1接收中断

UCS_getSMCLK(UCS_BASE);
UCS_getMCLK(UCS_BASE);
UCS_getACLK(UCS_BASE);

__enable_interrupt(); // enable interrupts

TX_FuncNO = 4;

for(;;)
{
}
}

#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{

while (!(UCA0IFG&UCRXIFG)); // USCI_A0 TX buffer ready?
RSciA_Char = UCA0RXBUF;

UCA0IFG = 0x00;; //MSP430 清UCA1中断标识
}
//*****************************************************************************
// UART1中断服务子程序。接收触摸屏菜单指令并处理
//*****************************************************************************

#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
{

TX_FuncNO = 4;
//取F28335 存放的样本数据
while(UCA0STAT && UCBUSY){};
UCA0TXBUF = TX_FuncNO;         //发送功能号第1个字节,
while(UCA0STAT && UCBUSY){};
UCA0TXBUF = TX_FuncNO >> 8; //发送功能号第2个字节,

UCA1IFG = 0x00;; //MSP430 清UCA0中断标识
}

问题是:当TMS320F28335连续不断的发送时,MSP430F5638的UCA0会发生读入中断; 但当TMS320F28335单一发送一两个字符时读入中断就不会发生.

这是什么原因呢?怎么解决?

  • 不了解TMS320F28335的Scic。

    单从楼主的代码看,没看出有什么问题。请教楼主,当TMS320F28335连续不断的发送时,MSP430F5638接收到的内容正确吗?