中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

STM32 IIC是什么意思

發布時間:2021-12-27 11:29:29 來源:億速云 閱讀:223 作者:小新 欄目:互聯網科技

這篇文章主要介紹了STM32 IIC是什么意思,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

1、IIC定義

IIC 即Inter-Integrated Circuit(集成電路總線),這種總線類型是由飛利浦半導體公司(后被NXP收購)在八十年代初設計出來的一種簡單、雙向、二線制、同步串行總線,主要是用來連接整體電路(ICS) ,IIC是一種多向控制總線,也就是說多個芯片可以連接到同一總線結構下,同時每個芯片都可以作為實時數據傳輸的控制源。多主多從的通訊協議。

下文將結合NXP官方的IIC手冊講解IIC協議。下載鏈接見文末。

STM32 IIC是什么意思

I2C串行總線一般有兩根信號線,一根是雙向的數據線SDA,另一根是時鐘線SCL。所有接到I2C總線設備上的串行數據SDA都接到總線的SDA上,各設備的時鐘線SCL接到總線的SCL上。速率最高400Kbit/s。

STM32 IIC是什么意思

2、IIC協議規范

2.1 SDA和SCL信號

STM32 IIC是什么意思

STM32 IIC是什么意思

起始條件:SCL線是高電平時,SDA線從高電平向低電平切換。

停止條件:SCL線是高電平時,SDA線從低電平向高電平切換。

STM32 IIC是什么意思

代碼實現

void I2C_Start(void)
{
  //IO輸出
  SDA_OUT(); 
  SCL_OUT(); 
  I2C_DELAY();
  //IO置高
  SDA_SET();  
  SCL_SET(); 
  //延時
  I2C_DELAY();  
  //為低
  SDA_CLR();
  I2C_DELAY();
  I2C_DELAY();
  SCL_CLR();
}

結束信號時類似的方式(不是動圖)STM32 IIC是什么意思

代碼實現

void I2C_Stop(void)
{
  //IO輸出
  SDA_OUT(); 
  SCL_OUT();
  //IO置0
  SDA_CLR();  
  SCL_CLR(); 
  I2C_DELAY();
  SCL_SET();
  //延時
  I2C_DELAY();  
  I2C_DELAY();
  I2C_DELAY();
  //SDA置1
  SDA_SET();
  I2C_DELAY();
  I2C_DELAY();
}

2.4 字節格式

SDA數據線上的每個字節必須是8位,每次傳輸的字節數量沒有限制。每個字節后必須跟一個響應位(ACK)。首先傳輸的數據是最高位(MSB),SDA上的數據必須在SCL高電平周期時保持穩定,數據的高低電平翻轉變化發生在SCL低電平時期。

STM32 IIC是什么意思

每一個字節后面跟著一個ACK,有ACK就可以繼續寫或讀。NACK,就停止

ACK:主機釋放總線,傳輸完字節最后1位后的SCL的高電處,從機拉低電平。

NACK:主機釋放總線,傳輸完字節最后1位后的SCL的高電處,從機無響應,總線為高電平。

動畫描述寫入的過程STM32 IIC是什么意思

代碼實現

uint8_t I2C_Send_byte(uint8_t data)
{
  uint8_t k;
  //發送8bit數據
  for(k=0;k<8;k++){
    
    I2C_DELAY();
    if(data&0x80){
      SDA_SET();
    }
    else{
      SDA_CLR();
    }
    data=data<<1;
    I2C_DELAY();
    SCL_SET();
    I2C_DELAY();
    I2C_DELAY();
    SCL_CLR();
  }
  //延時讀取ACK響應
  I2C_DELAY();
  SDA_SET();
  //置為輸入線
  SDA_IN();
  I2C_DELAY();
  SCL_SET();   
  I2C_DELAY(); //這里出現了問題,延時變的無限大
  //讀數據
  k=SDA_READ();
  if(k){ NACK響應
    return 0;
  }
  I2C_DELAY();
  SCL_CLR();
  I2C_DELAY();
  SDA_OUT();
  if(k){ NACK響應
    return 0;
  }
  return 1;
}
 
