打印

为什么串口波形不对呢?

[复制链接]
2640|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
做串口实验,把串口接到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();                        //打开全局中断控制,若不需要打开,可以屏蔽本句
}

使用特权

评论回复
5
dirtwillfly| | 2013-10-23 09:52 | 只看该作者
UCTL0 = CHAR+PENA+SWRST;      //8位数据,1位停止位,奇校验
这个就应该是这波形啊。当0xaa传输完毕后,就是校验位、停止位

使用特权

评论回复
6
gaochy1126| | 2013-10-23 10:51 | 只看该作者
你可以看看相关的串口协议。

使用特权

评论回复
7
gaochy1126| | 2013-10-23 10:52 | 只看该作者
先发送起始信号 然后是数据  校验位 停止位。

使用特权

评论回复
8
gaochy1126| | 2013-10-23 10:53 | 只看该作者
楼主看看接收到的数据不就行了么?

使用特权

评论回复
9
与时俱进|  楼主 | 2013-10-23 14:50 | 只看该作者
gaochy1126 发表于 2013-10-23 10:53
楼主看看接收到的数据不就行了么?

本来就是因为接收和发送不正常,才去看波形的。串口协议方面理解不会有偏差,在MODEM年代就一直跟串口打交道。
请大家注意,波形是各个位时间上(位宽)不对,有的位约120us,有的位90us。

使用特权

评论回复
10
与时俱进|  楼主 | 2013-10-23 14:53 | 只看该作者
dirtwillfly 发表于 2013-10-23 09:52
UCTL0 = CHAR+PENA+SWRST;      //8位数据,1位停止位,奇校验
这个就应该是这波形啊。当0xaa传输完毕后, ...

谢谢。
我指的是波形各个位时间上(位宽)不对,有的位约120us,有的位90us,不是指逻辑电平0或者1的错误。

使用特权

评论回复
11
dirtwillfly| | 2013-10-23 15:10 | 只看该作者
奇怪的问题

使用特权

评论回复
12
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位时间就比其他位时间长。

使用特权

评论回复
13
dirtwillfly| | 2013-10-23 16:21 | 只看该作者
问题解决

使用特权

评论回复
评论
与时俱进 2013-10-24 09:41 回复TA
牛x 
14
与时俱进|  楼主 | 2013-10-23 20:41 | 只看该作者
dirtwillfly 发表于 2013-10-23 16:18
晕死,刚又看一下你的程序。
发现:
        UTCTL0 = SSEL0;               //选择UCLK = ACLK

佩服佩服!原来Msp430是这样调整串口的速率啊?我得查查资料学习学习。谢啦!

使用特权

评论回复
15
与时俱进|  楼主 | 2013-10-23 21:35 | 只看该作者
dirtwillfly 发表于 2013-10-23 16:18
晕死,刚又看一下你的程序。
发现:
        UTCTL0 = SSEL0;               //选择UCLK = ACLK

我觉得小数部分乘以8不够合理,因为总的位数是一个起始位,八个数据位,一个校验位,一个停止位,共11位,小数部分乘以11是不是使波特率更精确呢?

使用特权

评论回复
16
dirtwillfly| | 2013-10-23 21:53 | 只看该作者
与时俱进 发表于 2013-10-23 21:35
我觉得小数部分乘以8不够合理,因为总的位数是一个起始位,八个数据位,一个校验位,一个停止位,共11位 ...

:lolTI就是这样设定的。
一般来讲,控制位比数据位更重要。数据位错误,可以重新发送或者丢弃。而如果控制位错误,很大可能会导致通讯失败。

使用特权

评论回复
17
TJU_lixiao| | 2013-10-24 08:56 | 只看该作者
好帖好帖。。学习了!

dirtwillfly  V5!

使用特权

评论回复
18
dirtwillfly| | 2013-10-24 09:44 | 只看该作者
楼主结贴吧。结贴方法:https://bbs.21ic.com/icview-442857-1-1.html

使用特权

评论回复
19
与时俱进|  楼主 | 2013-10-24 09:44 | 只看该作者
dirtwillfly 发表于 2013-10-23 16:18
晕死,刚又看一下你的程序。
发现:
        UTCTL0 = SSEL0;               //选择UCLK = ACLK

这样看来,用32k晶体做波特率发生器,9600bps几乎是能达到的上限速率了。

使用特权

评论回复
20
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

QQ拼音截图未命名.jpg (54.83 KB )

QQ拼音截图未命名.jpg

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

75

主题

1290

帖子

2

粉丝