說明: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://www.linuxidc.com/Linux/2012-11/74419p2.htm