I2C 協議之軟體模擬時序

2021-01-11 電子工程世界
1.1 I2C 簡介 

        I2C 總線時 PHILIPS 公司推出的一種串行總線,具備多主機系統所需的包括總線仲裁和高低速器件同步功能的高性能串行總線。它只需要兩跟雙向的信號線,一根數據線 SDA,一個是時鐘線 SCL。在 I2C 總線上面,每個器件都有自己相應的 I2C 地址,所以在兩個器件之間進行通信的時候,都要首先呼叫你想要通信的器件地址,然後等待相應的從器件進行應答之後才開始通信。首先我們來看一下,一個 I2C 信號傳輸的一個過程,如圖: 



從圖上我們可以看出在 I2C 上面一個完整信號的傳輸過程,一定要有一個始信號,還有一個結束信號,在每個字節傳輸結束的時候,從機還要提供一個應答信號。一個完整的信號傳輸就是這樣子。接下來我們來看一下,I2C 總線上面對起始信號、應答信號、結束信號、還有高低電平的協定是怎麼樣的呢?這裡有兩個要注意的要點: 
1、在總線空閒的時候,SDA 和 SCL 都是高電平的。 
2、在 SCL 為高電平期間,SDA 必須保持穩定。所以 SDA 改變狀態最好在 SCL 為低電
平的時候改變,如果在高電平改變的話回被認為是一種有效信號(如:起始信號或者結束信號) 


1. 起始信號 
起始信號簡介 SCL 線為高電平期間,SDA 線由高電平向低電平的變化表示起始信號, 
信號時序如圖: 

這裡要注意的就是,在 I2C 總線上面,當總線空閒的時候,SCL 和 SDA 都是高電平
的。起始信號,它是需要有一定的保持時間的,在 SDA 從高電平向低電平跳變的時候,兩
個先必須至少保持 4.7us 的時間,而跳變之後,也要保持 SCL 高電平和 SDA 低電平要至
少保持 4us 的時間(從這裡我們看出 I2C 總高速率已經決定了) 。 

 

//IO 口模擬起始信號 //產生起始信號 void I2C_Start(void) {     I2C_SDA_OUT();    I2C_SDA_H;  I2C_SCL_H;  delay_us(5);  I2C_SDA_L;  delay_us(6);  I2C_SCL_L; }

2. 結束信號 
結束信號簡介 SCL 線為高電平期間,SDA 線由低電平向高電平的變化表示終止信號。 
信號時序如圖: 
 
注意的就是這裡保持時間也是有一定限制的。 

 

 

 

 

//IO 口模擬結束信號 //產生停止信號 void I2C_Stop(void) {    I2C_SDA_OUT();     I2C_SCL_L;    I2C_SDA_L;    I2C_SCL_H;    delay_us(6);    I2C_SDA_H;    delay_us(6); }

3. 應答信號 
應答信號 
應答,也叫響應。數據的傳輸必須要帶應答。在響應的時鐘脈衝期間(也就是 SCL 在高電
平的時候) ,發送器釋放 SDA 線(釋放 SDA 意思就是將 SDA 拉為高電平,這裡要注
意的是,不能在 SCL 為高電平的時候講 SDA 從低電平拉到高電平,可以在在 SCL 在低
電平的時候,將 SDA 拉為高電平等待),然後等待應答,在應答時鐘脈衝器件,接收器 
必須將 SDA 拉低,使它在這個時鐘脈衝的高電平期間保持穩定的低電平。而一個字節傳輸
完畢之後,接收器沒有應答則表示接收完畢。還有一種情況是,當主機作為接收器的時候,接收完最後一個字節之後,必須向從機發出一個結束傳送的信號。這個信號是由對從機「非 應答」來實現的。(從上面的規則我們知道,當主機作為接收器的時候,如果是進行應答,那麼在接收完一個字節的最後一位之後產生一個低電平的時鐘,進行應答。而非應答呢,就是產生一個高電平的時鐘,進行應答) 。如果大家不是很理解呢,大家可以參考我們例程裡面 I2C 的 IO 模擬信號裡面接收數據的函數,最後的應答和非應答。 

 

