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...