查看: 1130|回复: 2

[求助] UART模块接收正常,发送不正常

[复制链接]
  • TA的每日心情
    奋斗
    2019-6-27 20:26
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    9

    主题

    24

    帖子

    0

    注册会员

    Rank: 2

    积分
    186
    最后登录
    2020-7-16
    发表于 2019-7-11 14:29:07 | 显示全部楼层 |阅读模式
    我在用IAR开发一个kl17的bootloader程序,时钟部分没有设置,用的是默认的设置,我通过CLKOUT引脚用示波器看了BUS CLOCK,是3.988MHz,约等于4MHz, 是Lirc的一半,工作正常。UART模块是用直接操作寄存器方式写的,波特率115200,现在的问题是UART模块接收正常,发送不正常,比如用串口助手发送一个字节0x44,在IAR里通过打断点看UART2_D寄存器,可以接收到0x44,但如果再把这个值发送出来,串口助手上显示的就是0x84或者0xA4,发送大部分字节都有问题,只有个别字节不会出错,比如0xFC,接收和发送都能正常显示。初始化时只设置了BDH、BDL、C4和C2四个寄存器,其他寄存器都没有设置,奇偶校验之类的都是默认设置,没有开启。下面是源代码,请教各位坛友,是什么地方出了问题,该怎么解决
    #define INIT_CLOCKS_TO_UART2    SIM_SCGC4 |= SIM_SCGC4_UART2_MASK;
    #define UART_BUS_CLOCK     (3988*1000)
    #define BOOT_UART_BAUD_RATE  115200
    #define UART_SBR  (unsigned char)(UART_BUS_CLOCK / (16*BOOT_UART_BAUD_RATE))
    #define UART_BRFA (unsigned char)((((UART_BUS_CLOCK/(16*BOOT_UART_BAUD_RATE)) - UART_SBR)*32.0))      

    #define UART_IsChar() (UART_S1_REG(BOOT_UART_BASE) & UART_S1_RDRF_MASK) //Receive Data Register Full Flag
    void UART_Initialization(void)
    {
      UART_C2_REG(BOOT_UART_BASE)     &= ~(UART_C2_TE_MASK|UART_C2_RE_MASK);//Disable UART TX RX before setting

      UART_BDH_REG(BOOT_UART_BASE)     = ((UART_SBR>>8)&0x1f);
      UART_BDL_REG(BOOT_UART_BASE)     = (UART_SBR&0xff);

      UART_C4_REG(BOOT_UART_BASE)      = (UART_C4_REG(BOOT_UART_BASE) & ~UART_C4_BRFA_MASK) | (UART_BRFA&0x1f);
      UART_C2_REG(BOOT_UART_BASE)      = UART_C2_TE_MASK|UART_C2_RE_MASK;//Enable UART TX RX

      while(UART_IsChar())
        (void)UART_GetChar();
    }
    unsigned char UART_GetChar(void)
    {
      unsigned char ret = 0;
      while(UART_IsChar() == 0){};
      ret = UART_D_REG(BOOT_UART_BASE);
      return ret;
    }



    void UART_PutChar(unsigned char data)
    {
        while(!(UART_S1_REG(BOOT_UART_BASE)&UART_S1_TDRE_MASK)){};
        UART_D_REG(BOOT_UART_BASE) = data;
    }







    我知道答案 目前已有2人回答
    tek00018.png
    UART2_D.png
    噫噫噫
    回复

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    20008
    最后登录
    2024-4-24
    发表于 2019-7-12 10:30:29 | 显示全部楼层
    建议手算一下实际波特率与115200的偏差比率是多少,然后你可以试试将波特率设置的低一些,如9600,19200等
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-6-27 20:26
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    9

    主题

    24

    帖子

    0

    注册会员

    Rank: 2

    积分
    186
    最后登录
    2020-7-16
     楼主| 发表于 2019-7-12 10:34:35 | 显示全部楼层
    我想我找到原因了,不是UART模块设置的问题,是系统时钟的问题,原来用的低频内部参考时钟前半段振荡太厉害,影响到了数据发送,改用了高频内部参考时钟就正常了,图片是启用了高频内部参考时钟之后的bus clock波形,这个波形其实也不是很好,有条件的话尽量使用外部晶振
    tek00001.png
    噫噫噫
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-25 05:14 , Processed in 0.124781 second(s), 24 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表