摘要:對應代碼為讀取口線狀態拉低總線發送信號根據上方時序圖可以知道在為高電平期間,發送數據,發送次數據,數據為被拉高,被拉低,數據為,被拉低。
I2C 總線(I2C bus,Inter-IC bus)是一個雙向的兩線連續總線,提供集成電路(ICs)之間的通信線路。I2C總線是一種串行擴展技 術,最早由 Philips 公司推出,廣泛應用于電視,錄像機和音頻等設備。I2C總線的意思:“完成集成電路或功能單元之間信息交換的規范或協議”。Philips公司推出的 I2C 總線采用一條數據線(SDA),加一條時鐘線(SCL)來完成數據的傳輸及外圍器件的擴展;對各個節點的尋址是軟尋址方式,節省了片選線,標準的尋址字節 SLAM 為7位,可以尋址127個單元。
?
static void i2c_Delay(void){ uint8_t i; for (i = 0; i < 10; i++);}
邏輯分析測試得出
? 條件: CPU 主頻 72MHZ ,MDK 編譯, 1級優化
? 循環次數 10 ,SCL 頻率 = 205 KHZ
? 循環次數 7 ,SCL 頻率 = 347 KHZ, SCL 高電平時間 1.5us, SCL 低電平時間 2.87us
? 循環次數 5 ,SCL 頻率 = 421 KHZ ,SCL 高電平時間 1.25us, SCL 低電平時間 2.37us
?
根據上方時序圖可以知道
? I2C 起始信號:當 SCL 高電平時,SDA 出現一個下跳沿表示 I2C 總線啟動信號
? 對應代碼為:
void i2c_Start(void){ OLED_I2C_SDA_1(); //SDA 總線置1 OLED_I2C_SCL_1(); //SCL 總線置1 i2c_Delay(); //延時信號 OLED_I2C_SDA_0(); //置 0 i2c_Delay(); OLED_I2C_SCL_0(); //SCL 置0 i2c_Delay();}
?
根據上方時序圖可以知道
? I2C 結束信號:當 SCL 高電平時,SDA 出現一個上跳沿表示 I2C 總線停止信號
? 對應代碼為:
void i2c_Stop(void){ OLED_I2C_SDA_0(); OLED_I2C_SCL_1(); i2c_Delay(); OLED_I2C_SDA_1();}
?
根據上方時序圖可以知道
? I2C等待應答信號:當 SDA 高電平,SCL 也處在高電平,這時候 SDA 返回的數據, 1 代表無器件應答,0 代表正確應答。
? 對應代碼為:
uint8_t i2c_WaitAck(void){ uint8_t re; OLED_I2C_SDA_1(); i2c_Delay(); OLED_I2C_SCL_1(); i2c_Delay(); if (OLED_I2C_SDA_READ()) //讀取 SDA 口線狀態 { re = 1; } else { re = 0; } OLED_I2C_SCL_0(); //拉低 SCL 總線 i2c_Delay(); return re;}
?
根據上方時序圖可以知道
? 在SCL為高電平期間,發送數據,發送8次數據,數據為1,SDA被拉高,SDA被拉低,數據為0,SDA被拉低。
void i2c_SendByte(uint8_t _ucByte){ uint8_t i; //先傳輸高位 bit7 for (i = 0; i < 8; i++) { if (_ucByte & 0x80) //判斷 高位 { OLED_I2C_SDA_1(); //設置 SDA 傳輸數據 } else { OLED_I2C_SDA_0(); } i2c_Delay(); OLED_I2C_SCL_1(); //拉高 SCL ,發送數據 i2c_Delay(); OLED_I2C_SCL_0(); //拉低 SCL ,改變 SDA 數據,左移 _ucByte ,再次判斷 高位 bit6 等等 if (i == 7) { OLED_I2C_SDA_1(); //退出傳輸, SDA 置 1 } _ucByte <<= 1; i2c_Delay(); }}
?
uint8_t i2c_ReadByte(void){ uint8_t i; uint8_t value; value = 0; for (i = 0; i < 8; i++) { value <<= 1; //左移 1 位 OLED_I2C_SCL_1(); // SCL 置 1 i2c_Delay(); if (OLED_I2C_SDA_READ()) //讀取 SDA 口數據 { value++; //每次都左移一位,value++,就等于 | } OLED_I2C_SCL_0(); //SCL 置 0 ,改變 SDA 數據 i2c_Delay(); } return value; //返回讀取到的數據}
SCL 置 1,SDA數據穩定,SCL 置 0,可以改變 SDA數據
?
?第一次嘗試編寫博客,若是有什么建議,歡迎批評指出。
?后續會逐步分塊更新,并會在最后一篇文章上傳源代碼。
?若是該文章對你有作用或是覺得文章寫得還行,幫忙點點贊,三連!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/121622.html
摘要:如圖所示在了解起始條件和停止條件后,我們再來看看在這個過程中數據的傳輸是如何進行的。四參考資料通過接口實現溫濕度的采集硬件和軟件區別 stm32通過I2C接口實現...
摘要:顯示模塊如果還沒有看過協議的,請移步先看下面這篇文章協議好的,現在我們進入正題向寄存器地址寫入一個的數據開啟發送設備地址讀寫控制,采用宏定義方式一般地址為,不行就嘗試下傳入參數,為寄存器參數,根據手冊,寫入命令寄 ...
摘要:每個字節后必須跟一個響應位。低速率一般是同一個板子上的兩個芯片間通信,數據量不大,速率低。速率幾百,速率可能不同,不能超過的最高速率。 介紹:I2C通訊協議(Inter-Integrated Circuit)引腳少,硬件實現簡單,可擴展性強,不需要USART、CAN等通訊協議的外部收發設備,...
摘要:協議物理層原理總體特征協議層起始和停止條件數據有效性響應應答尋址讀數據寫數據單片機通訊軟件模擬硬件外設一物理層原理總線,分別由串行數據線和串行時鐘線及上拉電阻組成。第八步,主機發送一個校驗碼,此校驗值為步數據產生的校驗碼。 ...
摘要:總線空閑和均為高電平協議起始位為高電平時,出現下降沿協議終止位為高電平時,出現上升沿。主設備產生所有時鐘脈沖,包括確認位第九個時鐘脈沖。當在第個時鐘脈沖期間保持高時,這被定義為非應答信號。 ...
閱讀 2485·2021-10-19 11:45
閱讀 2464·2021-09-30 09:56
閱讀 1432·2021-09-30 09:47
閱讀 589·2019-08-30 15:53
閱讀 1834·2019-08-30 15:44
閱讀 583·2019-08-30 12:52
閱讀 1084·2019-08-30 11:16
閱讀 1605·2019-08-29 16:36