2013-10-17 56 views
1

我正在使用一個硬件設計組來處理中斷處理程序,並且我們試圖找出錯誤在哪裏。我正在以5khz讀SPI總線上的芯片。芯片加載4個字節並觸發數據準備好引腳。在Linux中斷處理程序中創建一個小延遲

我的中斷處理程序喚醒並從SPI總線讀取4個字節並將數據存儲在緩衝區中。奇怪的是,每第17次讀取都會給出所有0的4個字節,這是不對的。我們正在探索的其中一個選擇是芯片在發送數據就緒信號時並不總是準備好。所以,我知道我不能睡在中斷處理程序中,但我想嘗試引入10或20微秒的延遲。現在我有一個for循環計數到100,000然後處理中斷。我還沒有看到任何變化,所以我想我可能會看到是否有人有更好的技術來忙等待。或者至少有一個更好的方法來計算我應該經歷多少循環迭代,因爲我不知道這需要多長時間,或者編譯器是否只是優化整個事情。

+1

將數字分析儀連接到SPI線。查看數據準備好後是否真的返回了錯誤的數據。除非你更好地找出問題的根本原因,否則你可能會因爲延遲等原因而喋喋不休。 –

回答

1

我不知道你是否可以訪問嵌入式設備上的任何僞隨機數生成庫,但是在mod之後進行大數乘法運算肯定需要一些週期。而不是簡單地添加1(在硬件級別上速度非常快,編譯器可以優化它以便移動,因爲您正在靜態執行該操作),請使用隨機數字種子(系統是否可以訪問時鐘? )如果可用並且執行大數乘法,模數或階乘運算,則負數分配也需要永久。請記住,分區在硬件級別上最長。使用它你的優勢。

0

我假設你的編譯器會去掉一個簡單的循環。

你應該使用volatile。

volatile unsigned long i; 
for (i=0;i< 1000000; i++) 
    continue; 

我還假設這不會消除問題或幫助你。

我不敢相信,一個SPI外設有這樣一個錯誤

但是您可能會閱讀以減慢SPI-Fifo中的數據。
所以一些收到的數據將被丟棄。

您應該檢查SPI模塊的錯誤標誌並檢查SPI的RX空RX-fullflags。