楼主: yinshaojie

[求助] KE02串口问题

[复制链接]

该用户从未签到

7

主题

77

帖子

0

中级会员

Rank: 3Rank: 3

积分
227
最后登录
2015-4-27
 楼主| 发表于 2015-4-14 09:28:20 | 显示全部楼层
FSL_TICS_Robin 发表于 2015-4-14 09:21
楼主你好从参考手册上来看,这个标志被置1是正常的,而且你可能没有把他清除。

使用的外部晶振,测试过外部晶振的波形没测过PTH2引脚输出的BUS时钟;我看了下通讯没有的时候串口寄存器接收溢出中断状态为1,正常通讯下有时也会进入接收溢出中断但每次都能清除掉。
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

77

帖子

0

中级会员

Rank: 3Rank: 3

积分
227
最后登录
2015-4-27
 楼主| 发表于 2015-4-14 09:28:36 | 显示全部楼层
FSL_TICS_Robin 发表于 2015-4-14 09:21
楼主你好从参考手册上来看,这个标志被置1是正常的,而且你可能没有把他清除。

使用的外部晶振,测试过外部晶振的波形没测过PTH2引脚输出的BUS时钟;我看了下通讯没有的时候串口寄存器接收溢出中断状态为1,正常通讯下有时也会进入接收溢出中断但每次都能清除掉。
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

77

帖子

0

中级会员

Rank: 3Rank: 3

积分
227
最后登录
2015-4-27
 楼主| 发表于 2015-4-14 09:34:33 | 显示全部楼层
FSL_TICS_Robin 发表于 2015-4-14 09:21
楼主你好从参考手册上来看,这个标志被置1是正常的,而且你可能没有把他清除。

