查看: 8494|回复: 11

[求助] 在这里求助重来就没有得到过解决,还是FSL的官网吗?不过还是要再发2个问题,让大家也看看.

[复制链接]

该用户从未签到

48

主题

141

帖子

1

中级会员

Rank: 3Rank: 3

积分
385
最后登录
2020-8-7
发表于 2010-3-14 16:10:18 | 显示全部楼层 |阅读模式
在这里求助重来就没有得到过解决,还是FSL的官网吗?不过还是要再发2个问题,让大家也看看.
     1.MCF52259的I2C的问题 我在调试时发现I2C一个比较麻烦的问题,在读数据的过程中我如果终止程序(比如我读10个字节的数据,在读到第5个字节的时候中断下来并退出程序运行),这个时候I2SR的IBB一直为1,这个状态在我重新执行程序时始终保持为1,软件复位或者硬件RESET均无法恢复,我也试过把I2C口先设置为IO口模拟发一个停止信号,然后再恢复为I2C,IBB还是无法回0,只要使能I2C,IBB立刻变为1,唯一可以恢复的方式是把设备重新上电。用MQX操作系统自带的驱动或者自己写的驱动均遇到这样的情况,请问这个怎么解决?
     驱动里面有这样的指令: while (i2c_ptr->I2SR & MCF52XX_I2C_I2SR_IBB) { }; // wait for completion 始终处于死循环无法退出。
  2.Backup Watchdog Timer (BWT) Module 这个看门狗模块在时间溢出时产生复位,这个复位无法设置中断服务程序,产生的RESET信号无法重新启动装置,感觉是在某个地方死循环无法退出,这个时候也无法擦除程序和重新运行程序,只能重新上电才能擦写程序或者运行程序,在Release版本下就处于死机状态,连硬件看门狗也无法恢复。而Core Watchdog (CWCR)可以设置中断服务程序用软件复位是正常的。(注:使用MQXRTOS)请问这个是什么原因?
我知道答案 目前已有10人回答
回复

