歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> mini2440下調試IIC時序問題總結與分析

mini2440下調試IIC時序問題總結與分析

日期:2017/3/1 10:07:04   编辑:Linux編程

說明: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

Copyright © Linux教程網 All Rights Reserved