使用GPIO模擬I2C匯流排進行通訊

2021-07-04 00:03:33 字數 1763 閱讀 5296

下面給出了模擬i2c匯流排進行讀寫的偽**,用以說明如何使用gpio實現i2c通訊:

#define sda 254                         //定義sda所對應的gpio介面編號 

#define scl 255                         //定義scl所對應的gpio介面編號 

#define outp 1                          //表示gpio介面方向為輸出 

#define inp 0                           //表示gpio介面方向為輸入 

/* i2c起始條件 */

int i2c_start() 

/* i2c終止條件 */

void i2c_stop() 

/*  

i2c讀取ack訊號(寫資料時使用)

返回值 :0表示ack訊號有效;非0表示ack訊號無效 

*/ 

unsigned char i2c_read_ack() 

/* i2c發出ack訊號(讀資料時使用) */

int i2c_send_ack() 

/* i2c位元組寫 */

void i2c_write_byte(unsigned char b) 

i2c_send_ack();                 //向目標裝置傳送ack訊號 

return r; 

}  /* 

i2c讀操作

addr:目標裝置位址 

buf:讀緩衝區 

len:讀入位元組的長度 

*/ 

void i2c_read(unsigned char addr, unsigned char* buf, int len) 

{  int i; 

unsigned char t; 

i2c_start();                        //起始條件,開始資料通訊 

//傳送位址和資料讀寫方向 

t = (addr << 1) | 1;                    //低位為1,表示讀資料 

i2c_write_byte(t); 

//讀入資料 

for (i=0; i

/* 

i2c寫操作

addr:目標裝置位址 

buf:寫緩衝區 

len:寫入位元組的長度 

*/ 

void i2c_write (unsigned char addr, unsigned char* buf, int len) 

{  int i; 

unsigned char t; 

i2c_start();                        //起始條件,開始資料通訊 

//傳送位址和資料讀寫方向 

t = (addr << 1) | 0;                    //低位為0,表示寫資料 

i2c_write_byte(t); 

//寫入資料 

for (i=0; i

在上面的**中,i2c_read和i2c_write這兩個函式可以實現gpio介面對i2c匯流排的模擬讀寫。

使用GPIO模擬I2C匯流排進行通訊

i2c匯流排的通訊過程 見圖4 8 主要包含三個主要階段 起始階段 資料傳輸階段和終止階段。1.起始階段 在i2c匯流排不工作的情況下,sda 資料線 和scl 時鐘線 上的訊號均為高電平。如果此時主機需要發起新的通訊請求,那麼需要首先通過sda和scl發出起始標誌。當scl為高電平時,sda電平從...

普通IO模擬i2c匯流排

一 i2c匯流排協議 二.普通io模擬i2c匯流排 三.簡單i2c裝置驅動例項 下面簡單的微控制器程式,理解之後會讓你對i2c匯流排有更深的認識,思路 1.向eeprom中通過i2c匯流排寫入乙個位元組 2.通過i2c匯流排讀出寫入的位元組 3.如果寫入和讀出成功點亮發光二極體 執行結果 d1亮,程...

i2c匯流排時序

一心想踏入linux device driver的世界,想著i2c匯流排相對於usb等其他匯流排較為簡單,就以i2c作為切入點,希望可以逐步理解ldd的設計思想,並能理解其裝置模型的概念。在此對近期於i2c匯流排及驅動原始碼的理解做備忘,以免徒勞。平台友善之臂s70 tiny6410 cpusams...