国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【STM32】入門(七):I2C硬件控制方式

這篇具有很好參考價(jià)值的文章主要介紹了【STM32】入門(七):I2C硬件控制方式。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1、簡(jiǎn)介

之所以叫“I2C硬件控制方式”是與“軟件控制方式”相對(duì)。I2C軟件控制,就是寫程序直接操作兩個(gè)GPIO引腳,分別作為時(shí)鐘線SCL和數(shù)據(jù)線SDA,按照I2C協(xié)議的時(shí)序要求,操作GPIO輸入、輸出、高電平、低電平。
聽著就很復(fù)雜,好在STM32中有I2C的硬件實(shí)現(xiàn),即通過簡(jiǎn)單的操作寄存器即可實(shí)現(xiàn)收發(fā)數(shù)據(jù)。

2、手冊(cè)

2.1 寄存器功能框圖

【STM32】入門(七):I2C硬件控制方式

2.2 I2C引腳

STM32F407ZGT6中有3個(gè)I2C總線,對(duì)應(yīng)的引腳如下圖所示。
其中I2C1默認(rèn)引腳是PB6、PB7,可以重映射到PB8、PB9上。
【STM32】入門(七):I2C硬件控制方式

2.3 寄存器

寄存器地址:
【STM32】入門(七):I2C硬件控制方式
【STM32】入門(七):I2C硬件控制方式

3、代碼詳解

I2C基本編程步驟:初始化時(shí)鐘、配置引腳、起始信號(hào)、讀、寫、終止信號(hào)

3.1 I2C初始化

3.1.1 初始化時(shí)鐘

I2C在APB1總線上,并且I2C1的引腳位PB6、PB7,因此使能使能GPIOB時(shí)鐘,以及I2C的時(shí)鐘

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); 
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); 

【STM32】入門(七):I2C硬件控制方式

3.1.2 配置引腳位開漏輸出

static void I2C_GPIO_Config(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure; 

  #a)使能與 I2C 有關(guān)的時(shí)鐘
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); 
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
    
  #b)配置SCL和SDA引腳位開漏輸出GPIO_Mode_AF_OD
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
	
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
  GPIO_Init(GPIOB, &GPIO_InitStructure);	
}

3.1.3 設(shè)置I2C工作模式

設(shè)置工作模式、占空比、地址7位或10位、通信速率等

工作模式有三種:I2C、SMBusDevice、SMBusHost。

SMBus (System Management Bus,系統(tǒng)管理總線)和I2C類似,但是在時(shí)序特性上有一些差異:

首先,SMBus需要一定數(shù)據(jù)保持時(shí)間,而 I2C總線則是從內(nèi)部延長(zhǎng)數(shù)據(jù)保持時(shí)間。
SMBus具有超時(shí)功能,因此當(dāng)SCL太低而超過35 ms時(shí),從器件將復(fù)位正在進(jìn)行的通信。相反,I2C采用硬件復(fù)位。
SMBus具有一種警報(bào)響應(yīng)地址(ARA),因此當(dāng)從器件產(chǎn)生一個(gè)中斷時(shí),
	它不會(huì)馬上清除中斷,而是一直保持到其收到一個(gè)由主器件發(fā)送的含有其地址的ARA為止。
SMBus只工作在從10kHz到最高100kHz。最低工作頻率10kHz是由SMBus超時(shí)功能決定的。
static void I2C_Mode_Configu(void)
{
  I2C_InitTypeDef  I2C_InitStructure; 

  #a)設(shè)置位I2C模式
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
	
  #b)設(shè)置高低電平占空比,這個(gè)不用糾結(jié),可以隨意設(shè)置,一般設(shè)備兼容性都沒問題
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;

  #c)設(shè)置自己的地址為7
  I2C_InitStructure.I2C_OwnAddress1 =I2Cx_OWN_ADDRESS7; 
  
  #d)默認(rèn)使能ACK,當(dāng)需要發(fā)送NACK時(shí),再重新設(shè)置
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable ;
	 
  #e)設(shè)置I2C的尋址地址為7
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
	
  #f)設(shè)置時(shí)鐘為:400000
  I2C_InitStructure.I2C_ClockSpeed = 400000;
  
  #g)初始化I2C1:(APB1PERIPH_BASE + 0x5400)
  I2C_Init(I2C1, &I2C_InitStructure);
  
  #h)使能 I2C1
  I2C_Cmd(I2C1, ENABLE);   
}

3.2 寫操作

【STM32】入門(七):I2C硬件控制方式

