`
mmdev
  • 浏览: 12911598 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

mini2440下调试IIC时序问题总结与分析

 
阅读更多

说明:mini2440平台,wince6.0系统,vs2005

经过几个月的学学停停,终于在wince下加入了GPIO模拟的IIC总线,实现了IIC的移植,IIC的芯片是SHT21温湿度芯片。

之所以搞了这么久没搞定IIC,是在ADS下很早实现了,可就是添加到系统就总不对!示波器抓取发现时序在芯片复位后就不对了,找来找去都不知道怎么回事!这下就陷入了

纠结中,还是那种死循环的纠结,怎么都绕不出来!

网上发帖,网友们也支了很多招,感谢你们!jonsenwu网友的话提示了我!驱动程序加到系统里面,系统的调度需要时间,驱动程序使用的延时会出现延长的情况!根据他的提示,也进一步向他请教,这里特别感谢他!对驱动程序的优先级进行调整,使其在运行过程中始终保持住CPU的使用权。在ADS下测试的延时函数在系统下是不会相同的!

经过这个移植学到的东西:

1、wince下优先级相关知识

以下是代码:用于实现优先级抢占

//dwThreadID = GetCurrentThread(); //获取线程的ID
//dwThreadPri = CeGetThreadPriority(dwThreadID); //获取线程ID的优先级
//dwThreadQuantum = CeGetThreadQuantum(dwThreadID); // 获取线程的时间论片参数
//CeSetThreadPriority(dwThreadID, 0);// 设置当前线程的优先级为最高
//CeSetThreadQuantum(dwThreadID, 0); //设置当前线程的时间论片为0,保持CPU的占有权
//
//.......... (操作i2c的函数)
//
//CeSetThreadQuantum(dwThreadID, dwThreadQuantum);  // 恢复正常时间论片
//CeSetThreadPriority(dwThreadID, dwThreadPri); //恢复正常优先级

说明:设置优先级有两个函数,一个函数可以设置0~255的个优先级(CeSetThreadPriority()),一个函数可以只能设置应用程序的优先级248~255(SetThreadPriority())!!

IIC调试成功后,把数据传给应用程序又出现个问题,先是在XXX_IOControl实现传递,怎么试都没数据出来,最后放到XXX_Read里面来实现就OK了。这里还要说明个关于memcpy的问题。如下:

2、对于memcpy函数的理解

先看一下出问题的写法:
unsigned short SHT_Data[2];//

memcpy( pBuffer , SHT_Data ,2 );//output

我应用程序读到的数据只有温度是对的,湿度就很大的数!肯定高手一眼就看出来问题所在了!

是因为:memcpy函数的拷贝是基于字节的,上面我拷贝的个数是2,所以只有温度能正常,湿度根本就没拷贝过去。

正确的方法是4个字节:memcpy( pBuffer , SHT_Data ,4);//output

3、GPIO的说明

这里得再次鄙视下友善之臂的技服!GPIO我原来使用的是2440默认两个引脚(默认的接了EEPROM和Camera!!,能对才怪!),最后查找到SPI0的空余引脚才搞定。

代码可以参照:http://bbs.csdn.net/topics/390278816?page=1

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics