《STM32从零开始学习历程》——I2C固件库
生活随笔
收集整理的這篇文章主要介紹了
《STM32从零开始学习历程》——I2C固件库
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
《STM32從零開始學習歷程》@EnzoReventon
STM32 I2C固件庫介紹
相關資料:
I2C物理層介紹
I2C協議層介紹
STM32的I2C特性及架構介紹
參考資料:
[野火EmbedFire]《STM32庫開發實戰指南——基于野火霸天虎開發板》
[正點原子]STM32F4開發指南-庫函數版本_V1.2
[ST]《STM32F4xx中文參考手冊》
I2C初始化函數介紹
typedef struct {uint32_t I2C_ClockSpeed; /*!< 設置SCL時鐘頻率,此值要低于40 0000 */uint16_t I2C_Mode; /*!< 指定工作模式,可以選擇I2C模式以及SMBUS */uint16_t I2C_DutyCycle; /*!< 指定時鐘占空比,可以選擇low/high = 2:1或16:9模式 */uint16_t I2C_OwnAddress1; /*!< 指定自身的I2C設備地址 */uint16_t I2C_Ack; /*!< 使能或關閉響應(一般都要使能)*/uint16_t I2C_AcknowledgedAddress; /*!< 指定地址的長度,可以為7位或者10位 */}I2C_InitTypeDef;- I2C_ClockSpeed: 設置I2C的傳輸速率,在調用初始化函數時,函數會根據我們輸入的數值經過運算后把時鐘因子寫入到I2C的時鐘控制寄存器CCR。而我們寫入的這個參數值不得高于400KHz。
實際上由于CCR寄存器不能寫入小數類型的時鐘因子,影響到SCL的實際頻率可能會低于本成員設置的參數值,這時除了通訊稍慢一點以外,不會對I2C的標準通訊造成其它影響。 - I2C_Mode: 選擇I2C的使用方式,有I2C模式(I2C_Mode_I2C )和SMBus主、從模式(I2C_Mode_SMBusHost、 I2C_Mode_SMBusDevice ) 。
I2C不需要在此處區分主從模式,直接設置I2C_Mode_I2C即可。 - I2C_DutyCycle: 設置I2C的SCL線時鐘的占空比。該配置有兩個選擇,分別為低電平時間比高電平時間為2:1 ( I2C_DutyCycle_2)和16:9(I2C_DutyCycle_16_9)。
其實這兩個模式的比例差別并不大,一般要求都不會如此嚴格,這里隨便選就可以了。 - I2C_OwnAddress1: 配置STM32的I2C設備自己的地址,每個連接到I2C總線上的設備都要有一個自己的地址,作為主機也不例外。地址可設置為7位或10位(受下面I2C_AcknowledgeAddress成員決定),只要該地址是I2C總線上唯一的即可。
STM32的I2C外設可同時使用兩個地址,即同時對兩個地址作出響應,這個結構成員I2C_OwnAddress1配置的是默認的、OAR1寄存器存儲的地址,若需要設置第二個地址寄存器OAR2,可使用
I2C_OwnAddress2Config函數來配置,OAR2不支持10位地址。 - I2C_Ack_Enable: 配置I2C應答是否使能,設置為使能則可以發送響應信號。一般配置為允許應答(I2C_Ack_Enable),這是絕大多數遵循I2C標準的設備的通訊要求,改為禁止應答(I2C_Ack_Disable)往往會導致通訊錯誤。
- I2C_AcknowledgeAddress: 選擇I2C的尋址模式是7位還是10位地址。這需要根據實際連接到I2C總線上設備的地址進行選擇,這個成員的配置也影響到I2C_OwnAddress1成員,只有這里設置成10位模式時,I2C_OwnAddress1才支持10位地址。
配置好I2C初始化函數之后,對I2C進行初始化,使用I2C_Init函數:
void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitSturct)I2C固件庫的使用
(1)MDK5中點擊Functions,找到stm32f4xx_i2c.c,雙擊點開,即可看到所有函數,點擊相應函數即可定位到函數定義區域查看相關注釋與參數。
(2)使用STM32F4xx_DSP_StdPeriph_Lib_V1.4.0固件庫chm查詢。STM32F4xx_DSP_StdPeriph_Lib_V1.4.0下載地址。
I2C相關函數介紹
本章節介紹一下常用的幾個函數。
- I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState) 函數:用來產生I2C通訊開始信號的函數。共有兩個參數,一個是選擇I2Cx,可以選擇1~3,根據芯片提供I2C數量來選擇;第二個是狀態選擇,ENABLE與DISABLE。
- I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState) 函數:與上一個開始信號類似,為發送通訊停止信號。參數與開始信號函數一樣。
- void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction)函數:為發送設備地址函數。
I2C_TypeDef* I2Cx:為選擇I2C。
uint8_t Address:為八位設備地址。
uint8_t I2C_Direction:方向,Transmitter mode發送器,Receiver mode接收器。
- void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data):為發送數據函數。
- uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx):為接收數據函數。
- FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG)狀態標志位函數:用來判斷指定功能的完成完成狀態。
uint32_t I2C_FLAG:可以選擇不同的狀態判定功能。
- ITStatus I2C_GetITStatus(I2C_TypeDef* I2Cx, uint32_t I2C_IT)中斷標志位函數:同樣與標志位判斷函數用法一樣。
- ★ 比起I2C_GetFlagStatus & I2C_GetITStatus更好用的一個標志位判斷函數為:ErrorStatus I2C_CheckEvent(I2C_TypeDef I2Cx, uint32_t I2C_EVENT) 函數,這個函數是專門用來檢查EVx事件的。
下面是可以供選擇的EV事件,在寫代碼時會用到。
- void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState)響應函數:配置成ENABLE時,接收到數據時會響應。
總結
以上是生活随笔為你收集整理的《STM32从零开始学习历程》——I2C固件库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 随便写的扫雷程序.cpp
- 下一篇: 移动无线PUSH MAIL技术简介说明