为什么串口波形不对呢?

[复制链接]
3260|23
 楼主| 与时俱进 发表于 2013-10-22 21:53 | 显示全部楼层 |阅读模式
做串口实验,把串口接到PC的仿真终端,在程序中把从PC收到的字符发送给PC,实验不成功,于是,修改程序,不断从串口用 TXBUF0=0XAA 发送字符(二进制10101010),用示波器测量tx端波形,如图,发现各个位的宽度不同,图中的第2、第5位特别宽,是什么原因呢?


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
dirtwillfly 发表于 2013-10-22 22:00 | 显示全部楼层
能把你的程序贴出来看看么
 楼主| 与时俱进 发表于 2013-10-22 22:19 来自手机 | 显示全部楼层
dirtwillfly 发表于 2013-10-22 22:00  能把你的程序贴出来看看么

前面与PC实验,是在接收中断中用TXBUF0=RXBUF0语句实现回显,实际结果终端上少数按键有回显,多数没有。程序在单位电脑里。很纳闷,用串口模块,什么样的程序能造成各个位宽不一样呢?
 楼主| 与时俱进 发表于 2013-10-23 09:30 | 显示全部楼层
dirtwillfly 发表于 2013-10-22 22:00
能把你的程序贴出来看看么

#include <MSP430x14x.h>

#define USART_DIR P3DIR
#define USART_SEL P3SEL
#define USART_IN  P3IN
#define USART_OUT P3OUT
#define UTXD0 BIT4
#define URXD0 BIT5

void InitSys();                                                         //初始化

int main( void )
{
        unsigned char q0;
        unsigned char *pq0;
          WDTCTL = WDTPW + WDTHOLD;                   //关闭看门狗
          InitSys();       
start:
        {
                  while((IFG1&UTXIFG0)==0);        //查询是否发送完毕
                TXBUF0=0xaa;
        }
        goto start;
}

void UartInit()
{
        USART_SEL |= UTXD0 +URXD0;    //设置管脚为第二功能
        UCTL0 = CHAR+PENA+SWRST;      //8位数据,1位停止位,奇校验
        UTCTL0 = SSEL0;               //选择UCLK = ACLK
        UBR00 = 0x3;                  //设置波特率9600bit/s
        UBR10 = 0;
        UMCTL0 = 0x4a;
        UCTL0 &= ~SWRST;
        ME1 |= UTXE0 + URXE0;              //打开模块USART0
//        IE1 |= URXIE0 ;                        //打开USART0接收中断
}

/*****************************************************************************
系统初始化
******************************************************************************/
void InitSys()
{
   unsigned int iq0;

   BCSCTL1&=~XT2OFF;                                                     //打开XT2振荡器
   do
   {
                IFG1 &= ~OFIFG;                                                        // 清除振荡器失效标志
                for (iq0 = 0xFF; iq0 > 0; iq0--);        // 延时,等待XT2起振
        }
        while ((IFG1 & OFIFG) != 0);                                // 判断XT2是否起振

        BCSCTL2 =SELM_2;                                                                //选择MCLK为XT2

        UartInit();                                                                                //初始化USART0
        _EINT();                        //打开全局中断控制,若不需要打开,可以屏蔽本句
}
dirtwillfly 发表于 2013-10-23 09:52 | 显示全部楼层
UCTL0 = CHAR+PENA+SWRST;      //8位数据,1位停止位,奇校验
这个就应该是这波形啊。当0xaa传输完毕后,就是校验位、停止位
gaochy1126 发表于 2013-10-23 10:51 | 显示全部楼层
你可以看看相关的串口协议。
gaochy1126 发表于 2013-10-23 10:52 | 显示全部楼层
先发送起始信号 然后是数据  校验位 停止位。
gaochy1126 发表于 2013-10-23 10:53 | 显示全部楼层
楼主看看接收到的数据不就行了么?
 楼主| 与时俱进 发表于 2013-10-23 14:50 | 显示全部楼层
gaochy1126 发表于 2013-10-23 10:53
楼主看看接收到的数据不就行了么?

