如何配置硬件IIC
IIC英文全稱:Inter Integrated Circuit,集成電路總線,是飛利浦公司在八十年代開發(fā)的一種串行、同步、半雙工總線。
IIC總線協(xié)議無非就是幾樣東西:起始信號、停止信號、應答信號、以及數(shù)據(jù)有效性。大家學習了正點原子的IIC實驗,應該很了解IIC時序。正點原子使用的是軟件模擬IIC,也就是用IO口模擬出IIC時序去通信。使用硬件IIC,就可以不用管時序信號,配置好之后就可以產(chǎn)生時序。雖說ST的硬件IIC很雞肋,但是某些方面還是比軟件模擬IIC稍微強一點。
下面列出一個硬件IIC和軟件IIC的對比表

軟件IIC整個流程很清晰,假如出了bug,你能很快找到問題,硬件IIC就需要動用DS100示波器去看波形,波形的查看教程可以參考以下推文
https://mp.weixin.qq.com/s/lnSORSbXeNJe-QVwW0EVbg
其實很多時候是在管腳上考量使用軟件IIC。硬件IIC雖然被聽說吐槽過千百遍,但是有些人還是有興趣想使用STM32的IIC外設的,那么本文就教一下大家使用硬件IIC,側重于使用(這里使用的是F1 HAL庫)。
首先,先看HAL庫給IIC定義好的結構體,這里主要講解IIC初始化結構體

ClockSpeed:IIC的傳輸速率,主要看從機,從機AT24C02是最大為400kHz,低于400kHz即可。
DutyCycle:SCL線時鐘占空比,就是低電平與高電平的比值,沒有嚴格限制,選擇2:1或者16:9即可。
OwnAddress1:STM32的IIC設備的自身地址,掛載在IIC總線上的器件每一個都有自己唯一地址,作為主機也不例外。特別注意:這里地址的設置不要跟從機一樣即可。
AddressingMode:地址的位數(shù)是使用7位還是10位,這要看從機了。對于AT24C02來說,直接使用7位。
DualAddressMode:用來配置是否支持雙設備地址,沒有用到可以不配置。
OwnAddress2:STM32的IIC設備的自身地址,是否有效取決于DualAddressMode成員的設置。
GeneralCallMode:廣播呼叫模式,作為從機時使用,通常用不上。
NoStrethMode:時鐘線延長,也是作為從機時使用的,通常用不上。
在IIC實驗例程中,編寫hwiic_init如下:

這里是調用HAL_I2C_Init函數(shù)對IIC進行初始化,在IIC的初始化回調函數(shù)中就要使能I2C1時鐘以及對相關引腳進行初始化,特別注意GPIO口的模式(復用開漏輸出),這部分代碼比較簡單就不列出來了。
初始化完成后,使用HAL庫提供的IIC發(fā)送和接收函數(shù),函數(shù)如下:

hi2c:IIC的句柄結構體地址。
DevAddress:從機的設備地址,這里并不是通訊地址。
MemAddress:要寫入的地址。
MemAddSize:地址的長度。
pData:要寫入的數(shù)據(jù)的地址。
Size:寫入數(shù)據(jù)的個數(shù)
Timeout:函數(shù)執(zhí)行的超時時間。
以往的AT24C02的寫操作函數(shù)和讀操作函數(shù),函數(shù)體內(nèi)一堆代碼,現(xiàn)在只是幾行代碼。
at24c02寫一字節(jié)函數(shù)代碼如下:

at24c02讀一字節(jié)函數(shù)代碼如下:

假如說直接用HAL_I2C_Mem_Write來編寫連續(xù)寫函數(shù),就有頁寫限制,也就是最多8字節(jié),當你寫入的數(shù)據(jù)大于8字節(jié)時,就會出現(xiàn)錯誤了。
所以編寫at24c02的連續(xù)寫函數(shù)最好就是調用at24c02_write_one_byte這個函數(shù)接口。
最終可以比對一下相同數(shù)據(jù)量的傳輸下,軟件模擬IIC和硬件IIC的速度對比。
硬件IIC的配置使用還是挺簡單的,速度上面還是比模擬IIC快,假如說是驅動OLED屏幕的話,可以試用一下硬件IIC提高一下刷新率,得到更好的顯示效果。

END

-
單片機
+關注
關注
6050文章
44702瀏覽量
641299 -
嵌入式
+關注
關注
5105文章
19288瀏覽量
310200
發(fā)布評論請先 登錄
相關推薦
STM32F407的兩個USB口能否分別實現(xiàn)讀卡器和讀U盤的功能以及硬件IIC讀寫AT24C02?
在APP FPGA 中通過IIC接口對DLPC910寄存器進行配置遇到的兩個問題求解
基于瑞薩RA0E1開發(fā)板的IIC OLED測試

評論