小弟初来乍到,今天碰到了这个问题,希望帮忙找找原因,万分感谢。
背景:和上位机通信,需要使用一个串口,我用的是UCA3(P10.4,5),还需要一个串口和另外的单片机通信,我使用的是UCA1(P5.6,7),通过芯片SP3232EEP进行RS232电平转换,每个串口用一个SP3232;现在的问题是,当单独使用一个串口时,无法收发数据,即将UCA1的SP3232芯片拆掉后,UCA3可以正常收发数据,或者将UCA3的SP3232拆掉后,UCA1可以正常收发数据,但是只要是两个SP3232都连上,就都无法收发数据,一个是收不到数据,另一个串口通过串口调试助手发现一直在发0;硬件电路如附件。程序如下(该程序只使用一个串口,两个SP3232都连上就无法收发数据,只连一个SP3232就可以正常收发)
#include<msp430f5438.h>
int s=0,i=0;
int BridgeVolts12[360];
int D; //DAC幅值数字量
//函数Init_Clk(void)
//功能:初始化主时钟,MCLK=XT2,SMCLK=XT2
void Init_CLK (void)
{
WDTCTL = WDTPW + WDTHOLD; // 关看门狗
P5SEL |= BIT2+BIT3; //端口功能选择晶振
UCSCTL6 &= ~XT2OFF; //使能晶体振荡器
UCSCTL6 |= XT2DRIVE_3; //XT2驱动模式最高
UCSCTL3 |= SELREF_2; //FLL时钟参考源为REFOCLK
UCSCTL4 |= SELA_2; //选择时钟源,ACLK=REFO,SMCLK=MCLK=DCO
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // 清除XT2,XT1,DCO错误标志
SFRIFG1 &= ~OFIFG;
}while(SFRIFG1&OFIFG); // 检测振荡器错误标志
UCSCTL4 |=SELS_5+SELM_5; //SMCLK=MCLK=XT2=16MHz;
}
//函数Init_UART(void)
//功能:USCI_A3 UART模式初始化设置,以SMCLK=16MHz为参考时钟
void Init_UART(void)
{
UCA3CTL1 |=UCSWRST;
P10SEL |= BIT4+BIT5; //使能USCI_A3通信模块的收发引脚
//UCA3CTL1 |=UCSWRST; //置位寄存器设置
UCA3CTL1 |=UCSSEL_2; //波特率发生器参考时钟为SMCLK,SMCLK=16MHz
UCA3BR0=104; //波特率设置为9600bps
UCA3BR1=0;
UCA3MCTL=UCBRS_0+UCBRF_3+UCOS16; //调制器设置,选择过采样模式
UCA3CTL1&= ~UCSWRST; //完成USCI_A3初始化配置
UCA3IE |=UCRXIE; //使能USCI_A3接收中断
//_EINT();
}
//函数Init_TimerA0(void)
//功能:初始化定时器A0
void Init_TimerA(void)
{
TA0CTL = 0; //将TA0控制寄存器清零,输入分频设为1
TA0CTL |= TACLR; //Timer_A clear
TA0CTL |= TASSEL_2; //TA0时钟源选为SMCLK;
TA0CCR0 = 891; // SMCK=XT2=16MHz,设置计数器溢出时间
TA0CCTL0 = 0; //TA0捕获/比较寄存器清零
TA0CTL |= MC_1; //TA0增计数模式
TA0CCTL0 |= CCIE; //使能比较中断
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Int_TimerA0(void)
{
P2OUT = BridgeVolts12[s];
//P1OUT = P2OUT;
s++;
if(s==360)
{
s=0;
}
}
void main(void)
{
WDTCTL = WDTPW+WDTHOLD;
Init_CLK(); //时钟系统初始化
//P5DIR |= BIT4; // 主电源打开
//P5OUT |= BIT4;
P8DIR |= 0xff;
P8OUT |= 0x7a;
//P1DIR |= 0xff;
//P1OUT |= 0xff;
P2DIR |= 0xff; //设置P6输出
P2OUT |= 0x00;
Init_UART(); //通讯初始化
//while(i<360); //判断接收数据的个数
//_DINT();
Init_TimerA(); //定时器初始化
_EINT(); //开总中断
while(1);
}
#pragma vector=USCI_A3_VECTOR
__interrupt void USCI_A3_ISR(void)
{
switch (__even_in_range(UCA3IV,4))
{
case 0:break;
case 2:
//while(!(UCA3IFG&UCTXIFG));
if(i<360)
{
while(!(UCA3IFG&UCTXIFG)); //判断上一次发送是否完成
BridgeVolts12[i]=UCA3RXBUF; //将接收到的数据存入数组
i++;
UCA3TXBUF=UCA3RXBUF; //将接收到的数据压入发送缓冲寄存器,发送给PC,在串口调试助手中回显
}
else
{
while(!(UCA3IFG&UCTXIFG));
P8OUT=UCA3RXBUF;
UCA3TXBUF=UCA3RXBUF;
}
break;
case 4:break;
default:break;
}
}
此帖出自
小平头技术问答
一周热门 更多>