使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2010-3-15 11:33:04 | 显示全部楼层

    RE:在这里求助重来就没有得到过解决,还是FSL的官网吗?不过还是要再发2个问题,让大家也看看.

    你好。以前有问题没有帮你解决过吗?我们一直在解决任何的问题。你这个问题我们测试一下就会回复你。
    该会员没有填写今日想说内容.

    该用户从未签到

    3

    主题

    87

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    306
    最后登录
    1970-1-1
    发表于 2010-3-15 11:36:53 | 显示全部楼层

    RE:在这里求助重来就没有得到过解决,还是FSL的官网吗?不过还是要再发2个问题,让大家也看看.

    对于I2C的问题,你看一下SDA 的线,是不是被slave 一直拉低了,如果slave 一直拉低,那主设备会report busy。有一个方法你试试,在手册上也有介绍。在初始化最后,用
    //如果总线忙,则产生停止信号
            if( MCF_I2C_I2SR & MCF_I2C_I2SR_IBB)
            {
                    //产生停止信号,I2C模块切换至从接收模式
                    MCF_I2C_I2CR = 0;       
                    //使能I2C模块,并产生开始信号
                    MCF_I2C_I2CR = MCF_I2C_I2CR_IEN |               
                                               MCF_I2C_I2CR_MSTA;               
                    temp = MCF_I2C_I2DR;                //空读I2DR
                    MCF_I2C_I2SR = 0;                        //清除I2C状态寄存器
                    //产生停止信号,I2C模块切换至从接收模式
                    MCF_I2C_I2CR = 0;       
                   
                    //使能I2C模块,使能中断
                    MCF_I2C_I2CR = MCF_I2C_I2CR_IEN |MCF_I2C_I2CR_IIEN |0;
            }
    这是用来结束未完成的读写过程的

    该用户从未签到

    3

    主题

    87

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    306
    最后登录
    1970-1-1
    发表于 2010-3-15 11:39:28 | 显示全部楼层

    RE:在这里求助重来就没有得到过解决,还是FSL的官网吗?不过还是要再发2个问题,让大家也看看.

    关于watchdog 的问题,你用的是哪个芯片?

    该用户从未签到

    48

    主题

    141

    帖子

    1

    中级会员

    Rank: 3Rank: 3

    积分
    385
    最后登录
    2020-8-7
     楼主| 发表于 2010-3-15 12:31:30 | 显示全部楼层

    回复:在这里求助重来就没有得到过解决,还是FSL的官网吗?不过还是要再发2个问题,让大家也看看.

    非常感谢你能回答我的问题。
             关于I2C的问题,外部总线可以确定是没问题的。我也试过很多种方式想把I2C恢复,包括先发送STOP,把I2C设置成硬件IO发送一个STOP信号都没用,如果装置不重新上电,只要一设置 IEN(MCF_I2C0_I2CR = 0 | MCF_I2C_I2CR_IEN; ),IBB位立刻变为高电平。在正常完成读周期的情况下是没有任何问题的。不过我用你给的程序先测试一下再看看.
     
             BWT的问题我现在都无法解决,我用的是MCF52259,BWT复位后并没有真的复位,整个处于死机状态。这个时候也无法整片擦除程序,整片擦除可能时间比较长,BWT溢出复位引起擦除出错,设置成在STOP、DEBUG等模式下停止BWT也没用。我现在用的擦除方式是先只擦除设置BWT的这小片程序,然后重新上电就可以把整片擦除了,因为这样擦除时间短,设置BWT的这段程序被擦除后重新上电就处于默认的不使能BWT了。SCM的主看门狗、软件复位都没这个问题,按理说BWT和它们复位应该一样的结果,可实际是BWT复位就死机。下面一个是初始化BWT程序,一个是喂狗程序,在测试时我是设个标志不喂狗.
    void able_BWT_watchdog(void)
    {
      MCF_BWT_WMR = 0x32;                                     
      /* WCR: STOP=0,WAIT=0,DOZE=0,EN=1 */
      MCF_BWT_WCR = 0x01f;   
    //  MCF_BWT_WCR = MCF_BWT_WCR_EN;                                     
    }
    void feed_BWT_watchdog(void)
    {
      MCF_BWT_WSR = 0x5555;                                     
      MCF_BWT_WSR = 0xAAAA;                                     
    }
     

    该用户从未签到

    3

    主题

    87

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    306
    最后登录
    1970-1-1
    发表于 2010-3-15 13:01:02 | 显示全部楼层

    RE:在这里求助重来就没有得到过解决,还是FSL的官网吗?不过还是要再发2个问题,让大家也看看.

    BWTD是设计成使能之后,不能再disable的,防止程序误操作。我把我们使用的部分测试代码给你做一下参考。
    /********************************************************************/
    /*
    * File:                BWDT main.c
    * Purpose:                check BWDT functionality
    *
    */
    #include "common.h"
    #include "uif.h"
    #include
    /*
    * Function declaration for each testcase
    */
    /* RTC TestCase Commands*/
    void bwdt_read_registers                 (int, char **);
    void bwdt_system_rst                                         (int, char **);
    void bwdt_clock_src                      (int ,char **);
    void bwdt_reset_status                   (int ,char **);
    void bwdt_disable_ena                    (int ,char **);
    void bwdt_operation                      (int ,char **);
    //void pmm_enter_stop_mode(void);
    //cmd  min_arg max_arg flag func  Description syntax  block regression_flag error_flag
    UIF_CMD UIF_CMDTAB[] =
    {
        UIF_CMDS_ALL
            {"bwdt_read_registers"             ,0,0,0, bwdt_read_registers,"displays bwdt registers"," "}, \
            {"bwdt_sys_rst"                    ,0,0,0, bwdt_system_rst,"check if bwdt resets system"," "},
            {"bwdt_clk_src"                    ,0,0,0, bwdt_clock_src,"check if bwdt can be clocked by either of the two clock sources"," "},
            {"bwdt_rst_status"                 ,0,0,0, bwdt_reset_status,"check if bwdt reset is updated in the reset status reg"," "},
            {"bwdt_ena_disable"                ,0,0,0, bwdt_disable_ena,"check that bwdt once enabled cannot be disabled "," "},
            {"bwdt_rst_state"                  ,0,0,0, bwdt_operation,"check that clock to bwdt cannot be gated in independent mode"," "},
    };
    const int UIF_NUM_CMD    = UIF_CMDTAB_SIZE;
    UIF_SETCMD UIF_SETCMDTAB[] = {"",0,0,NULL,""};
    const int UIF_NUM_SETCMD = 0;

    /***********************************************************************/
    void presskey(void)
    {
      int ch ;
      
      printf("press any key to continue   \n");
      ch = (int)in_char();   
      
                
    }


    void main (void)
    {
            int i;       
            char j;
            char **arr;
           
        /* Global interrupt enable */
            mcf5xxx_irq_enable();
            /* Command Prompt */
              
        while (TRUE)
        {
            printf("BWDT>" );
            run_cmd();
        }
    }
    /********************************************************************/
    void
    bwdt_read_registers(int argc, char ** argv)
    {
        printf("BWCR    = %#02X\n", MCF_BWDT_BWCR);
        printf("BWMR    = %#02X\n", MCF_BWDT_BWMR);
        printf("BWCNTR  = %#02X\n", MCF_BWDT_BWCNTR);
        printf("BWSR    = %#02X\n", MCF_BWDT_BWSR);
        printf("BWCR_CLK= %#02X\n", MCF_CLOCK_BWCR);
          
      
    }

    /*********************************************************************/
    /*********************************************************************/
    void bwdt_system_rst (int argc, char ** argv)
    {
      uint32 i ;
      uint8 ch;
      
      printf("Select 1 to avoid system reset else select 0 \n");
      ch = in_char();
      out_char((char)ch);
      out_char(0x0D);    /* CR */
      out_char(0x0A);    /* LF */
      
      if(ch == '0')
             {
              printf("Wait , system reset will generate soon \n");
             }  
             else
                 {
                   printf("System reset will NOT be generated  \n");       
                 }
      
      
       
      //select system clock as wdt clock source
      MCF_CLOCK_BWCR = 0x00;
      MCF_BWDT_BWMR  = 0xFFFF;
      /*enable the watch dog timer*/
      MCF_BWDT_BWCR  = 0x01 ;
      

      
      while(1)
      {
       
       if(ch != '0')
         {
                  //wait for the value in BWCNTR to change
           for(i=0;i

    该用户从未签到

    48

    主题

    141

    帖子

    1

    中级会员

    Rank: 3Rank: 3

    积分
    385
    最后登录
    2020-8-7
     楼主| 发表于 2010-3-15 14:15:50 | 显示全部楼层

    RE:在这里求助重来就没有得到过解决,还是FSL的官网吗?不过还是要再发2个问题,让大家也看看.

    谢谢shenli7,原因我找到了理解了。主要是因为我设置的时间太短,不断电复位的话我前面的初始化程序还没跑完就复位了,所以一直感觉处于死机状态。但是也带来其它问题了:

    1.这个时间必须设置长一点,至少躲过MQX启动时间,这个时间可能在几十毫秒以上。但是工控上面是比较危险的,程序跑飞的话几十毫秒之内可能会发生很多问题!当然可以在初始化时不停插入喂狗程序,不过这要改造MQX的启动程序太多了,有循环的地方可能都得加。

    2.给擦除烧写程序带来很大麻烦,如果主板以前有程序的话,带上编程器上电程序也可能会运行起来,这样的话就没办法擦除和烧写了,擦除和烧写这个时间是比较长的。不过带上编程器上电有时候程序不会跑,但是有时候会运行起来,这是有什么地方设置不对吗?

    该用户从未签到

    3

    主题

    87

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    306
    最后登录
    1970-1-1
    发表于 2010-3-15 16:34:12 | 显示全部楼层

    RE:在这里求助重来就没有得到过解决,还是FSL的官网吗?不过还是要再发2个问题,让大家也看看.

    的确是这样的,由于上电后调试器的状态不确定,有时会接管CPU,这样会让程序不跑,有时又没有接管。因此一般用CW连接时都会由调试器主动复位一下,使得CPU和调试器处于可知的状态。

    该用户从未签到

    27

    主题

    418

    帖子

    0

    新手上路

    Rank: 1

    积分
    228
    最后登录
    1970-1-1
    发表于 2010-3-15 17:08:16 | 显示全部楼层

    回复:在这里求助重来就没有得到过解决,还是FSL的官网吗?不过还是要再发2个问题,让大家也看看.

    回复第 7 楼 njhuangyuan于2010-03-15 06:15:50发表:
    谢谢shenli7,原因我找到了理解了。主要是因为我设置的时间太短,不断电复位的话我前面的初始化程序还没跑完就复位了,所以一直感觉处于死机状态。但是也带来其它问题了:

    1.这个时间必须设置长一点,至少躲过MQX启动时间,这个时间可能在几十毫秒以上。但是工控上面是比较危险的,程序跑飞的话几十毫秒之内可能会发生很多问题!当然可以在初始化时不停插入喂狗程序,不过这要改造MQX的启动程序太多了,有循环的地方可能都得加。

    2.给擦除烧写程序带来很大麻烦,如果主板以前有程序的话,带上编程器上电程序也可能会运行起来,这样的话就没办法擦除和烧写了,擦除和烧写这个时间是比较长的。不过带上编程器上电有时候程序不会跑,但是有时候会运行起来,这是有什么地方设置不对吗?
     

    你可以先启动mqx然后再开wdt
  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2010-3-16 08:37:31 | 显示全部楼层

    RE:在这里求助重来就没有得到过解决,还是FSL的官网吗?不过还是要再发2个问题,让大家也看看.

    对于看门狗的问题已经明白是如何处理。
    我说明一下I2C的问题,我有一点观点:
    1、I2C数据操作中,会不会因为看门狗而导致数据读不完整?你可以在关闭看门狗和开启看门狗2中状态下都试一试,如果结果一样,你使用模拟I2C总线试一下,是I2C的问题,还是程序的问题
    2、你使用的是什么I2C芯片,如果操作期间发生中断,会有什么样的结果?希望你可以试试
    3、你操作的是什么地址,I2C芯片有地址界限,一次只能读取1页地址。
    该会员没有填写今日想说内容.
    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-18 06:16 , Processed in 0.108056 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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