IIC 通訊例項

2021-06-29 11:14:08 字數 3237 閱讀 6351

iic

標籤:1、標準速率:100kbit/s、快速:400kbit/s、高速:4mbit/s

2、2線通訊協議

3、起始與停止:scl高時,sda由  高  -->  低(↓)  變化,起始訊號;sda由  低  -->  高(↑)  變化,停止訊號

4、空閒狀態:sda和scl都處於高電平狀態

5、資料傳輸與應答:資料必須是8位,且高位在前(msb),第9個脈衝週期由接收方傳送應答訊號(傳送方同時等待這個應答訊號),即接收方將sda拉低(之前sda為高)。(有時會將應答超時視作已接受到正確資料,有的地方則必須等待到應答訊號,下面的例中就是後者)。

6、位址格式:7-4bit為器件型別,

半導體公司生產時就已經固定了

。3-1bit為器件位址位,一般使用者自定義,例如eeprom外部的3個引腳(a0,a1,a2)硬體電路的接法決定了其數值,所以一路iic匯流排上同一型號的ic最多能接8個。最後一位就是r/w標記位了,0為寫命令,1為讀命令。

7、iic匯流排進行資料傳輸時,scl為高電平時sda必須保持穩定才有效,只有scl為低電平時才允許sda有變化。

8、philips(飛利浦)開發

9、雙向序列匯流排協議

c語言實現過程(基於攝像頭nt99141控制協議的iic通訊例項)

#include

#define uint unsigned int

#define uchar unsigned char

#define delay( n)

//以下為偽定義,實際以晶元io口配置為主

#define set_sda_out( )

#define sda_out( )

#definesda_h( )

#defiensda_l( )

#define set_sda_in( )

#defien sda_in( )

#defien scl_h( )

#define scl_l( )

#definedelay( )

typedef u8 unsigned char;

void start(void)

sda_h( );

delay()

scl_h;

delay( );//scl為高sda變低 ↓,起始訊號

sda_l( );

delay( );

sda_l( );

delay( );

void stop(void)

scl_l( );

delay( );

sda_l( );

delay( );

scl_h( );

delay( );//scl為高sda變高↑,停止訊號

sda_h( );

delay( );

u8 waitack(void)

u8 tmp = 200;

sda_h( );delay( );//拉高,等待應答被拉低

set_sda_in( );delay( );

scl_h( );delay( );

while(sda_in( ))

}scl_l( );

return 1;

void ack(void)

scl_l( );

delay( );

sda_l( );//應答,拉低

delay( );

scl_h( );

delay( );

scl_l( );

delay( );

void noack(void)

scl_l( );

delay( );

sda_h( );

delay( );

scl_h( );

delay( );

scl_l( );

delay( );

u8 writebyte(u8 data)

u8 i,ret = 0;

scl_l( );

delay( );

for(i = 0 ; i < 8 ; i++)

else

data <<= 1;

delay( );

scl_h( );

delay( );

scl_l( );

delay( );

}delay( );

ret = waitack( );//傳送完乙個位元組後等待對方傳送應答訊號

set_sda_out( );

return (ret);//返回應答狀態,為0證明應答失敗,為1應答正常

u8 readbyte(void)

u8 i,data = 0;

set_sda_in;//需要設定sda為輸入以及是否上拉

delay( );

for(i = 0; i < 8 ; i++)

}return data;

u8 writeaddr(addr_t addr,u8 data)

u8 tmp = 0;

start( );

if(0 == writebyte(wcmd))goto _return;//傳送寫命令,本例中必須等到應答訊號,否則認為叢機接收失敗

//delay(10);//選擇性延時

if(0 == writebyte(addr))goto _return;//傳送寫位址

//delay(10);//選擇性延時

if(0 == writebyte(data))goto _return;//傳送資料

tmp = 1;

_return:

stop( );

return tmp;

u8 readaddr(u8 addr,u8 *data)

u8 tmp = 0;

start( );

if(0 == writebyte(wcmd))goto _return;//傳送寫命令

//delay(10);//選擇性延時

if(0 == writebyte(addr))goto _return;//傳送讀位址

stop( );

//delay(10);//選擇性延時

start( );

if(0 == writebyte(rcmd))goto _return;//傳送讀命令

//delay(10);//選擇性延時

*data = readbyte( );   //讀資料

_return:

stop( );

return tmp;

程序通訊例項

有待修改,先放上 供參考。include using namespace std const int maxn 105 typedef int semaphore 訊號量型別 char buf 緩衝區資料結構 typedef struct message buffer message buffer ...

Cobalt Strike DNS通訊例項

如果沒有網域名稱,可以參考另一篇部落格,申請freenom免費網域名稱,並使用dnspod解析 首先我們要有個網域名稱,然後建立一條a記錄指向我們的cobaltstrike伺服器,然後再建立2個或3個ns記錄指向剛才建立的a記錄。舉例 比如我的網域名稱是 abc.com,先建立一條a記錄指向伺服器 ...

通訊例項 modbus Modbus通訊程式設計例項

modbus通訊程式設計例項 一 功能碼 十進位制 十六進製制說明 0101讀線圈 0202讀離散量輸入 0303讀保持暫存器 0404讀輸入暫存器 0505寫單個線圈 0606寫單個暫存器 0707讀異常狀態 0808診斷 110b獲得事件計數器 120c獲得事件記錄 150f寫多個線圈 1610...