参与:2

1 则回答

15得分

提問者
最佳解


收完 8bit 資料後才會觸發中斷, 這時才在中斷內跑判斷, 再進行 ack/nack 控制 bit 的填寫,

這個功能在 I2C Bus 的規範叫做 Clock stretching,

若會擔心這個延遲, 但表主控端無法支援此 I2C 規範,

若中斷內寫的程式攏長, 資料堆疊進出複雜, 會影響控制 ack/nack 的時間,

以下假設若可以進行最快的處理,
LPC8xx 執行速度為 30MHz, 400KHz 的 I2C,

期望能在半個 I2C clock 內釋放讓 clock 拉動, 才可以出現不延遲的波型,

所以我們的限制在 1/400K sec *1/2 = 1.25usec,

一個指令週期約為 33nsec,

1.25usec / 33nsec = 1250 / 33 = 37.8 個指令週期,

在收完 8bit 的資料後, 需要在 37 個指令週期內控制 ack/nack 波型,

M0+ 需要基本 15 個指令週期進入中斷 ( 不包含堆疊處理 ),

建議不要在中斷內初始宣告指標或變數, 請用全域, 縮小堆疊處理,

在中斷內使用 if 大約需要 5 個指令週期以上,

 

使用 switch 去做區分, 則需要更多,

可以在一開始去做判斷,

並去設定 ack/nack 的暫存器,

但若用一般寫法填入指令週期, 則需要 4 個指令週期,

 

若要讀取 I2C 狀態, 一般也需要 4 個指令週期,

 

所以基本 28 個指令週期, 是可以小於 37 個指令週期,

但是! 此方法會需要嚴謹的流程,

那這時是否考慮 DMA? 可以, 第一個 Address 仍需中斷在去處發 DMA,

所以會在第一個 Address 去嚴密的控制中斷, 之後波型是不會有延遲的,

其實! 一般中斷的方法是可以再縮減處理時間, 換句話說, 可以有更多判斷,

更直接控制組語的方法, 這方法再加上 DMA, 更快速方便,

與我們 ATU MCU 聯絡吧!

1F

我要回答