iic器件是一種介於高速和低速之間的嵌入式外圍裝置,其實總體來說,它的速度算是比較慢的。通常情況下,速度慢的器件意味著更多的等待,這對於精益求精的嵌入式工程師來說,簡直就是乙個惡夢,低速器件的訪問資料實在是太浪費資源。如何面對這種低速裝置,而使系統執行達到最優化?我覺得應當盡可能多的使用硬體完成,這樣軟體的開銷便會減小,系統軟體不用過多的時間去等待這些資料,而專注於硬體的請求和處理。
iic協議,在筆者看來,其實並不是一種很好的協議,它沒有較好的出錯恢復機制,它是基於一種狀態機模式的通訊協議,在這個狀態轉換中出現任意一步錯誤,將會導致匯流排不可恢復,極脆弱。在400khz的最高帶通訊速率下,很多時候也極易產生幹抗,因其採用了ttl電平傳輸資料,加上數字器件的狀態識別問題,在高速時整個匯流排的狀態極易產生崩潰,所以筆者的建議是,有其它介面的器件時,盡量不要用iic介面器件……它遠遠沒有想像中的那麼可靠。
stm32系列cpu中提供了一些iic的硬體模組,筆者針對它的一些特點,總結了一些使用方法,並按照一般程式設計師的使用習慣,提出了三種不同的程式設計和實現方式,分別是查詢等待方式、硬體中斷方式、wrtos驅動整合方式。前兩種不需要rtos的支援。
下面先討論stm32系列mcu的iic硬體查詢等待方式程式設計:
首先,根據該mcu的特點和暫存器定義,我們做一些有用的巨集定義和引用:
任何一種硬體模組都有它自己的使用規則和使用方法,stm32系列的iic也不例外,據筆者的體會,它的iic操作過程有一些它自己的個性,如起始位的傳送以及對狀態暫存器的假讀規則等,區別於其它mcu的iic使用。
其實任何乙個iic模組,只會有兩種應用,非讀取寫資料,下面是筆者錘練過的stm32系列mcu硬體iic寫資料方法,查詢等待方式:
對於iic的寫操作,先傳送裝置位址,得到響應後再傳送資料,至少資料內容,以及長度,就不是本方法所關心的了,本方法可傳送任意指定長度的資料報,前提是應當指定正確的txlenth,當然,也可以通過判斷最後乙個位元組的ack請求得到結束位置,但筆者認為這樣指定長度傳送更好。至於iic傳送方法為什麼是這樣,請參考iic的傳送協議。
下面是iic主機的讀資料協議,它比寫方式複雜了一點點:
上面的**提練了iic的讀資料過程,應該指示的是,對於片內位址是16位的應用,應該把dataaddr型別修改為uint16,並在傳送片內位址的時候按照高低位元組的順序傳送出去,本處示例了8位片內位址的情況(大部分情況都是8位)。上面的讀方法中,有乙個iic匯流排重啟的過程,這是最重要的地方,另外,在讀回到最後乙個位元組的時候,停止ack的傳送,提示裝置資料接收結束。至於為什麼會是這樣,請查閱iic匯流排協議讀資料部分。
以上便是iic模組的所有使用方法,有了這兩個方法,便可以編寫任何的iic器件驅動程式。
微控制器學習(一) 微控制器基礎 STM32
io四種輸入工作模式 io四種輸出工作模 stm32有8個16位定時器 stm32具有強大的異常響應系統,它把能夠打斷當前 執行流程的事件分為異常 exception 和中斷 interrupt 並把它們用乙個表管理起來,編號為 3 6的中斷向量定義為系統異常,編號從7到19的為外部中斷。中斷向量控...
微控制器 STM32庫開發
1.stm32庫開發是什麼?st公司推出的基於cortex m3核心的mcu 微控制器,也就是通常所說的微控制器 倡導使用韌體庫開發,僅通過呼叫庫裡面的api 應用程式介面 就可以迅速搭建乙個程式,寫出各種使用者需要的應用。庫開發方式自頂向下,可以避免對底層暫存器的繁瑣操作,能大大降低學習門檻和開發...
stm32mcuid規則 STM32微控制器命名規則
stm32 系列微控制器命名規則 stm32 f 103 c 8 t 6 1 2 3 4 5 6 7 8 產品系列名 固定為 stm32 和 產品系列 f 通用系列 0xx 入門級 mcu0x0 超值系列在傳統 位和位市場極具競爭力 0x1 實現了高度的功能整合,提供多種儲存容量和封裝的選擇,為成本...