www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 單片機 > 單片機
[導讀]STM32-IIC 配置解說(原創(chuàng))STM32 - I2C 簡介 :I2C 總線接口連接微控制器和串行 I2C 總線。它提供多主機功能,控制所有 I2C總線特定的時序、協(xié)議、仲裁和定時。支持標準和快速兩種模式,另外 STM32的 I2C 可以使用

STM32-IIC 配置解說(原創(chuàng))STM32 - I2C 簡介 :I2C 總線接口連接微控制器和串行 I2C 總線。它提供多主機功能,控制所有 I2C總線特定的時序、協(xié)議、仲裁和定時。支持標準和快速兩種模式,另外 STM32的 I2C 可以使用 DMA 方式操作。本文主要以一個實例來介紹 STM32-I2C 的配置方式和具體在工程中通過調用哪些庫函數來實現I2C 器件的通信。實例:寫入數據到器件 AT24C02 并將存入的數據讀出好,我們先來講講 STM32 I2C 模塊的端口基本配置,由 STM32 中文參考手冊可以查到在使用 I2C 時對應的引腳要配置成哪種模式。 SCL 和 SDA 引腳都配置成開漏復用輸出
本人用的是 STM32F103VET6,它有 2 個 I2C 接口。 I/O 口定義為 PB6-I2C_SCL,
PCB7-I2C1_SDA; PB10-I2C_SCL, PB11-I2C_SDA,由手冊可以查出對應的端口。
圖文如下:
調用庫函數將 I2C 端口配置好(本文使用的是 PB6、 PB7 端口):
程序代碼如下:

void I2C_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //GPIO 結構體定義
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能 I2C 的 IO 口

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; // 開漏輸出
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化結構體配置
}

void I2C_Mode_config(void)
{

RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);

I2C_InitTypeDef I2C_InitStructure;

I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;

I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;

I2C_InitStructure.I2C_OwnAddress1 =0x0A;

I2C_InitStructure.I2C_Ack = I2C_Ack_Enable ;

I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;

I2C_InitStructure.I2C_ClockSpeed = 400000;

I2C_Cmd(I2C1, ENABLE);

I2C_Init(I2C1, &I2C_InitStructure);
}
好了, STM32 內部的 I2C 模塊工作模式就這樣被設好了,接下來需要完成與外部器件
AT24C02( EEPROM)進行通信。將分兩部分進行代碼解析,第一部分是:對 AT24C02 進
行寫操作,第二部分:對 AT24C02 進行讀操作。
第一部分(寫):
備注: I2C_PageSize 為宏定義 #define I2C_PageSize 8 ;

void I2C_EE_BufferWrite(u8* pBuffer, u8 WriteAddr, u16 NumByteToWrite)
{
u8 NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0;
Addr = WriteAddr % I2C_PageSize;//查看輸入的地址是不是 8 的整數倍
count = I2C_PageSize - Addr;//表示距離下一頁頁首地址的距離(步伐數)
NumOfPage = NumByteToWrite / I2C_PageSize;//算出一共有多少頁
NumOfSingle = NumByteToWrite % I2C_PageSize;//算出不夠一頁的數據的余數
if(Addr == 0) //如果輸入的地址是首頁地址
{
if(NumOfPage == 0) //如果不足一頁數據
{
I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);//調用寫函數, NumOfSingle 不
夠一頁的余數作為實參
I2C_EE_WaitEepromStandbyState();//等待 EEPROM 器件完成內部操作
}

else //如果數據有一頁以上
{
while(NumOfPage--)//用一個 while 循環(huán),執(zhí)行頁寫循環(huán)操作,有多少頁就寫多少次
{
I2C_EE_PageWrite(pBuffer, WriteAddr, I2C_PageSize); //調用寫函數,將
I2C_PageSize 變量作為實
參執(zhí)行頁寫
I2C_EE_WaitEepromStandbyState();//等待 EEPROM 器件完成內部操作
WriteAddr += I2C_PageSize;//每執(zhí)行完一次頁寫對應的地址也需要移 8 個位
pBuffer += I2C_PageSize;//數據指針移 8 個位
}
if(NumOfSingle!=0)//如果有不足一頁的數據余數則執(zhí)行
{
I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);//調用寫函數, NumOfSingle
不夠一頁的余數作為實參
I2C_EE_WaitEepromStandbyState();//等待 EEPROM 器件完成內部操作
}
}
}
else //輸入的地址不是首頁地址
{
if(NumOfPage== 0) //如果不足一頁
{
I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);//調用寫函數, NumOfSingle 不
夠一頁的余數作為實參
I2C_EE_WaitEepromStandbyState();//等待 EEPROM 器件完成內部操作
}
else//如果有一頁或一頁以上
{
NumByteToWrite -= count;//將地址后續(xù)的缺省位置補上數據,數據的多少就是 count
的值, NumByteToWrite 變量的值就是補上數據之后
還剩下未發(fā)送的數量
NumOfPage = NumByteToWrite / I2C_PageSize;//剩余的頁數
NumOfSingle = NumByteToWrite % I2C_PageSize;//不足一頁的數據數量
if(count != 0)//將地址后續(xù)的缺省位置補上數據
{
I2C_EE_PageWrite(pBuffer, WriteAddr, count);//調用寫函數,以 count 為實參,將地
址缺省下來的部分地址給填充
上數據
I2C_EE_WaitEepromStandbyState();//等待 EEPROM 器件完成內部操作
WriteAddr += count;//加上 count 后,地址就移位到下一頁的首地址
pBuffer += count;//數據指針移 count 個位
}
while(NumOfPage--)//將剩余的頁數數據寫入 EEPROM
{
I2C_EE_PageWrite(pBuffer, WriteAddr, I2C_PageSize);//調用寫函數,將
I2C_PageSize 變量作為實
參執(zhí)行頁寫
I2C_EE_WaitEepromStandbyState();//等待 EEPROM 器件完成內部操作
WriteAddr += I2C_PageSize;//將地址移 8 個位
pBuffer += I2C_PageSize; //將數據指針移 8 個位
}
if(NumOfSingle != 0)//將不足一頁的數據寫入 EEPROM
{
I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);//調用寫函數, NumOfSingle
不夠一頁的余數作為實參
I2C_EE_WaitEepromStandbyState();//等待 EEPROM 器件完成內部操作
}
}
}
}

