none
max541驱动动态加载和集成进NK的效果不一样? RRS feed

  • 问题

  • max541为16bit DA芯片 为该芯片写的wince驱动集成进NK和动态加载效果不一样
    1.集成进NK以后 我发现 max541本来应该输出1.25V的时候 却输出了1.8V的电压
    2.使用DM动态加载时候 max541本来应该输出1.25V的时候 的确输出了1.25V的电压
    这是为什么呢?

    附代码:

    void write_max541(unsigned long data)//16bit DA
    {
     RETAILMSG(TRUE, (TEXT("the num write into max541 is  %x.\n"),data));
     v_pIOPregs->GPGDAT=v_pIOPregs->GPGDAT&~(1<<1)|(1<<1);
     delay_us(1);
     v_pIOPregs->GPGDAT=v_pIOPregs->GPGDAT&~(1<<1);//set up a falling edge
     write_spi1(data>>8);//input prefix num
     RETAILMSG(TRUE, (TEXT("the prefix num write into max541 is  %x.\r\n"),data>>8));
     write_spi1(data&0xff);//input suffix num
     RETAILMSG(TRUE, (TEXT("the suffix num write into max541 is  %x.\r\n"),data&0xff));
     v_pIOPregs->GPGDAT=v_pIOPregs->GPGDAT&~(1<<1);
     delay_us(1);
     v_pIOPregs->GPGDAT=v_pIOPregs->GPGDAT&~(1<<1)|(1<<1);//set up a rising edge
    }

     

    void write_spi1(unsigned char txdata)
    {
      v_pSPIPregs->SPTDAT1 = txdata;
      RETAILMSG(TRUE, (TEXT("INFO:write_spi1 data (%ld).\n"), v_pSPIPregs->SPTDAT1)); 
      while(!(v_pSPIPregs->SPSTA1 & 0x01== 0x01 ));
      RETAILMSG(1,(TEXT("write_spi1  is over\n")));
    }

    max541用的2.5V参考电压 让它输出1.25V时 串口应该打印出0x7fff   串口确实打印出该数据 可是用万用表测出来的确是1.8V  这可就奇怪了

    2011年7月4日 1:54

答案

  • 静态加载和动态加载的区别主要是timing。当你动态加载时,系统已经启动完毕,所有驱动的初始化都已经结束了。而静态加载时,你的驱动程序可能不是最后一个初始化的。而且,有可能别的驱动程序进程和你一起在执行。

    也就是说,采用静态加载时,你对DA芯片的config,有可能被别的驱动程序改动。比如说别的什么device也用到SPI接口或者用到SPI上面的那几个PIO口,结果碰巧把你的DA设备上面的设置改了。

    另外一个可能,是我看到你的代码中,使用GPIO的falling edge来做CS pin的,有可能在这个时候别的驱动程序,把GPIO设置给改了,使得你的CS pin操作没有起作用。

    建议你可以做一个尝试,采用静态加载,但是把你的initialization过程搬到一个新创建的thread里面,也就是说在你的init函数里,用CreateThread函数创建一个进程,在这个进程里进行初始化。记住在这个进程的最开始地方,加一个大的delay,比如Delay(60000). 也就是保证你的初始化过程在所有驱动程序初始化完成之后再进行。

    这样看看你的输出电压是多少。

    • 已标记为答案 Rain_ning 2011年7月4日 6:32
    2011年7月4日 4:19
    版主

全部回复

  • 静态加载和动态加载的区别主要是timing。当你动态加载时,系统已经启动完毕,所有驱动的初始化都已经结束了。而静态加载时,你的驱动程序可能不是最后一个初始化的。而且,有可能别的驱动程序进程和你一起在执行。

    也就是说,采用静态加载时,你对DA芯片的config,有可能被别的驱动程序改动。比如说别的什么device也用到SPI接口或者用到SPI上面的那几个PIO口,结果碰巧把你的DA设备上面的设置改了。

    另外一个可能,是我看到你的代码中,使用GPIO的falling edge来做CS pin的,有可能在这个时候别的驱动程序,把GPIO设置给改了,使得你的CS pin操作没有起作用。

    建议你可以做一个尝试,采用静态加载,但是把你的initialization过程搬到一个新创建的thread里面,也就是说在你的init函数里,用CreateThread函数创建一个进程,在这个进程里进行初始化。记住在这个进程的最开始地方,加一个大的delay,比如Delay(60000). 也就是保证你的初始化过程在所有驱动程序初始化完成之后再进行。

    这样看看你的输出电压是多少。

    • 已标记为答案 Rain_ning 2011年7月4日 6:32
    2011年7月4日 4:19
    版主
  • 非常感谢版主回复 恩 您说的第一条 我没有注意到 我认为应该是config被修改的问题 谢谢您的提醒 真是雪中送炭啊~我能否使用critical section来保护max541的操作这部分  比如:

    EnterCriticalSection(&cs);

    write_max541(num);

    LeaveCriticalSection(&cs);

    这样就能保护GPIO的输出了吧  我刚做这个东西 系统方面的知识懂得不多 见谅

    2011年7月4日 6:26
  • 问题已解决 动态加载的时候可以保证驱动是最后一个被加载的驱动 ad的设置 gpio的设置都可以保证不被其他驱动篡改 这样的话 使用ActivateDeviceEx函数来在应用程序中动态加载dll这样比较合理 同时使用了对注册表的一些读写操作 在加载之前写入注册表 加载之后 清除注册表 如果是静态编译进入NK.bin的话 导致一些驱动同需要的驱动有一些设置上的冲突 造成结果错误
    2011年7月10日 9:21