uint32_t I2C_EE_ByteWrite(u8* pBuffer, u8 WriteAddr) 
{
  #a)發(fā)送起始信號(hào)“S”
  I2C_GenerateSTART(I2C1, ENABLE);

  I2CTimeout = I2CT_FLAG_TIMEOUT;  
  #b)等待起始信號(hào)發(fā)送成功:測(cè)試 EV5 即可
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))  
  {
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(0);
  } 
  
  I2CTimeout = I2CT_FLAG_TIMEOUT;
  #c)發(fā)送從地址
  I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Transmitter);
  
  #d)等待從地址發(fā)送成功:測(cè)試 EV6 即可
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
  {
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(1);
  }  
  #e)發(fā)送需要寫入EEPROM的地址(本質(zhì)也是數(shù)據(jù))
  I2C_SendData(I2C1, WriteAddr);
  
  I2CTimeout = I2CT_FLAG_TIMEOUT;
  #f)等待數(shù)據(jù)發(fā)送成功:測(cè)試 EV8 即可
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
  {
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(2);
  } 
  
  #g)發(fā)送需要寫入的數(shù)據(jù)
  I2C_SendData(I2C1, *pBuffer); 
  
  I2CTimeout = I2CT_FLAG_TIMEOUT;  
  #h)等待數(shù)據(jù)發(fā)送成功:測(cè)試 EV8 即可
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
  {
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(3);
  } 
  
  #i)發(fā)送停止信號(hào)“P”
  I2C_GenerateSTOP(I2C1, ENABLE);
  
  return 1;
}

3.3 讀操作

【STM32】入門(七):I2C硬件控制方式

uint32_t I2C_EE_BufferRead(u8* pBuffer, u8 ReadAddr, u16 NumByteToRead)
{  
  I2CTimeout = I2CT_LONG_TIMEOUT;
  
  #a)等待是否可以讀
  //*((u8 *)0x4001080c) |=0x80; 
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY))
  {
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(9);
  }
  
  #b)發(fā)送起始信號(hào)“S”
  I2C_GenerateSTART(I2C1, ENABLE);
  //*((u8 *)0x4001080c) &=~0x80;
  
  I2CTimeout = I2CT_FLAG_TIMEOUT;
  #c)等待起始信號(hào)發(fā)送成功:測(cè)試 EV5 即可
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))
  {
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(10);
  }

  #d)發(fā)送從地址
  I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Transmitter);

  I2CTimeout = I2CT_FLAG_TIMEOUT;
  #e)等待從地址發(fā)送成功:測(cè)試 EV6 即可
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
  {
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(11);
  }
    
  #f)EV6后執(zhí)行EV6_1:清除EV6 (再次設(shè)置PE位)
  I2C_Cmd(I2C1, ENABLE);

  #g)發(fā)送需要讀取的地址
  I2C_SendData(I2C1, ReadAddr);  

   
  I2CTimeout = I2CT_FLAG_TIMEOUT;
  #h)等待數(shù)據(jù)發(fā)送成功:測(cè)試 EV8 即可
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
  {
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(12);
  }
    
  #i)復(fù)合命令:再次發(fā)送起始信號(hào)“S”
  I2C_GenerateSTART(I2C1, ENABLE);
  
  I2CTimeout = I2CT_FLAG_TIMEOUT;
  #j)等待起始信號(hào)發(fā)送成功:測(cè)試 EV5 即可
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))
  {
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(13);
  }
    
  #k)發(fā)送從地址
  I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Receiver);
  
  I2CTimeout = I2CT_FLAG_TIMEOUT;
  #l)等待從地址發(fā)送成功:測(cè)試 EV6 即可
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
  {
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(14);
  }
  
  #m)循環(huán)讀
  while(NumByteToRead)  
  {
    if(NumByteToRead == 1)
    {
      
      #n)讀取完畢,發(fā)送NACK
      I2C_AcknowledgeConfig(I2C1, DISABLE);
      
      #o)發(fā)送停止信號(hào)“P”
      I2C_GenerateSTOP(I2C1, ENABLE);
    }

    #p)每次讀取一個(gè)字節(jié)前,先測(cè)試 EV7    
    I2CTimeout = I2CT_LONG_TIMEOUT;
    while(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)==0)  
	{
		if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(3);
	} 
    {      
      #q)讀取一字節(jié)
      *pBuffer = I2C_ReceiveData(I2C1);
      pBuffer++; 
      NumByteToRead--;        
    }   
  }

  #r)為下一次讀取做準(zhǔn)備,即將ACK設(shè)置為1
  I2C_AcknowledgeConfig(I2C1, ENABLE);
  
  return 1;
}

3.4 待機(jī)狀態(tài)