//IO 口模擬應答信號 //主機產生應答信號 ACK void I2C_Ack(void) {    I2C_SCL_L;    I2C_SDA_OUT();    I2C_SDA_L;    delay_us(2);    I2C_SCL_H;    delay_us(5);    I2C_SCL_L; } //主機不產生應答信號 NACK void I2C_NAck(void) {    I2C_SCL_L;    I2C_SDA_OUT();    I2C_SDA_H;    delay_us(2);    I2C_SCL_H;    delay_us(5);    I2C_SCL_L; } //等待從機應答信號 //返回值:1 接收應答失敗 //    0 接收應答成功 u8 I2C_Wait_Ack(void) {  u8 tempTime=0;   I2C_SDA_IN();   I2C_SDA_H;  delay_us(1);  I2C_SCL_H;  delay_us(1);   while(GPIO_ReadInputDataBit(GPIO_I2C,I2C_SDA))  {   tempTime++;   if(tempTime>250)   {    I2C_Stop();    return 1;   }    }   I2C_SCL_L;  return 0; }


4. 邏輯「1」的表示 
要傳輸數據,那麼肯定要分傳輸「1」和「0」 ,而在 I2C 上面是怎麼表示這兩個邏輯變量
的呢?如圖: 

  


一般 I2C 讀取的時候,都是在 SCL 的為高電平的時候進行讀取,所以在 SCL 為高電平
的時候,需要保持 SDA 穩定。而且注意的還有就是他們的保持時間要大於 4us。 

5. 邏輯「0」的表示 
邏輯「0」和邏輯「1」的表示其實差不多,只是 SDA 正好相反。如圖: 

 


注意的事項跟邏輯「1」的表示差不多。 

6. IO 口模擬發送一個字節數據 

 

//I2C 發送一個字節 void I2C_Send_Byte(u8 txd) {  u8 i=0;   I2C_SDA_OUT();  I2C_SCL_L;//拉低時鐘開始數據傳輸   for(i=0;i0) //0x80  1000 0000    I2C_SDA_H;   else    I2C_SDA_L;    txd<<=1;   I2C_SCL_H;   delay_us(2); //發送數據   I2C_SCL_L;   delay_us(2);  } }


7. IO 口模擬接收一個字節數據 

 

//I2C 讀取一個字節  u8 I2C_Read_Byte(u8 ack) {    u8 i=0,receive=0;     I2C_SDA_IN();    for(i=0;i<8;i++)    {      I2C_SCL_L;   delay_us(2);   I2C_SCL_H;   receive<<=1;   if(GPIO_ReadInputDataBit(GPIO_I2C,I2C_SDA))      receive++;   delay_us(1);     }      if(ack==0)      I2C_NAck();  else   I2C_Ack();   return receive; }

 


關鍵字:I2C  協議  軟體模擬  時序 編輯:什麼魚 引用地址:http://news.eeworld.com.cn/mcu/ic459198.html

推薦閱讀

三分鐘帶你了解MSP430F249硬體I2C查詢法讀寫AT24C02