uint8_t I2C_Receive_byte(uint8_t flg)
{
  uint8_t k,data;
  //接收8bit數據
  //置為輸入線
  
  SDA_IN();
  data=0;
  for(k=0;k<8;k++){
    I2C_DELAY();
    SCL_SET();
    I2C_DELAY();
    //讀數據
    data=data |SDA_READ();
    data=data<<1;
    I2C_DELAY();
    SCL_CLR();
    I2C_DELAY(); 
  }
  data=data>>1; //往回移動1次
  //返回ACK響應
  //置為輸出線
  SDA_OUT();
  if(flg){
    SDA_SET(); //輸出1-NACK
  }else{
    SDA_CLR();//輸出0-ACK
  }
  I2C_DELAY();
  SCL_SET();
  I2C_DELAY();
  I2C_DELAY();
  SCL_CLR();
  I2C_DELAY();
  SDA_OUT();
  //返回讀取的數據
  return (uint8_t)data;
}

2.5 從機地址和讀寫位STM32 IIC是什么意思

這里只說7位地址,前7位為地址,最后一位為讀寫位,1表示讀操作,0表示寫操作

STM32 IIC是什么意思

主機立即讀從機數據,從第一個字節

STM32 IIC是什么意思

3、計算IIC的頻率

通信頻率由主機掌控,也就是代碼中的延時函數決定的

從上面,我們得知最高速為400Kbit/s。我們設計300Kbit/s。

速率300Kbit/s,對應周期1/300ms=10/3us≈3us,4分頻就是3/4us。

我們使用的延時是,1/120MHZ*3*30 =3/4us

也就是頻率是300Kbit/s

和SPI類似,時鐘下降沿時,數據轉換,時鐘上升沿時,采樣數據。也就是時鐘高電平數據有效。

/*120Mhz時鐘時,當ulCount為1時,函數耗時3個時鐘,延時=3*1/120us=1/40us*/
/*
SystemCoreClock=120000000
us級延時,延時n微秒
SysCtlDelay(n*(SystemCoreClock/3000000));
ms級延時,延時n毫秒
SysCtlDelay(n*(SystemCoreClock/3000));
m級延時,延時n秒
SysCtlDelay(n*(SystemCoreClock/3));
*/
 
#if defined   (__CC_ARM) /*!< ARM Compiler */
__asm void
SysCtlDelay(unsigned long ulCount)
{
    subs    r0, #1;
    bne     SysCtlDelay;
    bx      lr;
}
#elif defined ( __ICCARM__ ) /*!< IAR Compiler */
void
SysCtlDelay(unsigned long ulCount)
{
    __asm("    subs    r0, #1\n"
       "    bne.n   SysCtlDelay\n"
       "    bx      lr");
}
 
#elif defined (__GNUC__) /*!< GNU Compiler */
void __attribute__((naked))
SysCtlDelay(unsigned long ulCount)
{
    __asm("    subs    r0, #1\n"
       "    bne     SysCtlDelay\n"
       "    bx      lr");
}
 
#elif defined  (__TASKING__) /*!< TASKING Compiler */                           
/*無*/
#endif /* __CC_ARM */
 
 
/*
 * @brief  SysCtlDelay
 * @param  ulCount 延時值,必須大于0
 * @retval None
 */
void SysCtlDelay_IIC(unsigned long ulCount)
{
    SysCtlDelay(ulCount);
}
 
 
/定義時鐘頻率,300KHz
#define I2C_DELAY()  SysCtlDelay_IIC(30)

感謝你能夠認真閱讀完這篇文章,希望小編分享的“STM32 IIC是什么意思”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乐山市| 庆阳市| 武夷山市| 西贡区| 长岭县| 贡嘎县| 松阳县| 五莲县| 调兵山市| 东平县| 湾仔区| 远安县| 碌曲县| 连平县| 京山县| 逊克县| 宜城市| 塔河县| 剑河县| 南城县| 津南区| 闽清县| 潮安县| 双流县| 健康| 东海县| 永新县| 洪雅县| 河源市| 红原县| 阳山县| 大田县| 黑龙江省| 高碑店市| 五大连池市| 库车县| 冕宁县| 抚远县| 吴堡县| 武宣县| 永康市|