3263|6

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

高分求解MSP430F4XX上实现IO模拟UART的例子 [复制链接]

最近做MSP430F4XX上的开发,已经把F1XX的代码移植到F4XX,就是发送时发数据与PC收到的数据不同(例如,430发送FF,PC收到FE),因此把代码贴出来,高分求解!
#define RXD BIT1 // RXD on P1.1
#define TXD BIT0 // TXD on P1.0

// Conditions for 2400 Baud SW UART, ACLK = 32768

#define Bitime_5 0x06    // ~ 0.5 bit length + small adjustment(14/2=7)
#define Bitime 14    // 427us bit length ~ 2341 baud (14/32768=427.246us,32768/14=2340.571428)

unsigned int RXTXData;
unsigned char BitCnt;    //位计数

void TX_Byte (unsigned int TXData);
void RX_Ready (void);

// M.Buccini
// Texas Instruments, Inc
// March 2002
//******************************************************************************

#include
//#include  

void main (void)
{
    WDTCTL = WDTPW + WDTHOLD;    // Stop watchdog timer(关闭看门狗模块)
    FLL_CTL0 |= XCAP14PF;        // Configure load caps(配置振荡器电容)
    CCTL0 = OUT;            // TXD Idle as Mark(捕获/比较寄存器0:输出高电平)
    TACTL = TASSEL0+MC1;        // ACLK, continous mode(定时器A:ACLK时钟,连续计数模式)
    P1SEL = TXD + RXD;        // PP1.0/1 TA0 for TXD/RXD function(TA0引脚功能)
    P1DIR = TXD;            // TXD output on P1(输出引脚)

    _EINT();                        //开中断允许
    // Mainloop
  //  for (;;)
    {
      
       // RX_Ready();        // UART ready to RX one Byte(为等待起始位到来作准备)
       // _BIS_SR(LPM3_bits+GIE);    // Enter LPM3 Until character RXed
        TX_Byte(0x00);        // TX Back RXed Byte Received(回传收到的字节)
        TX_Byte(0xFF);
    }
}


// Function Transmits Character from RXTXData Buffer
void TX_Byte (unsigned int TXData)
{
    RXTXData=TXData;
    BitCnt = 0xA;    // Load Bit counter, 8data + ST/SP(发送10位数据)
    CCR0 = TAR;    // Current state of TA counter(定时器计数器当前值放比较寄存器中)
    CCR0 += Bitime;    // Some time till first bit(后推一位的时间)
    //帧格式:1XXXXXXXX0
    RXTXData |= BIT9;        // Add mark stop bit to RXTXData(填充停止位)
    RXTXData = RXTXData << 1;    // Add space start bit(填充起始位)

    CCTL0 = OUTMOD0+CCIE;        // TXD = mark = idle(置位输出模式,允许中断)
    while ( CCIE & CCTL0);        // Wait for TX completion(等待发送完成)
}


// Function Readies UART to Receive Character into RXTXData Buffer
void RX_Ready (void)
{
    BitCnt = 0x8;                // Load Bit counter(接收8位)
    CCTL0 = SCS+CCIS0+OUTMOD0+CM1+CAP+CCIE; // Sync, Neg Edge, Capture
    //(CCIxB引脚同步下降沿捕获,置位输出模式,允许中断)
}


// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR       //TIMER_A 中断函数
__interrupt void Timer_A (void)
{
    CCR0 += Bitime;    // Add Offset to CCR0(下一定时时间为1位时间)

    // RX(接收字节)
    if (CCTL0 & CCIS0) // RX on CCI0B?(如果CCI0B是捕获输入引脚)
    {
        if( CCTL0 & CAP ) // Capture mode = start bit edge(如果是在捕获模式,则是在等待起始位)
        {
            CCTL0 &= ~ CAP;        // Switch from capture to compare mode(得到起始位后改为比较模式)
            CCR0 += Bitime_5;    //定时位置改到位的中间位置(加半个位的时间)
        }
        else
        {
            RXTXData = RXTXData >> 1;    //先收到的是低位
            if (CCTL0 & SCCI) // Get bit waiting in receive latch
                RXTXData |= 0x80;    //SCCI中锁存的是比较相等时的输入引脚上的信号

            BitCnt --; // All bits RXed?    //位计数减1
            if ( BitCnt == 0)        //接收完一个字节?
            //>>>>>>>>>> Decode of Received Byte Here <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
            {
                CCTL0 &= ~ CCIE; // All bits RXed, disable interrupt(接收完一个字节后禁止中断)
                //_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR)(准备退出低功耗模式)
            }
            //>>>>>>>>>> Decode of Received Byte Here <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
        }
    }
    // TX(发送字节,在进入发送中断前已经置位OUTMOD0)
    else
    {
        if ( BitCnt == 0)        //所有位发送完成
            CCTL0 &= ~ CCIE;    // All bits TXed, disable interrupt(禁止中断)
        else
        {

        if(RXTXData&0x0001)           //状态寄存器C 位是1,还是0?
           CCTL0|=OUTMOD2;           //状态寄存器C 位为1,发送1.
           
        else
           CCTL0&=~OUTMOD2;         //状态寄存器C 位为0,发送0.
        
            RXTXData = RXTXData >> 1;    //低位先发
            BitCnt --;            //位计数
        }
    }
}

最新回复

自己搞定了: http://blog.eeworld.net/hellogv/archive/2010/01/08/5157906.aspx  详情 回复 发表于 2010-1-8 15:13
点赞 关注

回复
举报

80

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
建议发送0x55试试,看是不是老最后一位出错。这样的问题只有慢慢分析,找到错误点,否则你就这样贴出程序让别人回答,相信没人会看你的程序。
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
建议发送0x55试试,看是不是老最后一位出错。这样的问题只有慢慢分析,找到错误点,否则你就这样贴出程序让别人回答,相信没人会看你的程序。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

4
 
发送AA和FF都没事,发送00,PC就显示02,发送AB,BC,PC就显示57,79....
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

5
 
楼主估计波特率存在一定误差。 定时不准
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
速率误差太大
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

7
 
自己搞定了:
http://blog.eeworld.net/hellogv/archive/2010/01/08/5157906.aspx
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表