查看: 1847|回复: 5

[已解决] kinetis L25串口接收不到数据,但能发送数据

[复制链接]
  • TA的每日心情
    开心
    2019-1-10 11:07
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    1

    主题

    12

    帖子

    0

    注册会员

    Rank: 2

    积分
    55
    最后登录
    2019-1-11
    发表于 2018-8-3 11:21:57 | 显示全部楼层 |阅读模式
    本帖最后由 chengjunict 于 2018-8-3 12:12 编辑

    本人新手,求助各位大神:
        我用AN2295改成KL25的BootLoader,使用的串口0进行通信,能正确上发数据,但接收不到数据。调试时发现UARTx_S1的值一直为0xd8,OR位为1即数据丢失。前不知道原因SIM已经配置好我的串口配置如下,波特率115200:(1)串口配置
    void UARTx_Initialization_M0(UART_MemMapPtr UART_BASE)   //UART0 初始化
    {
      UART_BDH_REG(UART_BASE)     = ((UART_SBR>>8)&0x1f); //00
      UART_BDL_REG(UART_BASE)     = (UART_SBR&0xff);           //26
    #if IS_Kxx_FAMILY  
      UART_C4_REG(UART_BASE)      = (UART_BRFA&0x1f);  
    #endif
      UART_C2_REG(UART_BASE)      = UART_C2_TE_MASK|UART_C2_RE_MASK;
      UART_C1_REG(UART_BASE)      |= (UART_C1_M_MASK | UART_C1_PE_MASK);
      UART_C1_REG(UART_BASE)      &= ~UART_C1_PT_MASK;
            while(UARTx_IsChar(UART_BASE))
        (void)UARTx_GetChar(UART_BASE);
    }

    2)文件AN2295_TWR_K60_cfg.h如下
    /**************************************************/
    /** USER SETTINGS OF KINETIS MCU */
    /**  Kinetis ARM Cortex-M4 model */
    //K10_50MHz K11_50MHz K12_50MHz K10_72MHz K10_100MHz K10_120MHz
    //K20_50MHz K21_50MHz K22_50MHz K20_72MHz K20_100MHz K20_120MHz
    //K30_72MHz K30_100MHz
    //K40_72MHz K40_100MHz
    //K50_72MHz K51_72MHz K50_100MHz
    //K60_100MHz K60_120MHz
    //K70_120MHz


    /**  Kinetis ARM Cortex-M0+ model */
    //KL0_48MHz
    //KL1_48MHz
    //KL2_48MHz KL25_48MHz




    #define KINETIS_MODEL KL1_48MHz


    /*  in the case of using USB VIRTUAL SERIAL LINK you must activate No break TRIM CHECKBOX in the master AN2295 PC Application  */
    /*  the break impulse is replaced by using only 9 bits zero impulse  */
    //  BREAK IMPULSE       |START| |0| |0| |0| |0| |0| |0| |0| |0| |0| |0| STOP|
    //  ZERO IMPULSE        |START| |0| |0| |0| |0| |0| |0| |0| |0| |0| |STOP|
    #define BOOTLOADER_SHORT_TRIM  1


    /** Kinetis Flash memory size */


    #define KINETIS_FLASH FLASH_128K


    /** Bootloader flash protection */
    #define BOOTLOADER_FLASH_PROTECTION 0


    /** Boot timeout after POR (Power On Reset) for wait to connect Master **/
    /** BOOT_WAITING_TIMEOUT * 10ms **/
    #define BOOT_WAITING_TIMEOUT 1000


    /**************************************************/
    /* Actual used UART module */
    #define BOOT_UART_BASE UART0_BASE_PTR


    /* Actual used UART module */
    /* A range of UART baudrates is (9600 - 115200) */
    #define BOOT_UART_BAUD_RATE  115200


    /** GPIO & UART pins initialization */


    #define BOOT_UART_GPIO_PORT PORTB_BASE_PTR


    /*  setting of multiplexer for UART alternative of pin */
    #define BOOT_PIN_UART_ALTERNATIVE 3


    /*  setting of multiplexer for GPIO alternative of pin */
    #define BOOT_PIN_GPIO_ALTERNATIVE 1


    #define BOOT_UART_GPIO_PIN_RX   16  


    #define BOOT_UART_GPIO_PIN_TX   17  


    /**************************************************/
    /* Actual used PIN reset setting */
    #define BOOT_PIN_ENABLE_PORT_BASE  PORTC_BASE_PTR   


    #define BOOT_PIN_ENABLE_GPIO_BASE  PTC_BASE_PTR   


    #define BOOT_PIN_ENABLE_NUM        3         


    /**************************************************/
    /** BOOTLOADER FEATURES SETTINGS */
    #define BOOTLOADER_ENABLE_READ_CMD  0


    #define BOOTLOADER_INT_WATCHDOG     0


    #define BOOTLOADER_ENABLE_VERIFY    0


    #define BOOTLOADER_CRC_ENABLE       0


    #define BOOTLOADER_AUTO_TRIMMING    1


    #define BOOTLOADER_PIN_ENABLE       0
    /**************************************************/
    /** CALIBRATION OF BOOTLOADER TRIM SETTINGS */
    #define BOOT_CALIBRATION_GPIO_BASE  PTB_BASE_PTR
    /******************************************************************************
    *
    *
    *     Advanced detail settings for non standard settings
    *
    *
    ******************************************************************************/


    最佳答案

    chengjunict 发表于 2018-8-3 14:06 谢谢楼主!我尝试下 嗯, 后续如果还遇到问题,欢迎继续交流!
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    19947
    最后登录
    2024-4-19
    发表于 2018-8-3 13:39:54 | 显示全部楼层
    楼主你好!
    KL25的bootloader,建议你用KBOOT2.0,不要使用AN2295,太老了,而且的确有通信不好问题。
    你用KBOOT2.0吧,下载链接:
    www.nxp.com/kboot
    软件里有kboot2.0,下载后,KL25的bootloader路径:
    NXP_Kinetis_Bootloader_2_0_0\targets\MKL25Z4
    上位机软件可以使用blhost,或者是kinetisFlashTool.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-1-10 11:07
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    1

    主题

    12

    帖子

    0

    注册会员

    Rank: 2

    积分
    55
    最后登录
    2019-1-11
     楼主| 发表于 2018-8-3 14:06:11 | 显示全部楼层
    小恩GG 发表于 2018-8-3 13:39
    楼主你好!
    KL25的bootloader,建议你用KBOOT2.0,不要使用AN2295,太老了,而且的确有通信不好问题。
    你用 ...

    谢谢楼主!我尝试下
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    19947
    最后登录
    2024-4-19
    发表于 2018-8-3 18:02:51 | 显示全部楼层
    chengjunict 发表于 2018-8-3 14:06
    谢谢楼主!我尝试下

    嗯, 后续如果还遇到问题,欢迎继续交流!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-1-10 11:07
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    1

    主题

    12

    帖子

    0

    注册会员

    Rank: 2

    积分
    55
    最后登录
    2019-1-11
     楼主| 发表于 2018-8-7 09:07:50 | 显示全部楼层
    小恩GG 发表于 2018-8-3 18:02
    嗯, 后续如果还遇到问题,欢迎继续交流!

    楼主你好:
          KL25 UART0接收不到数据的原因找到了,是因为OR标志位置位,RXD引脚接收到的数据直接丢失。然后就是从MCU应用程序跳入BootLoader时没有关闭UART0接收中断及RXD引脚功能,导致UART0的接收引脚还有数据接收,但这时读取不了,然后串口就接收溢出了。解决方法:
        (1)跳入BootLoader前关闭UART0中断及引脚功能
    void SOFTWARE_UPGRADE_HANDLER(uint8 data_len, uint8 data[])
    {
            g_UpgradeSoftFlag = TRUE;

            Uart0Deinitialization();
            Uart0PinConf(FALSE);
                   
            SCB_VTOR = RELOCATED_VECTORS;
            JmpToBootLoader(*((unsigned long*)RELOCATED_VECTORS), *((unsigned long*)   (RELOCATED_VECTORS+4)));
            }
    }
         (2)在BootLoader的UART0开始接收时检测测置位OR标志(置位一次不行,需要循环检测置位)
    while(upgrade == 0)
    {
           if(UART_IsChar())
            {
                getch = UART_GetChar();
                if(CheckRstCmd(getch) == 0)
                {
                    timeout_cnt= 0;
                    IsUpgrade = 1;
                    enableBootMode = WAIT_FOR_M4_COMMAND_STATE;
                    SendMsgByProtocol(BOOT_CMD_ACK,0,NULL,0);
                    break;
                }
                else
                {
                    continue;
                }
            }
            else if(UART_S1_REG(BOOT_UART_BASE) & UART_S1_OR_MASK)  // clear OR bit
            {
                UART_S1_REG(BOOT_UART_BASE) |= UART_S1_OR_MASK;
            }
    }
          
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-1-10 11:07
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    1

    主题

    12

    帖子

    0

    注册会员

    Rank: 2

    积分
    55
    最后登录
    2019-1-11
     楼主| 发表于 2018-8-7 09:12:23 | 显示全部楼层
    小恩GG 发表于 2018-8-3 18:02
    嗯, 后续如果还遇到问题,欢迎继续交流!

    谢谢楼主!AN2295升级MCU应用功能暂时可以实现了;KBOOT2.0,我现在研究中,还没有搞明白
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-20 16:45 , Processed in 0.123097 second(s), 26 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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