在以上寫操作里面我們拿經常被調用的 I2C_EE_PageWrite 函數還有
I2C_EE_WaitEepromStandbyState 函數并結合 STM32 中文參考手冊圖文進行對照分析
請讀者在讀 I2C_EE_PageWrite 函數時請結合上述時序圖和下述代碼聯系一起看!
注: EEPROM_ADDRESS 為器件的地址,大家按照自己具體器件地址寫入即可,
例: #define EEPROM_ADDRESS 0xA0

void I2C_EE_PageWrite(u8* pBuffer, u8 WriteAddr, u8 NumByteToWrite)
{
I2C_GenerateSTART(I2C1, ENABLE);//產生起始位
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); //清除 EV5
I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Transmitter);//發(fā)送器件地

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
//ADDR=1,清除 EV6
I2C_SendData(I2C1, WriteAddr); //EEPROM 的具體存儲地址位置
while(! I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));//移位寄
存器非空,數據寄存器已經空,產生 EV8,發(fā)送數據到 DR 既可清除該事件
while(NumByteToWrite--) //利用 while 循環(huán) 發(fā)送數據
{
I2C_SendData(I2C1, *pBuffer); //發(fā)送數據
pBuffer++; //數據指針移位
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));//清除
EV8
}
I2C_GenerateSTOP(I2C1, ENABLE);//產生停止信號
}

I2C_EE_WaitEepromStandbyState 這個函數,在每調用完寫操作函數后都調用這個函數,這
個函數是用來檢測 EEPROM 器件是否已經完成內部寫的操作,判斷器件完成操作后在進行
下一步的操作!代碼如下:

void I2C_EE_WaitEepromStandbyState(void)
{
vu16 SR1_Tmp = 0;
do
{
I2C_GenerateSTART(I2C1, ENABLE);//產生起始信號
SR1_Tmp = I2C_ReadRegister(I2C1, I2C_Register_SR1);//讀 SR1 寄存器
I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Transmitter);//發(fā)送器件
地址清除事

}while(!(I2C_ReadRegister(I2C1, I2C_Register_SR1) & 0x0002));//如果接收不到從機的應
答( NACK)則說明 EEPROM 器件還在工作,直到完成操作跳出循環(huán)體!
I2C_ClearFlag(I2C1, I2C_FLAG_AF);//清除 AF 標志位
I2C_GenerateSTOP(I2C1, ENABLE); //產生停止信號
}
第二部分(讀):
由以上 AT24C02 讀時序圖可以知道:讀部分需要產生兩次起始信號
另外:主設備在從從設備接收到最后一個字節(jié)后發(fā)送一個 NACK 。接收到 NACK 后,從設備
釋放對 SCL 和 SDA 線的控制;主設備就可以發(fā)送一個停止/ 重起始條件。
● 為了在收到最后一個字節(jié)后產生一個 NACK 脈沖,在讀倒數第二個數據字節(jié)之后(在倒
數第二個 RxNE 事件之后)必須清除 ACK 位。
● 為了產生一個停止/ 重起始條件,軟件必須在讀倒數第二個數據字節(jié)之后(在倒數第二
個 RxNE 事件之后)設置 STOP/START 位。
● 只接收一個字節(jié)時,剛好在 EV6 之后(EV6_1 時,清除 ADDR 之后)要關閉應答和停止條
件的產生位。
請讀者將代碼和圖結合在一起看!

void I2C_EE_BufferRead(u8* pBuffer, u8 ReadAddr, u16 NumByteToRead)//需要兩個起
始信號
{
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); //調用庫函數檢測 I2C 器件是否處
于 BUSY 狀態(tài)
I2C_GenerateSTART(I2C1, ENABLE);//開啟信號
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));//清除 EV5
I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Transmitter);//寫入器
件地址
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//清
除 EV6
I2C_SendData(I2C1, ReadAddr); //發(fā)送讀的地址
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));//清除 EV8
I2C_GenerateSTART(I2C1, ENABLE);//開啟信號
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));//清除 EV5
I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Receiver);//將器件地址
傳出,主機為讀
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));//清除
EV6
while(NumByteToRead)
{
if(NumByteToRead == 1)//只剩下最后一個數據時進入 if 語句
{
I2C_AcknowledgeConfig(I2C1, DISABLE);//最后有一個數據時關閉應答位
I2C_GenerateSTOP(I2C1, ENABLE);//最后一個數據時使能停止位
}
if(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)) //讀取數據
{
*pBuffer = I2C_ReceiveData(I2C1);//調用庫函數將數據取出到 pBuffer
pBuffer++; //指針移位
NumByteToRead--;//字節(jié)數減 1
}
}
I2C_AcknowledgeConfig(I2C1, ENABLE);//將應答位使能回去,等待下次通信
}
STM32-IIC 配置解說到此告一段落!
如果有不正確的地方也請各位多多指教,本人及時糾正;歡
迎大家來和我相互交流學習,謝謝大家。

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯系該專欄作者,如若文章內容侵犯您的權益,請及時聯系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數據產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數據產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯合牽頭組建的NVI技術創(chuàng)新聯盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現場 NVI技術創(chuàng)新聯...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