/********************************************************************** File : I2C.c 「 Master Read Write |** Version : 1.0** DescripTIon: I2C 查詢法讀寫24C02** Author : LightWu** Date : 2013-4-26** 必須注意多字節數據讀取時,發送停止位需要在最後一個字節讀取之前** 否則數據讀取後,停止位發送容易失敗,導致從機接收不到停止位

發表於 2021-01-04

ADI降壓-升壓電池充電控制器,兼具最大功率點跟蹤+I2C特性

ADI宣布推出LT8491降壓-升壓電池充電控制器,該控制器具有最大功率點跟蹤(MPPT)、溫度補償和I2C接口等特性,適用於遙測和控制。該器件的工作電壓可高於、低於或等於經調節的電池浮充電壓。LT8491提供三種可選的恆流恆壓(CC-CV)充電曲線,因此非常適合為各種化學電池充電,包括密封鉛酸電池、凝膠電池、溢流型電池和鋰離子電池。所有充電終止算法均已內置,無需開發軟體或固件,從而縮短設計周期。                                &nbsp

發表於 2020-12-15

STM32——I2C

一、I2C協議        I 2 C (Inter-Integrated Circuit)協議是由 Philips 公司開發的,由於它具備引腳少、硬體實現簡單、可擴展性強、不需要如 USART、CAN 的外部收發設備等特點,現在被廣泛地使用在系統內多個集成電路(IC)間的通信。1、物理層(1)它只使用兩條總線線路 :一條雙向串行數據線(SDA) ,一條串行時鐘線 (SCL)。(2)每個連接到總線的設備都有一個獨立的地址,主機可以利用這個地址進行不同設備之間的訪問。(3)多主機同時使用總線時,為了防止數據衝突,會利用仲裁方式決定由哪個設備佔用總線。(4)具有三種傳輸模式

發表於 2020-12-08

SPI,UART,I2C都有什麼區別,及其各自的特點

區別:SPI:高速同步串行口。3~4線接口,收發獨立、可同步進行 UART:通用異步串行口。按照標準波特率完成雙向通訊,速度慢 I2C:一種串行傳輸方式,三線制,網上可找到其通信協議和用法的 3根線實現數據雙向傳輸 串行外圍接口 Serial peripheral interface UART:通用異步收發器 UART是用於控制計算機與串行設備的晶片。有一點要注意的是,它提供了RS-232C數據終端設備接口,這樣計算機就可以和數據機或其它使用RS-232C接口的串行設備通信了。作為接口的一部分,UART還提供以下功能: 將由計算機內部傳送過來的並行

發表於 2020-10-28

採用MSP430F247單片機實現TMP275測溫儀的I2C模塊的連接

1 引言溫度傳感器TMP275可直接輸出數位訊號,而無需取樣、放大、濾波和模數信號的轉換,可以直接傳輸給單片機信號處理系統;而且輸出信號解析度可以達到0.0625,測溫精度±0.5℃,若使用MSP430F247做控制器,可直接與其自帶的I2C模塊相連,使用方便。2 電路設計2.1 總體方案設計該測溫儀的硬體結構由溫度測量、核心控制電路、顯示電路和電源電路等4部分組成。總體方案框圖如圖l所示。2.2 單元模塊設計2.2.1 核心控制電路核心控制電路採用MSP4313F247完成數據的測量和處理,實現溫度測量和控制輸出顯示功能,電路如圖2所示,其中的P3.1.P3.2分別是MSP430F247自帶I2C模塊的SCL和SDA,可以直接

發表於 2020-10-16

24c08 I2C總線協議操作程序彙編和C語言2個版本詳解

;24c08操作時序為:起始信號sclk拉高情況下sda由高變低,表示起始;                 結束信號sclk拉高情況下sda由低變高,表示結束;                 字節由高位向低位依次發送;                第一個字節是地址和讀寫控制,第二個是存儲地址,第三個是數據,每個數據結束器件都會發送 ack應答信號;;  I2C

發表於 2020-10-14

相關焦點

  • 關於stm32通信協議:軟體模擬SPI、軟體模擬I2C的總結
    趁著幫老師代上嵌入式實驗課的機會,又重新熟悉了一遍stm32的通信協議:串口協議、SPI協議、I2C協議、RS485協議。大概半年前,是過了一遍的,但也只停留於讀了遍代碼,跑了下例程,最近又過了一遍(自己仔細的看了一遍,老師還給我們講了一遍,自己又講了一遍),然後還寫了一遍軟體模擬SPI、軟體模擬I2C的代碼,才徹底的懂了個皮毛 ,:)。
  • 關於調試stm32和stm8(51單片機)的i2c和spi協議的之間的區別
    在調試STM32的i2c和io口模擬spi協議時發現時序是很關鍵的。stm32在72M運行下可以實現i2c或者spi協議,但並不代表把相同的代碼移植到51單片機上就會成功的跑起來,因為51單片機的速讀最塊8M,所以在時序上會產生很多大的區別。經過測試,在stm32上的spi協議時鐘線可達到20Khz,移植到51後,頻率會降到<10hz。
  • I2C總線協議分析
    常見的硬體結構圖(一個適配器,兩根線,若干設備而已)I2C總線通信時序使用I2C通信時,必須指定主從設備,一般包含有I2C控制器的處理器被配置成主設備,掛接在i2c總線上的外設作為從設備。通信開始都是由主設備發起的,在i2c總線上的每個設備都有一個7bit位的地址,稱為i2c設備地址。主設備如何發起開始和停止通信信號?
  • 單片機,硬體IIC和軟體IIC的區別
    所謂硬體I2C對應晶片上的I2C外設,有相應I2C驅動電路,其所使用的I2C管腳也是專用的;軟體I2C一般是用GPIO管腳,用軟體控制管腳狀態以模擬I2C通信波形。硬體I2C的效率要遠高於軟體的,而軟體I2C由於不受管腳限制,接口比較靈活。模擬I2C 是通過GPIO,軟體模擬寄存器的工作方式,而硬體(固件)I2C是直接調用內部寄存器進行配置。
  • 《rt-thread驅動框架分析》-i2c驅動
    驅動層:分為硬體I2C驅動和軟體I2C驅動。核心層: ①其中bit_ops是RTT為軟體I2C提供的中間層,它的作用:為底層模擬I2C驅動提供回調接口,為核心層提供統一I2C通信接口。②而硬體I2C則直接對接核心層,提供統一I2C通信接口。③RTT在核心層上,也像pin驅動那樣,封裝了一套API(虛線箭頭),供用戶直接使用。
  • STM32F103編程學習——I2C通信
    具體時序如下圖所示。可根據不同硬體進行軟體配置。工程配置利用cube mx軟體配置系統時鐘,i2c外設等相關配置。配置硬體連接圖使用i2c1來連接EEPROM晶片24C02。為了防止意外擦寫,特將WP引腳信號引出通過軟體來控制,每次在需要寫數據到eeprom中去時,需要先將該信號拉低,否則防寫。配置好上述基本設置後,生成工程,添加應用代碼即可實現i2c讀寫操作。
  • i2c總線用來做什麼_i2c總線數據傳輸過程
    打開APP i2c總線用來做什麼_i2c總線數據傳輸過程 網絡整理 發表於 2020-11-24 14:16:18   i2c總線用來做什麼   I2C總線控制器為微控制器或微處理器提供控制I2C總線的接口,它控制所有I2C總線的特殊序列、協議、仲裁、時序,這裡指MPC8250提供的I2C總線控制接口。
  • I2C 總線協議的簡單總結
    總線信號時序分析    1.含CPU的智能器件,地址由軟體初始化時定義,但不能與其它的器件有衝突;    2. 不含CPU的非智能器件,由廠家在器件內部固化,不可改變。大多數IC都支持I2C協議。 I2C的時序圖為:I2C數據傳輸是在起始條件和停止條件之間。起始條件和停止條件都是SCL為高一段時間產生。起始條件為SDA從高變為低,停止條件為SDA從低變為高。
  • STM32——硬體和軟體I2C協議
    I2C協議I2C 通訊協議(Inter-Integrated Circuit)是由 Phiilps 公司開發的,由於它引腳少,硬體實現簡單,可擴展性強,不需要 USART、CAN 等通訊協議的外部收發設備,現在被廣泛地使用在系統內多個集成電路(IC)間的通訊。
  • 狗汪汪玩轉嵌入式——I2C 協議分析
    跟以往純軟體安全研究不同的是,這類研究往往需要結合相應的硬體知識和設備。如何能快速入門嵌入式系統?雷鋒網(公眾號:雷鋒網)邀請了狗汪汪,分享針對I2C協議的實戰案例和相應的工具使用。希望可以一起來Hacking all the Things。本文由阿里雲先知社區小冰推薦。
  • 使用Verilog來實現EEPROM的讀寫,進行一個簡單的I2C實戰應用
    使用Verilog來實現EEPROM的讀寫,進行一個簡單的I2C實戰應用 李倩 發表於 2018-08-31 17:17:42 I2C在晶片的配置中應用還是很多的,比如攝像頭、VGA轉HDMI轉換晶片,之前博主分享過一篇I2C協議的基礎學習
  • 基於I2C總線性能問答集錦
    [答:Alex] CAN總線通過複雜的傳輸協議可以實現很高容錯性能,所以多用於對數據準確要求很高的場合,比如汽車,機械等領域,但是其速度很低,協議複雜。而I2C總線協議實現非常的簡單,速度更高,但是沒有提供如CAN那樣複雜的糾錯和檢測機制。所以綜合而言,CAN複雜,但是容錯度高,速度低。
  • 快速簡單理解I2C標準協議
    對於嵌入式開發的朋友來說,I2C協議實在是再熟悉不過了,有太多的器件,採用的都是通過I2C來進行相應的設置。今天,我們就隨便聊聊這個I2C協議。本文引用地址:http://www.eepw.com.cn/article/201807/383799.htmI2C協議中最重要的一點是I2C地址。這個地址有7位和10位兩種形式。
  • 測試測量儀器之二十五重溫I2C總線協議並用Pico示波器進行實測
    用到的這臺Pico示波器有兩個模擬輸入埠和16個數字埠,模擬埠分別連到DAC晶片的兩個模擬輸出,數字埠的D0和D1分別連接DAC輸入的SDA和SCL信號。pico示波器模擬信號顯示下圖展示的就是PicoScope的軟體界面,分成了三個區域:最上面的一個顯示兩個模擬信號A和B,以及I2C總線的概貌。
  • I2C總線驅動程序
    static struct s3c2440_i2c_regs *s3c2440_i2c_regs;static void s3c2440_i2c_start(void){ s3c2440_i2c_xfer_data.state = STATE_START;
  • AXI總線協議的幾種時序介紹
    由於ZYNQ架構和常用接口IP核經常出現 AXI協議,賽靈思的協議手冊講解時序比較分散。所以筆者收藏AXI協議的幾種時序,方便編程。 1》AXI_LITE協議: ( 1) 讀地址通道, 包含ARVALID, ARADDR, ARREADY信號; ( 2) 讀數據通道, 包含RVALID, RDATA, RREADY, RRESP信號; ( 3) 寫地址通道, 包含AWVALID, AWADDR, AWREADY信號; ( 4) 寫數據通道, 包含WVALID,
  • 程序猿眼中的華為海思晶片之I2C配置
    I2C總線上的器件有主從之分,在嵌入式系統上的主器件一般是嵌入式主晶片(MCU),主器件負責啟動、終止數據傳送,產生時鐘信號。從器件一般是外部設備,像小編所在行業的外部設備包括溫度傳感器、Tunner、HDMI等。I2C主設備配置了解了I2C總線的定義和基本原理後,我們怎樣做才能讓I2C總線正常工作呢?
  • fireflyAIO-3288C主板I2C簡介
    : static const struct i2c_device_id lt8641ex_id[] = { { lt8641ex, 0 }, { } }; MODULE_DEVICE_TABLE(i2c, lt8641ex_id); i2c_driver 如下所示:
  • i2c的設備樹是如何匹配以及何時調用probe的?
    對應總線結構體變量為i2c_bus_type,定義如下:drivers/i2c/I2c-core.c struct bus_type i2c_bus_type = { .name  = "i2c", .match  = i2c_device_match, .probe  = i2c_device_probe, .remove  = i2c_device_remove
  • S3C2440模擬IIC方式操作EEPROM
    2.使用驅動本身帶的模擬iic程序,也就是bit-banging。3.使用硬體iic,這不在我的討論範圍之內,有時間也可以補充上來。我目前使用的是在linux作業系統上實現的代碼:貼出實現的代碼(不使用內核中的模擬iic程序):第一部分是驅動層的代碼:1.