KE02Z32VLC2没有看到有PTH2的管脚,最多只有到PTD
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2018-7-2 06:04
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    59

    主题

    2888

    帖子

    10

    金牌会员

    Rank: 6Rank: 6

    积分
    6020
    最后登录
    2020-9-28
    发表于 2015-4-14 09:35:53 | 显示全部楼层
    yinshaojie 发表于 2015-4-14 09:28
    使用的外部晶振,测试过外部晶振的波形没测过PTH2引脚输出的BUS时钟;我看了下通讯没有的时候串口寄存器 ...

    UARTx_S1 OR.jpg
    从UARTx_S1寄存器的OR位说明来看,你的取数据动作慢了。
    可能是你上位机发送频率过快,MCU来不及取出数据。
    也有可能你的串口接收中断被更高优先级中断阻塞了一点时间,导致没有及时取出数据。

    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-2 06:04
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    59

    主题

    2888

    帖子

    10

    金牌会员

    Rank: 6Rank: 6

    积分
    6020
    最后登录
    2020-9-28
    发表于 2015-4-14 09:37:27 | 显示全部楼层
    yinshaojie 发表于 2015-4-14 09:34
    KE02Z32VLC2没有看到有PTH2的管脚,最多只有到PTD

    那你可以让串口发送引脚在不干扰正常接收的情况下偶尔发一次0xAA,示波器看一下出问题的时候波特率是否准确。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    7

    主题

    77

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    227
    最后登录
    2015-4-27
     楼主| 发表于 2015-4-14 09:39:25 | 显示全部楼层
    FSL_TICS_Robin 发表于 2015-4-14 09:37
    那你可以让串口发送引脚在不干扰正常接收的情况下偶尔发一次0xAA,示波器看一下出问题的时候波特率是否准 ...

    波特率是正确的
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    7

    主题

    77

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    227
    最后登录
    2015-4-27
     楼主| 发表于 2015-4-14 09:40:46 | 显示全部楼层
    FSL_TICS_Robin 发表于 2015-4-14 09:35
    从UARTx_S1寄存器的OR位说明来看,你的取数据动作慢了。
    可能是你上位机发送频率过快,MCU来不及取出数 ...

    另外的中断只有PIT,通讯没有了之后OR中断还置位着就比较奇怪了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-2 06:04
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    59

    主题

    2888

    帖子

    10

    金牌会员

    Rank: 6Rank: 6

    积分
    6020
    最后登录
    2020-9-28
    发表于 2015-4-14 09:55:29 | 显示全部楼层
    yinshaojie 发表于 2015-4-14 09:40
    另外的中断只有PIT,通讯没有了之后OR中断还置位着就比较奇怪了

    OR置1后记得清除。PIT中断优先级没UART高,那问题就不会很大(最多就是从PIT中断跳转UART中断的一点延时),如果不放心可以先把PIT中断关掉试试。

    你的串口接收中断执行一次耗时很长吗?有可能你这一次串口中断程序还没执行完,下一次串口中断就来了。

    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    7

    主题

    77

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    227
    最后登录
    2015-4-27
     楼主| 发表于 2015-4-14 10:00:25 | 显示全部楼层
    FSL_TICS_Robin 发表于 2015-4-14 09:55
    OR置1后记得清除。PIT中断优先级没UART高,那问题就不会很大(最多就是从PIT中断跳转UART中断的一点延时 ...

    “有可能你这一次串口中断程序还没执行完,下一次串口中断就来了。”这会出现什么问题?
    OR置位后处理程序为   
    if(UART_CheckFlag(UART1,UART_FlagOR))
        {
            receive_buf[recevie_len_count] = UART_ReadDataReg(UART1);
            recevie_len_count = 0;  
            uart_or = 2;   
    //        GPIO_PinToggle(GPIO_ERR_LED);
        }       
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    7

    主题

    77

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    227
    最后登录
    2015-4-27
     楼主| 发表于 2015-4-14 10:09:39 | 显示全部楼层
    FSL_TICS_Robin 发表于 2015-4-14 09:55
    OR置1后记得清除。PIT中断优先级没UART高,那问题就不会很大(最多就是从PIT中断跳转UART中断的一点延时 ...

    void UART_HandleInt(UART_Type *pUART)
    {
           
        GPIO_PinToggle(GPIO_ERR_LED);
       
        if(UART_CheckFlag(UART1,UART_FlagOR))
        {
            receive_buf[recevie_len_count] = UART_ReadDataReg(UART1);
            recevie_len_count = 0;  
            uart_or = 2;   
    //        GPIO_PinToggle(GPIO_ERR_LED);
        }       
        else if (UART_IsRxBuffFull(UART1))
        {
                              uart_or = 0;
                              if (recevie_len_count >= (RECEIVE_BUF_LEN - 2))         //接收数据超过缓存
                                    {
                                        recevie_len_count = RECEIVE_BUF_LEN - 2;          
                                    }
                                                                  
                              
                              receive_buf[recevie_len_count++] = UART_ReadDataReg(UART1);
                                                                                                                                                                                                                                                                           
                                    if (1 == recevie_len_count)               
                                    {
                                        if (0x8e != receive_buf[0])          //第一位为非头码
                                        {
                                            recevie_len_count = 0;       
                                        }                                           
                                    }
                                    else if (2 == recevie_len_count)
                                    {
                                        if ((0x8e != receive_buf[0])||(0x8e != receive_buf[1]))//第一位或第二位为非头码
                                        {
                                            recevie_len_count = 0;       
                                        }                                           
                                    }
                                    else if (recevie_len_count > 2)
                                    {
                                        if (recevie_len_count >= (receive_buf[2] + 2))
                                        {
    //           GPIO_PinToggle(GPIO_ERR_LED);
                                            RecieveCompleteFlag = 1;                                                                                                                          
                                            recevie_len_count = 0;                                            
                                        }
                                        if ((receive_buf[2] + 2) >= RECEIVE_BUF_LEN)
                                        {
                                            recevie_len_count = 0;       
                                        }
                                        if (receive_buf[2] < 3)
                                        {
                                            recevie_len_count = 0;       
                                        }       
                                    }                                                                                                                                                                                                                 
                    }                          
    }
    这是整个串口中断函数,没有太多东西的,时间应该不长
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-23 20:43 , Processed in 0.109231 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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