IIC簡單總結

2021-10-09 06:48:52 字數 3914 閱讀 9716

一.iic硬體上只有兩根線:時鐘線scl與資料線sda;軟體上有以下幾個訊號:start,stop,ack,nack。

start:

由主機發出,當scl位於高電平時,sda發生乙個下降沿訊號(電平由高到低)

由主機發出,當scl處於高電平時,sda發生乙個上公升沿訊號(電平由低到高)

由從機發出,當主機傳送完1byte資料後,釋放sda線,在第九個時鐘時,從機將sda拉低

nack:

由主機發出,當主機接收完1byte資料後,若不想繼續接收資料,則在第九個時鐘時,主機將sda拉高

二.因為iic頻率支援100——400khz,即scl週期為2.5——10us,所以scl乙個週期中高電平時間約為1.25——5us。iic傳輸資料的過程如下:

傳送乙個start開始訊號

等待從機發出ack應答訊號

傳送乙個start開始訊號

傳送暫存器位址(暫存器位址可能是8位、10位或16位,這裡以8位舉例)

等待從機發出ack應答訊號

當主機是寫入1byte資料操作時

(1).傳送1byte資料

(2).等待從機發出ack應答訊號

(3).傳送stop訊號

當主機是讀取1byte資料操作時

(1). 傳送乙個start開始訊號

(2).傳送1byte資料,高7位為裝置位址,最後一位是讀寫位,此時是1(表示讀,因為下一步要讀取裝置暫存器的值)

(3).等待從機發出ack應答訊號

(4).接收1byte資料(暫存器的數值)

(5).傳送nack訊號

(6).傳送stop訊號

注意:資料傳輸時,在scl處於高電平時,sda電平不能變化;只有scl處於低電平時,sda電平才可以變化。

/*iic結構體*/

typedef

struct

iic_t;

/*iic初始化,按實際開發環境自行編寫*/

/*iic傳輸乙個位元組*/

unsigned

char

iic_tranfer_byte

(iic_t *iic,

unsigned

char dir)

;#endif

#include

"analog_iic.h"

#include

"bsp_uart.h"

#include

"stdio.h"

#include

"bsp_gpio.h"

/*iic開始訊號*/

static

void

iic_start

(iic_t *iic)

;/*iic停止訊號*/

static

void

iic_stop

(iic_t *iic)

;/*iic傳送nack訊號*/

static

void

iic_send_nack

(iic_t *iic)

;/*iic等待ack訊號*/

static

unsigned

char

iic_wait_ack

(iic_t *iic)

;/*傳送乙個位元組*/

static

void

iic_send_byte

(iic_t *iic,

unsigned

char byte)

;/*接收乙個位元組*/

static

unsigned

char

iic_recive_byte

(iic_t *iic)

;/*iic初始化,按實際開發環境自行編寫*/

/*iic開始訊號*/

void

iic_start

(iic_t *iic)

/*iic停止訊號*/

void

iic_stop

(iic_t *iic)

/*iic傳送nack訊號*/

void

iic_send_nack

(iic_t *iic)

/*iic等待ack訊號*/

unsigned

char

iic_wait_ack

(iic_t *iic)

} iic->

delay()

; iic->

scl_low()

; iic->

delay()

; iic->

delay()

;return iic_ack_ok;

}/*傳送乙個位元組*/

void

iic_send_byte

(iic_t *iic,

unsigned

char byte)

}/*接收乙個位元組*/

unsigned

char

iic_recive_byte

(iic_t *iic)

return byte;

}/*iic傳輸乙個位元組*/

unsigned

char

iic_tranfer_byte

(iic_t *iic,

unsigned

char dir)

/*重新開始*/

iic_start

(iic)

;/*傳送暫存器位址*/

iic_send_byte

(iic,iic->reg_address)

;/*等待ack訊號*/if(

iic_wait_ack

(iic)

)/*器件位址*/

_drive_addre =

((iic->drive_address <<1)

|(iic->dir));

/*如果是讀,則需要再次寫入器件位址*/

if(iic->dir == iic_read)

iic->byte =

iic_recive_byte

(iic)

;iic_send_nack

(iic)

;//傳送nack

}/*如果是寫,則直接寫入資料*/

else

if(iic->dir == iic_write)

}/*停止訊號*/

iic_stop

(iic)

;return iic_tran_ok;

}

iic匯流排總結

1 iic是一種半雙工序列通訊匯流排,由兩根訊號線組成一根雙向資料線sda和一根時鐘線clk組成。2 iic傳輸速率有標準模式100kbps,快速模式400kbps,高速模式3.4mbps。具體的傳輸速率要根據實際需求及晶元裝置手冊的具體設計準則進行選配。3 iic匯流排上的裝置分為主機和從機並且匯...

IIC配置及實驗總結

一 iic配置 1 iic裝置查詢命令 ls sys bus i2c devices 2 怎麼和原理圖及外部裝置對應 二 i2c註冊 1 make menuconfig device drivers input device support touchscreens ft5x0x based tou...

stm32(十四)IIC總結

一 iic匯流排知識 sda 雙向資料線,主機可以通過sda線傳送資料給集群,集群也可以通過sda線傳送資料給主機 scl 時鐘訊號線,驅動資料線收發資料的脈衝訊號由scl提供,scl脈衝訊號永遠由主機發出 在匯流排上sda和scl都有上拉電阻,因為iic匯流排介面的晶元sda,scl輸出都是開漏輸...