在线情况
楼主
  • 头像
  • 级别
    • 积分3
    • 经验64
    • 文章2
    • 注册2012-06-06
    MSP430普通IO模拟串口的问题,读取数据老不对
    [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


    }
    微控网感谢您的参与
    在线情况
    2
    • 头像
    • 级别
    • 门派
    • 职务总版主
    • 声望+9
    • 财富5
    • 积分3065
    • 经验390701
    • 文章6744
    • 注册2006-03-07
    哥,要不你看看这个:
    “利用TimerA模拟UART功能的详细例程与解说”
    [URL=http://www.microcontrol.cn/bbs/a/a.asp?B=112&ID=15937]http://www.microcontrol.cn/bbs/a/a.asp?B=112&ID=15937[/URL]
    [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
    在线情况
    3
    • 头像
    • 级别
      • 积分3
      • 经验64
      • 文章2
      • 注册2012-06-06
      这个我看过啊,我那个原理和这个一样的
      微控网感谢您的参与
      在线情况
      4
      • 头像
      • 级别
      • 门派
      • 职务总版主
      • 声望+9
      • 财富5
      • 积分3065
      • 经验390701
      • 文章6744
      • 注册2006-03-07
      [P][QUOTE][B]下面引用由[U]laa[/U]发表的内容:[/B]
      这个我看过啊,我那个原理和这个一样的
      [/QUOTE]
      可是我以前实验是是能跑通的,你的却跑不起来...。再细心研究研究...。[/P]
      [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
      Powered by LeadBBS 9.2 .
      Page created in 0.1875 seconds with 5 queries.