向EEPROM寫入數(shù)據(jù)后,調(diào)用這個(gè)函數(shù)等待EEPROM 內(nèi)部擦寫完畢。

這個(gè)函數(shù)主要實(shí)現(xiàn)是向EEPROM 發(fā)送它設(shè)備地址,檢測(cè)EEPROM 的響應(yīng),若EEPROM 接收到地址后返回應(yīng)答信號(hào),則表示EEPROM 已經(jīng)準(zhǔn)備好,可以開始下一次通訊。函數(shù)中檢測(cè)響應(yīng)是通過讀取STM32 的SR1 寄存器的ADDR 位及AF 位來(lái)實(shí)現(xiàn)的,當(dāng)I2C 設(shè)備響應(yīng)了地址的時(shí)候,ADDR 會(huì)置1,若應(yīng)答失敗,AF 位會(huì)置1。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-400824.html

void I2C_EE_WaitEepromStandbyState(void)      
{
  vu16 SR1_Tmp = 0;

  do
  {
    #a)發(fā)送起始信號(hào)“S”
    I2C_GenerateSTART(EEPROM_I2Cx, ENABLE);
    #b)讀取I2C1 SR1 寄存器
    SR1_Tmp = I2C_ReadRegister(EEPROM_I2Cx, I2C_Register_SR1);
    #c)發(fā)送從地址
    I2C_Send7bitAddress(EEPROM_I2Cx, EEPROM_ADDRESS, I2C_Direction_Transmitter);
  }while(!(I2C_ReadRegister(EEPROM_I2Cx, I2C_Register_SR1) & 0x0002));
  
  #d)清除AF信號(hào)
  I2C_ClearFlag(EEPROM_I2Cx, I2C_FLAG_AF);
  #e)發(fā)送停止信號(hào)“P”    
  I2C_GenerateSTOP(EEPROM_I2Cx, ENABLE); 
}

