下面給出了模擬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...