[技术问答] 新塘N76E003串口通信模式3问题

[复制链接]
3250|14
 楼主| lizhenming 发表于 2018-5-13 22:48 | 显示全部楼层 |阅读模式
QQ图片20180513223930.png
我的配置如下,参考例程的,略有改动

例程配置如下

QQ图片20180513224221.png

官方例程串口0模式3是使用定时器1来计算波特率,而我的是使用定时器3来做计算。
问题是这样,接受到数据,但是数据是一些乱的数值,并不是我控制端发送的数据。
我怀疑是波特率不准导致的?我试过改为其他波特率,接收都接收不了数据,所以设定的波特率应该是对的;
硬件也检查过,没问题;
还有就是我这里设定的模式3,(串口0 第9 位接收位
串口0在模式2和3中接收到的第九位数据。模式1下,若SM2=0则RB8是接收到的停
止位。模式0下该位无意义. QQ图片20180513225045.png
上面图片是中断函数接收处理,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就可以了,搞不懂
小明的同学 发表于 2018-5-15 16:36 | 显示全部楼层
怎么不用头文件提供的库函数操作呢。
void InitialUART0_Timer3(UINT32 u32Baudrate) //use timer3 as Baudrate generator
比如这个函数,串口0,使用定是驱动初始化。
小明的同学 发表于 2018-5-15 16:37 | 显示全部楼层
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2016 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/

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

  12. #include "N76E003.h"
  13. #include "Common.h"
  14. #include "Delay.h"
  15. #include "SFR_Macro.h"
  16. #include "Function_define.h"

  17. //----------------------------------------------------------------------------------
  18. // UART0 baud rate initial setting
  19. //----------------------------------------------------------------------------------
  20. void InitialUART0_Timer1(UINT32 u32Baudrate)    //T1M = 1, SMOD = 1
  21. {
  22.                 P06_Quasi_Mode;                //Setting UART pin as Quasi mode for transmit
  23.                 P07_Quasi_Mode;                //Setting UART pin as Quasi mode for transmit
  24.        
  25.     SCON = 0x50;             //UART0 Mode1,REN=1,TI=1
  26.     TMOD |= 0x20;            //Timer1 Mode1
  27.    
  28.     set_SMOD;                //UART0 Double Rate Enable
  29.     set_T1M;
  30.     clr_BRCK;                //Serial port 0 baud rate clock source = Timer1

  31. #ifdef FOSC_160000
  32.     TH1 = 256 - (1000000/u32Baudrate+1);               /*16 MHz */
  33. #endif           
  34. #ifdef FOSC_166000
  35.     TH1 = 256 - (1037500/u32Baudrate);                              /*16.6 MHz */
  36. #endif
  37.     set_TR1;
  38.                 set_TI;                                                //For printf function must setting TI = 1
  39. }
  40. //---------------------------------------------------------------
  41. void InitialUART0_Timer3(UINT32 u32Baudrate) //use timer3 as Baudrate generator
  42. {
  43.                 P06_Quasi_Mode;                //Setting UART pin as Quasi mode for transmit
  44.                 P07_Quasi_Mode;                //Setting UART pin as Quasi mode for transmit       
  45.        
  46.     SCON = 0x50;     //UART0 Mode1,REN=1,TI=1
  47.     set_SMOD;        //UART0 Double Rate Enable
  48.     T3CON &= 0xF8;   //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1)
  49.     set_BRCK;        //UART0 baud rate clock source = Timer3

  50. #ifdef FOSC_160000
  51.                 RH3    = HIBYTE(65536 - (1000000/u32Baudrate)-1);                  /*16 MHz */
  52.                 RL3    = LOBYTE(65536 - (1000000/u32Baudrate)-1);                        /*16 MHz */
  53. #endif
  54. #ifdef FOSC_166000
  55.     RH3    = HIBYTE(65536 - (1037500/u32Baudrate));                         /*16.6 MHz */
  56.     RL3    = LOBYTE(65536 - (1037500/u32Baudrate));                         /*16.6 MHz */
  57. #endif
  58.     set_TR3;         //Trigger Timer3
  59.                 set_TI;                                         //For printf function must setting TI = 1
  60. }

  61. UINT8 Receive_Data_From_UART0(void)
  62. {
  63.     UINT8 c;
  64.     while (!RI);
  65.     c = SBUF;
  66.     RI = 0;
  67.     return (c);
  68. }

  69. void Send_Data_To_UART0 (UINT8 c)
  70. {
  71.     TI = 0;
  72.     SBUF = c;
  73.     while(TI==0);
  74. }


  75. //----------------------------------------------------------------------------------
  76. // UART1 baud rate initial setting
  77. //----------------------------------------------------------------------------------
  78. void InitialUART1_Timer3(UINT32 u32Baudrate) //use timer3 as Baudrate generator
  79. {
  80.                 P02_Quasi_Mode;                //Setting UART pin as Quasi mode for transmit
  81.                 P16_Quasi_Mode;                //Setting UART pin as Quasi mode for transmit
  82.        
  83.           SCON_1 = 0x50;           //UART1 Mode1,REN_1=1,TI_1=1
  84.     T3CON = 0x08;           //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1), UART1 in MODE 1
  85.                 clr_BRCK;
  86.        
  87. #ifdef FOSC_160000
  88.                 RH3    = HIBYTE(65536 - (1000000/u32Baudrate)-1);                  /*16 MHz */
  89.                 RL3    = LOBYTE(65536 - (1000000/u32Baudrate)-1);                        /*16 MHz */
  90. #endif
  91. #ifdef FOSC_166000
  92.                 RH3    = HIBYTE(65536 - (1037500/u32Baudrate));                          /*16.6 MHz */
  93.                 RL3    = LOBYTE(65536 - (1037500/u32Baudrate));                                /*16.6 MHz */
  94. #endif
  95.     set_TR3;         //Trigger Timer3
  96. }

  97. UINT8 Receive_Data_From_UART1(void)
  98. {
  99.     UINT8 c;
  100.    
  101.     while (!RI_1);
  102.     c = SBUF_1;
  103.     RI_1 = 0;
  104.     return (c);
  105. }

  106. void Send_Data_To_UART1 (UINT8 c)
  107. {
  108.     TI_1 = 0;
  109.     SBUF_1 = c;
  110.     while(TI_1==0);
  111. }


  112. /*==========================================================================*/
  113. #ifdef SW_Reset
  114. void SW_Reset(void)
  115. {
  116.     TA = 0xAA;
  117.     TA = 0x55;
  118.     set_SWRST;
  119. }
  120. #endif
  121. /*==========================================================================*/
huangcunxiake 发表于 2018-5-15 18:25 | 显示全部楼层
不如使用官方的库函数简洁啊。这个串口功能也不是很多。
dongliushui 发表于 2018-5-19 23:49 | 显示全部楼层
定时器不是,那就不是模式3了。
gejigeji521 发表于 2018-5-20 21:41 来自手机 | 显示全部楼层
看手册啊,你时钟选择错了
小灵通2018 发表于 2018-5-21 22:45 | 显示全部楼层
实现了你的想法了吗
 楼主| lizhenming 发表于 2018-5-22 08:07 | 显示全部楼层
小灵通2018 发表于 2018-5-21 22:45
实现了你的想法了吗

我暂时换成了模式2
dongnanxibei 发表于 2019-4-9 23:11 | 显示全部楼层
之前看到有个贴说串口的库函数需要改的,不知道是哪儿
643757107 发表于 2019-4-18 00:14 | 显示全部楼层
可能不支持哪个模式
643757107 发表于 2019-4-18 00:14 | 显示全部楼层
可能这几个端口有点区别。
BigLeo8 发表于 2019-4-19 17:55 | 显示全部楼层
学习一哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

129

帖子

2

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