到了這里,關(guān)于【STM32】入門(七):I2C硬件控制方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • STM32 SHT40驅(qū)動(dòng)源碼(使用硬件I2C)

    STM32 SHT40驅(qū)動(dòng)源碼(使用硬件I2C)

    目錄 簡(jiǎn)介: SHT40.c: SHT40.h 測(cè)試結(jié)果: ? ? ? ? SHT40是瑞士Sensirion公司推出的第四代溫濕度傳感器,內(nèi)部集成加熱器用于去除表面微小液滴。集成I2C接口,典型的相對(duì)濕度精度1.8%RH,典型溫度精度0.2℃,運(yùn)行在0-100%RH和-40-125℃的環(huán)境中。 主控:STM32H7B0VBT6 平臺(tái):STM32CubeIDE SHT4

    2024年03月19日
    瀏覽(131)
  • STM32F407系列硬件I2C筆記

    STM32F407系列有3個(gè)硬件I2C: I2C1:該接口位于GPIOB引腳上,包括PB6(I2C1_SCL)和PB7(I2C1_SDA)。 I2C2:該接口位于GPIOB引腳上,包括PB10(I2C2_SCL)和PB11(I2C2_SDA)。 I2C3:該接口位于GPIOA和GPIOC引腳上,包括PA8(I2C3_SCL)和PC9(I2C3_SDA)。 ? 硬件I2C的速度比軟件I2C更快,硬件I2C通??梢?/p>

    2024年02月04日
    瀏覽(34)
  • 【STM32】STM32學(xué)習(xí)筆記-硬件I2C讀寫MPU6050(35)

    【STM32】STM32學(xué)習(xí)筆記-硬件I2C讀寫MPU6050(35)

    I2C(Inter-Integrated Circuit)總線是一種由NXP(原PHILIPS)公司開發(fā)的兩線式串行總線,用于連接微控制器及其外圍設(shè)備。多用于主控制器和從器件間的主從通信,在小數(shù)據(jù)量場(chǎng)合使用,傳輸距離短,任意時(shí)刻只能有一個(gè)主機(jī)等特性。 串行的 8 位雙向數(shù)據(jù)傳輸位速率在標(biāo)準(zhǔn)模式下可

    2024年01月25日
    瀏覽(34)
  • STM32F030硬件I2C代碼及解析

    STM32F030硬件I2C代碼及解析

    剛接觸STM32的時(shí)候,第一個(gè)學(xué)習(xí)的就是I2C,當(dāng)時(shí)去網(wǎng)上學(xué)習(xí)別人寫得I2C代碼,雖然能用,但是當(dāng)時(shí)并不理解為什么要這么配置,特別希望有人把代碼掰碎了講講看,今天突然想起來(lái),就把以前寫的I2C代碼拿出來(lái)掰碎了捋捋,希望對(duì)新手有些幫助。 先說(shuō)說(shuō)STM32的I2C: ST的M3系列還

    2024年02月08日
    瀏覽(28)
  • 【STM32學(xué)習(xí)】——STM32-I2C外設(shè)&硬件讀寫MPU6050&軟硬件讀寫波形對(duì)比

    目錄 前言 一、I2C外設(shè) 二、硬件I2C操作流程 1.主機(jī)發(fā)送時(shí)序 3.其他時(shí)序

    2024年02月10日
    瀏覽(30)
  • 【STM32】軟件I2C控制頻率

    【STM32】軟件I2C控制頻率

    在上一篇文章中,我們已經(jīng)介紹了整個(gè)軟件I2C的實(shí)現(xiàn)原理,但是也遺留了一個(gè)問題,那就是I2C速率的控制,其實(shí)就是控制SCL信號(hào)的頻率。 微秒級(jí)延時(shí) 在上篇文章中,我們使用了SysTick進(jìn)行延時(shí),具體如下: 關(guān)于SysTick延時(shí)的原理,可以參考這篇文章 HAL庫(kù)下的systick 底層配置

    2024年02月11日
    瀏覽(21)
  • 01_STM32軟件+硬件I2C讀取MPU6050(HAL庫(kù))

    01_STM32軟件+硬件I2C讀取MPU6050(HAL庫(kù))

    目錄 1、I2C簡(jiǎn)介 2、I2C時(shí)序單元 2.1 起始條件 2.2 終止條件 2.3 發(fā)送一個(gè)字節(jié) 2.4 接收一個(gè)字節(jié) 2.5 發(fā)送應(yīng)答 2.6 接收應(yīng)答 3、I2C完整時(shí)序 3.1 指定地址寫一個(gè)字節(jié) 3.2 當(dāng)前地址讀一個(gè)字節(jié) 3.2?指定地址讀一個(gè)字節(jié) 4、簡(jiǎn)單軟件I2C代碼(HAL) 4.1 軟件I2C 4.2 軟件I2C讀MPU6050寄存器 5、ST

    2024年04月17日
    瀏覽(29)
  • STM32配合cubeMX硬件I2C驅(qū)動(dòng)0.96寸OLED

    STM32配合cubeMX硬件I2C驅(qū)動(dòng)0.96寸OLED

    目錄 一、簡(jiǎn)單介紹 1.1? ?OLED 1.2? ?I2C協(xié)議 二、實(shí)戰(zhàn) 2.1 工程配置 2.2 測(cè)試工程 2.3 波形分析 三、驅(qū)動(dòng)OLED 3.1?初始化代碼 3.2 清屏函數(shù) 3.3 設(shè)置坐標(biāo)函數(shù) 3.4 顯示字符函數(shù) 3.5 顯示字符串函數(shù) 3.6 顯示圖片函數(shù) 附錄 驅(qū)動(dòng)代碼文件 oled.c oled.h f6x8.h 有機(jī)發(fā)光二極管 (英語(yǔ):Organic

    2024年02月08日
    瀏覽(39)
  • RT-Thread在STM32硬件I2C的踩坑記錄

    RT-Thread在STM32硬件I2C的踩坑記錄

    參考文章: 1.將硬件I2C巧妙地將“嫁接”到RTT原生的模擬I2C驅(qū)動(dòng)框架 2.基于STM32F4平臺(tái)的硬件I2C驅(qū)動(dòng)實(shí)現(xiàn)筆記 3.《rt-thread驅(qū)動(dòng)框架分析》- i2c驅(qū)動(dòng) ??最近打算用RT-Thread做一個(gè)小demo玩玩,其中需要用I2C通信驅(qū)動(dòng)一個(gè)oled屏幕,但是找了一圈也沒找到RTT中對(duì)硬件I2C的支持方式以及

    2024年02月11日
    瀏覽(28)
  • STM32F407硬件I2C實(shí)現(xiàn)MPU6050通訊(CUBEIDE)

    STM32F407硬件I2C實(shí)現(xiàn)MPU6050通訊(CUBEIDE)

    工程代碼 https://download.csdn.net/download/weixin_52849254/87886714 I2C1通道可選擇三種不同的通訊協(xié)議:I2C、SMBus-Alert-mode、SMBus-two-wire-Interface。 SMBus (System Management Bus,系統(tǒng)管理總線), 為系統(tǒng)和電源管理這樣的任務(wù)提供了一條控制總線,SMBus與I2C總線之間在時(shí)序特性上存在一些差別 修改

    2024年02月09日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包