[技术问答]

N76E003串口的奇怪问题

[复制链接]
6292|16
手机看帖
扫描二维码
随时随地手机跟帖
suninhz|  楼主 | 2017-12-22 11:39 | 显示全部楼层 |阅读模式
用的新唐BSP里的UART0例子。在Common.c里新加一个发送字符串的子函数:
void Send_String_To_UART0( UINT8 *string )
{
        while( *string )
        {
                Send_Data_To_UART0( *string++ );
        }
}

然后在uart.c里面调用它。再延时了一下。
void main (void)
{

#if 0       
    InitialUART0_Timer1(9600);           //UART0 Baudrate initial,T1M=0,SMOD=0
    while(1)
    Send_Data_To_UART0(0x55);
#else
                InitialUART0_Timer3(19200);
    while(1)
                {       
    //Send_Data_To_UART0(0x55);
                //Send_Data_To_UART0(0x0a);
                Send_String_To_UART0("test\r\n");
                Timer0_Delay1ms(3000);
                }
#endif

keilc仿真输出是 test  没错。 硬件测试,在串口调试助手上 却成了 QStT 。

哪位高手知道是怎么回事吗?  谢谢
gejigeji521| | 2017-12-22 19:46 | 显示全部楼层
波特率的问题吧。

使用特权

评论回复
挖东衣宇| | 2017-12-22 20:38 | 显示全部楼层
先在程序开头打印一些无关的东西,比如printf("hello");

使用特权

评论回复
gejigeji521| | 2017-12-22 21:28 | 显示全部楼层
上面说的有道理,先调用print看看能否正确。

使用特权

评论回复
suninhz|  楼主 | 2017-12-23 12:01 | 显示全部楼层
挖东衣宇 发表于 2017-12-22 20:38
先在程序开头打印一些无关的东西,比如printf("hello");

只有一个printf也不行。

使用特权

评论回复
suninhz|  楼主 | 2017-12-23 12:02 | 显示全部楼层
gejigeji521 发表于 2017-12-22 21:28
上面说的有道理,先调用print看看能否正确。

只有一个printf(”abcd“);   也不行。

使用特权

评论回复
suninhz|  楼主 | 2017-12-23 15:42 | 显示全部楼层
重新做main函数再测试结果如下:
main函数为
================================
#include "N76E003.h"
#include "Common.h"
#include "Delay.h"
#include "SFR_Macro.h"
#include "Function_define.h"

/******************************************************************************
* FUNCTION_INPUTS : P0.7(RXD) serial input
* FUNCTION_OUTPUTS: P0.6(TXD) serial output
******************************************************************************/
void main (void)
{
UINT8  i;
UINT16 j;
                InitialUART0_Timer3(9600);               
    while(1)
                {                                               
                        for(i=0;i<100;i++)
                                for(j=0;j<0xffff;j++);
                        //set_P06;
                        //set_P07;
                        Send_Data_To_UART0(0x56);
                       
                        for(i=0;i<100;i++)
                                for(j=0;j<0xffff;j++);                       
                        set_P06;
                        set_P07;
                        //Send_Data_To_UART0(0x46);                                               
                        Send_Data_To_UART0(0x55);
                }                                               
}
======================================
测试结果为:
1,根据数据手册122页,”注意,在使用串口功能前,串口所用管脚P0.7及 P0.6 (RXD 及 TXD引脚) 或者 P0.2
及 P1.6 (RXD_1 及 TXD_1)必须先置1。“内容,在发送字节前加了2句   set_P06;set_P07; 实测发现有没有这两句都一样。
2,main函数里使用 发送0X56,0X46,0X55 字段 , 串口助手实际收到的数据是 2A AE 15 。 所有数据都错误。
3,main函数里使用 发送0X56,0X55 字段 , 串口助手实际收到的数据是 2A 55 。 一个数据对,一个数据错误。
疑问:
1,如果波特率不对,应该一个数据都不应该对。
2,排除了硬件干扰,因为每次接收的数据都是一样的。没有变化。
3,发送0x55前,发送0x46,就导致发送0x55错误。

使用特权

评论回复
座机呀| | 2017-12-23 17:30 | 显示全部楼层
我产品里用n76e003跑38400没一点问题,要么是芯片坏了,要么是代码问题,要么是TTL-USB有问题.

使用特权

评论回复
座机呀| | 2017-12-23 17:32 | 显示全部楼层
IO口数据寄存器上电默认值就是全1,加不加那个set_P06;set_P07;结果都一样

使用特权

评论回复
cabbageybc| | 2018-1-6 09:30 | 显示全部楼层
suninhz 发表于 2017-12-23 12:02
只有一个printf(”abcd“);   也不行。

我也遇到了楼组的问题,N76E003 波特率115200 已经调整内部时钟为16.6M,发送0x55是正确的,发送0x23变成0x83  误码率过高。

使用特权

评论回复
xuanhuanzi| | 2018-1-8 11:11 | 显示全部楼层
while是不是写的有问题。

使用特权

评论回复
suninhz|  楼主 | 2018-1-9 21:35 | 显示全部楼层
各位,我犯了个很弱智的毛病。 最后发现是232电平不匹配。N76E003如果与电脑的COM口(包括USB转的串口)通信,还是要中间加电平转换芯片(比如MAX232等)的。

使用特权

评论回复
suninhz|  楼主 | 2018-1-9 21:37 | 显示全部楼层
座机呀 发表于 2017-12-23 17:32
IO口数据寄存器上电默认值就是全1,加不加那个set_P06;set_P07;结果都一样

谢谢指教

使用特权

评论回复
suninhz|  楼主 | 2018-1-9 21:37 | 显示全部楼层
座机呀 发表于 2017-12-23 17:30
我产品里用n76e003跑38400没一点问题,要么是芯片坏了,要么是代码问题,要么是TTL-USB有问题. ...

嗯。你是对的

使用特权

评论回复
sushaowen| | 2018-3-30 15:04 | 显示全部楼层
座机呀 发表于 2017-12-23 17:30
我产品里用n76e003跑38400没一点问题,要么是芯片坏了,要么是代码问题,要么是TTL-USB有问题. ...

串口例程初始化和中断接收部分能不能发出来看看

使用特权

评论回复
座机呀| | 2018-4-3 17:44 | 显示全部楼层
sushaowen 发表于 2018-3-30 15:04
串口例程初始化和中断接收部分能不能发出来看看

void Uart0_Callback(void)
{
        if(RI)
        {//接收到停止位进
                RI = 0;
                //Fill Buffer
                mUART0.RxBuffer[mUART0.RxCnt++] = SBUF;
                //Clear Idle Timer
                mUART0.IdleTime = 0;
                b_start_flag |= f_uart_rx_start;
                //Clear Over Timer
                mUART0.NoActTimes = 0;
                mUART0.WaitAckTime = 0;
                b_start_flag &=~f_wait_uart_start;
        }
        if(TI)
        {//发送完数据的最后一位进
                TI = 0;
                //Fill Buffer
                if(mUART0.TxCnt < mUART0.TxLen)
                {
                        SBUF = mUART0.TxBuffer[mUART0.TxCnt++];
                }
                else
                {
                        //复位发送计数器
                        mUART0.TxCnt = 0;
                        mUART0.TxLen = 0;
                        //开始超时计时
                        b_start_flag |= f_wait_uart_start;
                }
        }
}
void UART0_Open(void)
{
#ifdef UART0
        //TX---P07---准双向
        P07 = 1;
        P0M1 &=~BIT7;
        P0M2 &=~BIT7;
       
        //RX---P06---准双向
        P06 = 1;
        P0M1 &=~BIT6;
        P0M2 &=~BIT6;
       
       
        SCON = 0x50;                                      //UART0 Mode1,REN=1
        TMOD |= 0x20;                                     //Timer1 Mode2
       
        PCON    |=  BIT7;
        CKCON   |=  BIT4;
        T3CON   &= ~BIT5;        //Serial port 0 baud rate clock source = Timer1
        AUXR1   |=  BIT2;                                 //TX RX 调换位置
       
        TH1 = 256 - (1037500/38400);                /*16.6 MHz */
       
        ES = 1;                                                                          //UART0 中断使能
        TR1 = 1;                                                                 //打开TIMER1
#endif
//#ifdef UART1
//        P02 = 1;
//        P16 = 1;
//        P0M1 &=~(BIT2);
//        P0M2 &=~(BIT2);
//        P1M1 &=~(BIT6);
//        P1M2 &=~(BIT6);       
//       
//        SCON_1 = 0X50;                                        //UART1 Mode1,REN_1=1
//        T3CON &=~BIT3;
//        T3CON &=~(BIT0+BIT1+BIT2);//T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1)
//       
//        RH3    = (u8)(((65536 - (1037500/38400)) & 0XFF00)>>8);                          /*16.6 MHz */
//        RL3    = (u8)(65536 - (1037500/38400));                                /*16.6 MHz */
//       
//        EIE1 |= BIT0;//使能UART1中断
//       
//        T3CON |= BIT3;//使能定时器3
//#endif

}
static void Modify_HIRC_Value(void)//微调内部高速晶振,减少串口误码率
{
        bit BIT_TMP;
        unsigned char hircmap0,hircmap1;
        unsigned int trimvalue16bit;
        set_IAPEN;
        IAPAL = 0x30;
        IAPAH = 0x00;
        IAPCN = 0X04;
        set_IAPGO;
        hircmap0 = IAPFD;
        IAPAL = 0x31;
        IAPAH = 0x00;
        set_IAPGO;
        hircmap1 = IAPFD;
        clr_IAPEN;
        trimvalue16bit = ((hircmap0<<1)+(hircmap1&0x01));
        trimvalue16bit = trimvalue16bit - 15;
        hircmap1 = trimvalue16bit&0x01;
        hircmap0 = trimvalue16bit>>1;
        TA=0XAA;
        TA=0X55;
        RCTRIM0 = hircmap0;
        TA=0XAA;
        TA=0X55;
        RCTRIM1 = hircmap1;

}

使用特权

评论回复
liushiming82| | 2018-12-12 21:55 | 显示全部楼层
楼主,你的问题解决了没?,如何解决呀,谢谢说一下

使用特权

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

本版积分规则

2

主题

18

帖子

0

粉丝