打印
[技术问答]

新塘N76E003串口通信模式3问题

[复制链接]
2902|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

我的配置如下,参考例程的,略有改动

例程配置如下



官方例程串口0模式3是使用定时器1来计算波特率,而我的是使用定时器3来做计算。
问题是这样,接受到数据,但是数据是一些乱的数值,并不是我控制端发送的数据。
我怀疑是波特率不准导致的?我试过改为其他波特率,接收都接收不了数据,所以设定的波特率应该是对的;
硬件也检查过,没问题;
还有就是我这里设定的模式3,(串口0 第9 位接收位
串口0在模式2和3中接收到的第九位数据。模式1下,若SM2=0则RB8是接收到的停
止位。模式0下该位无意义.
上面图片是中断函数接收处理,RB8判断第9位。问题是接收到数据,有时候u16CNT这个数值,可以接收到限定14个数据(数据是错误的),有时候就在中途就直接跳去判断RB8为0了,将u16CNT清0,感觉是接收到的数据不稳定?

很奇怪,不知其他大神有没有遇到过?麻烦指导下,急呢!先谢谢!!!

沙发
dongnanxibei| | 2018-5-14 22:59 | 只看该作者
两个定时器是不是不一样

使用特权

评论回复
板凳
yiyigirl2014| | 2018-5-15 11:28 | 只看该作者
没看明白。

使用特权

评论回复
地板
lizhenming|  楼主 | 2018-5-15 11:58 | 只看该作者
换为用模式2就可以了,搞不懂

使用特权

评论回复
5
小明的同学| | 2018-5-15 16:36 | 只看该作者
怎么不用头文件提供的库函数操作呢。
void InitialUART0_Timer3(UINT32 u32Baudrate) //use timer3 as Baudrate generator
比如这个函数,串口0,使用定是驱动初始化。

使用特权

评论回复
6
小明的同学| | 2018-5-15 16:37 | 只看该作者
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2016 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

//***********************************************************************************************************
//  Nuvoton Technoledge Corp.
//  Website: http://www.nuvoton.com
//  E-Mail : MicroC-8bit@nuvoton.com
//  Date   : Apr/21/2016
//***********************************************************************************************************

#include "N76E003.h"
#include "Common.h"
#include "Delay.h"
#include "SFR_Macro.h"
#include "Function_define.h"

//----------------------------------------------------------------------------------
// UART0 baud rate initial setting
//----------------------------------------------------------------------------------
void InitialUART0_Timer1(UINT32 u32Baudrate)    //T1M = 1, SMOD = 1
{
                P06_Quasi_Mode;                //Setting UART pin as Quasi mode for transmit
                P07_Quasi_Mode;                //Setting UART pin as Quasi mode for transmit
       
    SCON = 0x50;             //UART0 Mode1,REN=1,TI=1
    TMOD |= 0x20;            //Timer1 Mode1
   
    set_SMOD;                //UART0 Double Rate Enable
    set_T1M;
    clr_BRCK;                //Serial port 0 baud rate clock source = Timer1

#ifdef FOSC_160000
    TH1 = 256 - (1000000/u32Baudrate+1);               /*16 MHz */
#endif           
#ifdef FOSC_166000
    TH1 = 256 - (1037500/u32Baudrate);                              /*16.6 MHz */
#endif
    set_TR1;
                set_TI;                                                //For printf function must setting TI = 1
}
//---------------------------------------------------------------
void InitialUART0_Timer3(UINT32 u32Baudrate) //use timer3 as Baudrate generator
{
                P06_Quasi_Mode;                //Setting UART pin as Quasi mode for transmit
                P07_Quasi_Mode;                //Setting UART pin as Quasi mode for transmit       
       
    SCON = 0x50;     //UART0 Mode1,REN=1,TI=1
    set_SMOD;        //UART0 Double Rate Enable
    T3CON &= 0xF8;   //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1)
    set_BRCK;        //UART0 baud rate clock source = Timer3

#ifdef FOSC_160000
                RH3    = HIBYTE(65536 - (1000000/u32Baudrate)-1);                  /*16 MHz */
                RL3    = LOBYTE(65536 - (1000000/u32Baudrate)-1);                        /*16 MHz */
#endif
#ifdef FOSC_166000
    RH3    = HIBYTE(65536 - (1037500/u32Baudrate));                         /*16.6 MHz */
    RL3    = LOBYTE(65536 - (1037500/u32Baudrate));                         /*16.6 MHz */
#endif
    set_TR3;         //Trigger Timer3
                set_TI;                                         //For printf function must setting TI = 1
}

UINT8 Receive_Data_From_UART0(void)
{
    UINT8 c;
    while (!RI);
    c = SBUF;
    RI = 0;
    return (c);
}

void Send_Data_To_UART0 (UINT8 c)
{
    TI = 0;
    SBUF = c;
    while(TI==0);
}


//----------------------------------------------------------------------------------
// UART1 baud rate initial setting
//----------------------------------------------------------------------------------
void InitialUART1_Timer3(UINT32 u32Baudrate) //use timer3 as Baudrate generator
{
                P02_Quasi_Mode;                //Setting UART pin as Quasi mode for transmit
                P16_Quasi_Mode;                //Setting UART pin as Quasi mode for transmit
       
          SCON_1 = 0x50;           //UART1 Mode1,REN_1=1,TI_1=1
    T3CON = 0x08;           //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1), UART1 in MODE 1
                clr_BRCK;
       
#ifdef FOSC_160000
                RH3    = HIBYTE(65536 - (1000000/u32Baudrate)-1);                  /*16 MHz */
                RL3    = LOBYTE(65536 - (1000000/u32Baudrate)-1);                        /*16 MHz */
#endif
#ifdef FOSC_166000
                RH3    = HIBYTE(65536 - (1037500/u32Baudrate));                          /*16.6 MHz */
                RL3    = LOBYTE(65536 - (1037500/u32Baudrate));                                /*16.6 MHz */
#endif
    set_TR3;         //Trigger Timer3
}

UINT8 Receive_Data_From_UART1(void)
{
    UINT8 c;
   
    while (!RI_1);
    c = SBUF_1;
    RI_1 = 0;
    return (c);
}

void Send_Data_To_UART1 (UINT8 c)
{
    TI_1 = 0;
    SBUF_1 = c;
    while(TI_1==0);
}


/*==========================================================================*/
#ifdef SW_Reset
void SW_Reset(void)
{
    TA = 0xAA;
    TA = 0x55;
    set_SWRST;
}
#endif
/*==========================================================================*/

使用特权

评论回复
7
huangcunxiake| | 2018-5-15 18:25 | 只看该作者
不如使用官方的库函数简洁啊。这个串口功能也不是很多。

使用特权

评论回复
8
dongliushui| | 2018-5-19 23:49 | 只看该作者
定时器不是,那就不是模式3了。

使用特权

评论回复
9
gejigeji521| | 2018-5-20 21:41 | 只看该作者
看手册啊,你时钟选择错了

使用特权

评论回复
10
小灵通2018| | 2018-5-21 22:45 | 只看该作者
实现了你的想法了吗

使用特权

评论回复
11
lizhenming|  楼主 | 2018-5-22 08:07 | 只看该作者
小灵通2018 发表于 2018-5-21 22:45
实现了你的想法了吗

我暂时换成了模式2

使用特权

评论回复
12
dongnanxibei| | 2019-4-9 23:11 | 只看该作者
之前看到有个贴说串口的库函数需要改的,不知道是哪儿

使用特权

评论回复
13
643757107| | 2019-4-18 00:14 | 只看该作者
可能不支持哪个模式

使用特权

评论回复
14
643757107| | 2019-4-18 00:14 | 只看该作者
可能这几个端口有点区别。

使用特权

评论回复
15
BigLeo8| | 2019-4-19 17:55 | 只看该作者
学习一哈

使用特权

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

本版积分规则

22

主题

127

帖子

2

粉丝