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

 

 

發佈了41 篇原創文章 · 獲贊 27 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章