本来就是因为接收和发送不正常,才去看波形的。串口协议方面理解不会有偏差,在MODEM年代就一直跟串口打交道。
请大家注意,波形是各个位时间上(位宽)不对,有的位约120us,有的位90us。
 楼主| 与时俱进 发表于 2013-10-23 14:53 | 显示全部楼层
dirtwillfly 发表于 2013-10-23 09:52
UCTL0 = CHAR+PENA+SWRST;      //8位数据,1位停止位,奇校验
这个就应该是这波形啊。当0xaa传输完毕后, ...

谢谢。
我指的是波形各个位时间上(位宽)不对,有的位约120us,有的位90us,不是指逻辑电平0或者1的错误。
dirtwillfly 发表于 2013-10-23 15:10 | 显示全部楼层
奇怪的问题
dirtwillfly 发表于 2013-10-23 16:18 | 显示全部楼层
晕死,刚又看一下你的程序。
发现:
        UTCTL0 = SSEL0;               //选择UCLK = ACLK
        UBR00 = 0x3;                  //设置波特率9600bit/s
        UBR10 = 0;
        UMCTL0 = 0x4a;
你肯定是使用的32.768kHz的外部晶振,选择了波特率9600
所以需要分频3.41,分频玉漱0.41*8=3.28,取最接近的整数3,将3个1均匀分布在8bit中,于是选择UMCTL0 = 0x4a,0x4a就是0100 1010,所以你的8bit中,第2、5、7位时间就比其他位时间长。
dirtwillfly 发表于 2013-10-23 16:21 | 显示全部楼层
问题解决

评论

牛x  发表于 2013-10-24 09:41
 楼主| 与时俱进 发表于 2013-10-23 20:41 来自手机 | 显示全部楼层
dirtwillfly 发表于 2013-10-23 16:18
晕死,刚又看一下你的程序。
发现:
        UTCTL0 = SSEL0;               //选择UCLK = ACLK

佩服佩服!原来Msp430是这样调整串口的速率啊?我得查查资料学习学习。谢啦!
 楼主| 与时俱进 发表于 2013-10-23 21:35 来自手机 | 显示全部楼层
dirtwillfly 发表于 2013-10-23 16:18
晕死,刚又看一下你的程序。
发现:
        UTCTL0 = SSEL0;               //选择UCLK = ACLK

我觉得小数部分乘以8不够合理,因为总的位数是一个起始位,八个数据位,一个校验位,一个停止位,共11位,小数部分乘以11是不是使波特率更精确呢?
dirtwillfly 发表于 2013-10-23 21:53 | 显示全部楼层
与时俱进 发表于 2013-10-23 21:35
我觉得小数部分乘以8不够合理,因为总的位数是一个起始位,八个数据位,一个校验位,一个停止位,共11位 ...

:lolTI就是这样设定的。
一般来讲,控制位比数据位更重要。数据位错误,可以重新发送或者丢弃。而如果控制位错误,很大可能会导致通讯失败。
TJU_lixiao 发表于 2013-10-24 08:56 | 显示全部楼层
好帖好帖。。学习了!

dirtwillfly  V5!
dirtwillfly 发表于 2013-10-24 09:44 | 显示全部楼层
 楼主| 与时俱进 发表于 2013-10-24 09:44 | 显示全部楼层
dirtwillfly 发表于 2013-10-23 16:18
晕死,刚又看一下你的程序。
发现:
        UTCTL0 = SSEL0;               //选择UCLK = ACLK

这样看来,用32k晶体做波特率发生器,9600bps几乎是能达到的上限速率了。
TJU_lixiao 发表于 2013-10-24 09:46 | 显示全部楼层
dirtwillfly 发表于 2013-10-23 21:53
TI就是这样设定的。
一般来讲,控制位比数据位更重要。数据位错误,可以重新发送或者丢弃。而如果控 ...

我看了看user‘s guide   感觉是应该乘以11  
n:  Total number of bits in the character

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

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

本版积分规则

75

主题

1290

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部