STM32I2C難點_第1頁
STM32I2C難點_第2頁
STM32I2C難點_第3頁
STM32I2C難點_第4頁
STM32I2C難點_第5頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、STM32 I2C 難點2012-11-05 15:595359人閱讀評論(1)收藏舉報I2C 總線在所有嵌入式系統中用得極廣, 是一個工業級別的總線, 但由于STM32 是一個32位的MCU, 注定了他的I2C硬件接口將會功能強大, 但同時也會較難于控制,不象8位機,如AVR8位機的TWI(實際完全符合 I2C標準) 那么易用. 以下是我的STM32 I2C硬件接口編程的一些心得體會. 如果你選擇了STM32, 說明了你的項目的需求是比較復雜的,使用EMBEDDED OS 和大量地運用中斷+DMA的編程模型是必然的選擇, 如果你的項目中用STM32,而你用模擬的I2C的話, 說明了兩點: 一

2、是浪費了STM32; 二, 如果你的項目很復雜的話,你會發現在項目的開發后期,好象STM32也比8位機快不了多少, WHY! ,但這不是STM32的問題,而是你沒有最有效地利用上STM32. 很多朋友在搞STM32的I2C接口編程時總是時不時“當在某處”(GOOGLE時你會發現這個問題很普遍), 一些朋友這時就會用軟件來模擬I2C,然后,很快發現和I2C設備能很好地通信了(但當機還是可能隨機出現), 這些朋友于是大罵STM32的I2C硬件接口是個”杯具”(呵呵,我有時也會突然想罵罵,但我知道,99.999%的原因還是自已對于STM32硬件接口的熟悉程度不夠,或者說,是我沒有揚STM32 I2C

3、的長,而總是捉住他的短不發。)。 固然,STM32 I2C硬件接口有設計不完善的地方,例如下面就是我從STM32最新的Errata sheet中總結出的,關于STM32 I2C接口設計上的一些缺陷和如何避開這些缺陷的推薦程序模型:(1)把I2C的中斷優先級提升到最高(2)把發送多于2個字節的發送與接收封裝成利用DMA收發的函數,而把對某I2C設備接收和發送一個字節的函數單獨封裝為一個POLLING (輪詢)函數。(3)在尋址某一I2C DEVICE時要先CHECK I2C BUS 是否BUSY,如果忙,則等待指定時間,如果還是忙就說明I2C BUS 掛了(原因99.9%是由于我們的I2C通信時

4、序并不十分尊守I2C規約,或者我們所封裝的I2C通信模塊沒有加上防守代碼(出錯恢復代碼),這時要調用一個專門的用于通知 I2C BUS上的所有device,讓他們結束當前內部的工作,重新準備好(下雨了,收衣服啦)。如下面的我的I2C模塊的FUN 切片:該函數一定要用在主MCU的啟動模塊上,因為I2C總線在充當Master的MCU啟動時,SDA和SCL有可能組合出剛好符合I2C規約的時序組合,比如一個開始位(START CONDITION),使得I2C BUS 立即當在那里(因為當主MCU真正需要發出一個START CONDITION時,發現I2C BUS 正處于BUS狀態,而根據STM32 手

5、冊的START CONDITION說明可知,一個起始條件將會使得I2C BUS處于BUSY 狀態, 下面的I2C2_Free_Buf fun 的基本用法:(注: I2C2_Free_Bus Fun 應放在線程中,而不是放在上圖中的位置,這樣會觸發并進入一個硬件錯誤處理向量中斷中)提示:摘自STM32 手冊: I2C.SR1.Bit 0 位(SB)- Start bit(Master mode) - Set when a Start condition generated. - Cleared by software by reading the SR1 register followed by

6、 writing the DR register, or by hardware when PE=0.(4) 不要讓I2C工作在88KHz的頻率上,低于或者使用Fast-mode(400KHz)頻率,這是STM32 I2C真正的一個硬件BUG(99.999%機率),但是也是可以編程避免的。(5)Programming the bit NOSTRETCH=0 in the I2C_CR1 register. 這樣也可避免一個STM32 I2C硬件設計的一個小BUG(2。9。5節)(6)大部分的MCU的硬件I2C接口的工作模式是中斷(高端的會用DMA)+狀態機;因此狀態機的編程概念要熟悉(7)ST

7、M32 I2C的硬件接口負責實現滿足I2C總線的的規約,而我們(嵌入式編程開發者)則是通過I2C 控制寄存器和I2C的事件標志組合來啟動狀態機,然后讓狀態機按照由I2C SR1 和SR2所組合志來的事件自動工作,并在發送或接收完成后通過FLAG的方式或信號量的方式通知我們所寫的讀寫函數,操作已經完成,或者在操作中出現了錯誤,如最常見的AF錯誤(device 在第9位上沒有拉低SDA應答Master。)(8)I2C SR1 和SR2的功能分配(這是一個極易忽視的思考死角) 從STM32 手冊的I2C register map 中可以看到, I2C的SR1,主要是反映I2C通信的最基本的標志,要清除SR1的某個標志可以直接清除,而I2C的SR2即是輔助SR1的,他一般反映了I2C總一當前的工作狀態,如BUSY,是主機模式還是從機模式,等

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論