mini2440下除錯IIC時序問題總結與分析

2021-08-27 07:01:01 字數 1614 閱讀 4130

說明: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除錯成功後,把資料傳給應用程式又出現個問題,先是在***_iocontrol實現傳遞,怎麼試都沒資料出來,最後放到***_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的空餘引腳才搞定。

**可以參照:

利用IAR除錯Mini2440

利用iar 除錯mini2440,準備先玩玩裸奔 以前開發lpc2214的時候用的是iar除錯環境 感覺還是很不錯的 當時一度錯怪的了這開發環境 因為lpc對jtag的引腳可以配置成普通io 開發lpc時還有乙個需要注意的地方就是如果memmap設定的不對的話,一發生中斷就會跳到乙個不對的地方 導致...

mini2440 解除安裝模組

我的mini2440買回來這麼久了,一直有個問題很奇怪,就是執行insmod ko一切正行,lsmod也可以看到你插入的模組,但是用rmmod就會出現no such file,一直對這個問題就感覺很奇怪,也google了很多,網上五花八門的答案都有。最後還是仔細看了手冊才找到答案,原來是要把板子上的...

mini2440儲存空間

s3c2440把低1g的空間分成了8塊,由圖可知,第0至6這七塊的起始位址是不變的。而第七段的位址是可變的 它的位址有第六塊需要用到多少來決定,反正就是第六第七是連在一起的 前6塊可以是rom sram 最後兩塊不但可以是rom,sram外,還可以是sdram.其實啊,簡單點的說,就是只有最後兩塊才...