[LINE-HEIGHT=22px][ALIGN=left][FACE=Helvetica, Arial, sans-serif][BGCOLOR=rgb][SIZE=14px]由于串口不够用,所以用MSP430普通IO模拟串口来读取数据,并将数据通过MSP430自带的串口发送到上位机,即下面的语句TXBYTE1(recvBuff) ,可是读到的数据一直是FF。定时器A采用时钟1MHz,模拟串口速率为9600,IO口为F1611的P2.2,哪位能帮忙看下么?搞了两天了,没搞出来[/SIZE][/BGCOLOR][/FACE][/ALIGN][/LINE-HEIGHT]
[LINE-HEIGHT=22px][ALIGN=left][FACE=Helvetica, Arial, sans-serif][BGCOLOR=rgb][SIZE=14px]#include[/SIZE][/BGCOLOR][/FACE][/ALIGN][/LINE-HEIGHT]
void InitSys();
unsigned char bitTime=100;//每一位数据时间
unsigned char hBitTime=50;//半位数据的时间
unsigned char recvBuff;//接收数据缓冲区,8位,开始位结束位不接收
unsigned char bitCnt=0;//正在接收的数据位标志
#define RXD 0x04 // RXD on P2.2
#define TXD 0x08 // TXD on P2.3
void int_clk()
{
unsigned char i;
BCSCTL1&=~XT2OFF; //打开XT振荡器
BCSCTL2|=SELM1+SELS+DIVS_3;//MCLK 8M and SMCLK 1M
do
{
IFG1 &= ~OFIFG; //清除振荡错误标志
for(i = 0; i < 100; i++)
_NOP(); //延时等待
}
while ((IFG1 & OFIFG) != 0); //如果标志为1继续循环等待
IFG1&=~OFIFG;
}
void main()
{
_DINT(); // 关闭中断
int_clk(); // 初始化时钟
InitSys();
_EINT();
while(1);
}
/*************中断服务程序*****************************/
#pragma vector=TIMERA0_VECTOR
__interrupt void TA0_ISR(void)
{
TACCR0 += bitTime;
switch(bitCnt)
{
case 0:
recvBuff = 0;//清空缓冲区
TACCR0 += hBitTime ;//
TACCTL0 &= ~CAP;
bitCnt++;
break;
case 8:
if(P2IN&RXD)
recvBuff |= BIT7;
else
recvBuff &= ~BIT7;
TXBYTE1(recvBuff); 将模拟串口读到的数据经串口发送到上位机软件
bitCnt++;
break;
case 9:
TACCTL0 |= CAP;
bitCnt = 0;
break;
default:
if(P2IN&RXD)
recvBuff |= BIT7;
else
recvBuff &= ~BIT7;
recvBuff>>=1;
bitCnt++;
break;
}
}
/***********子函数***************/
void InitSys()
{
WDTCTL = WDTPW+WDTHOLD ;//关闭看门狗
TACTL = TASSEL1 + ID_3 + MC_2; //选择MCLK,8分频得1MHz为定时器始钟
P2SEL = RXD; // Set P2.2 to TA0,P2.2 是TA0 捕获比较模式的外部输入口
CCTL0 = SCS + OUTMOD0 + CM1 + CAP + CCIE + CCIS_1; // Sync, Neg Edge, Cap
} |