Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / 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);//output3、GPIO的说明这里得再次鄙视下友善之臂的技服!GPIO我原来使用的是2440默认两个引脚(默认的接了EEPROM和Camera!!,能对才怪!),最后查找到SPI0的空余引脚才搞定。代码可以参照:http://www.linuxidc.com/Linux/2012-11/74419p2.htm