i方c協議
A. 誰給我I2C通信協議,要詳細的。
一. 技術性能: 工作速率有100K和400K兩種; 支持多機通訊; 支持多主控模塊,但同一時刻只允許有一個主控; 由數據線SDA和時鍾SCL構成的串列匯流排; 每個電路和模塊都有唯一的地址; 每個器件可以使用獨立電源 二. 基本工作原理: 以啟動信號START來掌管匯流排,以停止信號STOP來釋放匯流排; 每次通訊以START開始,以STOP結束; 啟動信號START後緊接著發送一個地址位元組,其中7位為被控器件的地址碼,一位為讀/寫控制位R/W,R. /W位為0表示由主控向被控器件寫數據,R/W為1表示由主控向被控器件讀數據; 當被控器件檢測到收到的地址與自己的地址相同時,在第9個時鍾期間反饋應答信號; 每個數據位元組在傳送時都是高位(MSB)在前; 寫通訊過程: 1. 主控在檢測到匯流排空閑的狀況下,首先發送一個START信號掌管匯流排; 2. 發送一個地址位元組(包括7位地址碼和一位R/W); 3. 當被控器件檢測到主控發送的地址與自己的地址相同時發送一個應答信號(ACK); 4. 主控收到ACK後開始發送第一個數據位元組; 5. 被控器收到數據位元組後發送一個ACK表示繼續傳送數據,發送NACK表示傳送數據結束; 6. 主控發送完全部數據後,發送一個停止位STOP,結束整個通訊並且釋放匯流排; 讀通訊過程: 1. 主控在檢測到匯流排空閑的狀況下,首先發送一個START信號掌管匯流排; 2. 發送一個地址位元組(包括7位地址碼和一位R/W); 3. 當被控器件檢測到主控發送的地址與自己的地址相同時發送一個應答信號(ACK); 4. 主控收到ACK後釋放數據匯流排,開始接收第一個數據位元組; 5. 主控收到數據後發送ACK表示繼續傳送數據,發送NACK表示傳送數據結束; 6. 主控發送完全部數據後,發送一個停止位STOP,結束整個通訊並且釋放匯流排; 四. 匯流排信號時序分析 1. 匯流排空閑狀態 SDA和SCL兩條信號線都處於高電平,即匯流排上所有的器件都釋放匯流排,兩條信號線各自的上拉電阻把電平拉高; 2. 啟動信號START 時鍾信號SCL保持高電平,數據信號SDA的電平被拉低(即負跳變)。啟動信號必須是跳變信號,而且在建立該信號前必修保證匯流排處於空閑狀態; 3. 停止信號STOP 時鍾信號SCL保持高電平,數據線被釋放,使得SDA返回高電平(即正跳變),停止信號也必須是跳變信號。 4. 數據傳送 SCL線呈現高電平期間,SDA線上的電平必須保持穩定,低電平表示0(此時的線電壓為地電壓),高電平表示1(此時的電壓由元器件的VDD決定)。只有在SCL線為低電平期間,SDA上的電平允許變化。 5. 應答信號ACK I2C匯流排的數據都是以位元組(8位)的方式傳送的,發送器件每發送一個位元組之後,在時鍾的第9個脈沖期間釋放數據匯流排,由接收器發送一個ACK(把數據匯流排的電平拉低)來表示數據成功接收。 6. 無應答信號NACK 在時鍾的第9個脈沖期間發送器釋放數據匯流排,接收器不拉低數據匯流排表示一個NACK,NACK有兩種用途: a. 一般表示接收器未成功接收數據位元組; b. 當接收器是主控器時,它收到最後一個位元組後,應發送一個NACK信號,以通知被控發送器結束數據發送,並釋放匯流排,以便主控接收器發送一個停止信號STOP。 五. 定址約定 地址的分配方法有兩種: 1. 含CPU的智能器件,地址由軟體初始化時定義,但不能與其它的器件有沖突; 2. 不含CPU的非智能器件,由廠家在器件內部固化,不可改變。 高7位為地址碼,其分為兩部分: 1. 高4位屬於固定地址不可改變,由廠家固化的統一地址; 2. 低三位為引腳設定地址,可以由外部引腳來設定(並非所有器件都可以設定);
B. I2C協議怎麼寫
void delay_scl()
{
unsigned data i=10;
do
{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
while(--i);
}
void delay(unsigned char data k)//精確延時*0.1us
{
unsigned char data i=250;
do{do{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}//執行一個nop為1個時鍾周期
while(--i);}
while(--k);//執行一個while為2個時鍾周期
}
void i2c_init() //I2C的初始化:SDA和SCL都為高電平
{
sda=1;
delay_scl();
scl=1;
delay_scl();
}
void i2c_start() //開始信號
{
i2c_init();
sda=0;
delay_scl();
}
void i2c_stop() //停止信號
{
sda=0;
delay_scl();
scl=1;
delay_scl();
sda=1;
delay_scl();
}
void i2c_response() //應答信號
{
unsigned char xdata i;
scl=1;
delay_scl();
while((sda==1)&&(i<250))i++;
scl=0;
delay_scl();
}
void i2cwrite_byte(unsigned char data dat) //寫1個位元組
{unsigned char xdata i,temp;
temp=dat;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay_scl();
sda=CY;
delay_scl();
scl=1;
delay_scl();
}
scl=0;
delay_scl();
sda=1;
delay_scl();
}
unsigned char i2cread_byte() //讀1個位元組
{
unsigned char xdata i,k;
scl=0;
delay_scl();
sda=1;
delay_scl();
for(i=0;i<8;i++)
{
scl=1;
delay_scl();
k=(k<<1)|sda;
scl=0;
delay_scl();
}
return k;
}
void i2cwrite_add(unsigned char data address,unsigned char data dat) //寫數據,1個位元組地址位,1個位元組數據
{
i2c_start();
i2cwrite_byte(0xEE); // 16進制Oxa0轉成8bit二進制數:前7位是設備號,末位"0"表示向設備寫入。
i2c_response();
i2cwrite_byte(address); //寫地址
i2c_response();
i2cwrite_byte(dat); //寫數據
i2c_response();
i2c_stop();
delay(100); //收到stop命令後,需twr時間來寫數據,此期間不接收任何信息
}
unsigned char I2Cread_add(unsigned char data address) //讀數據,1個位元組地址位,函數返回數據值
{
unsigned char xdata dat;
i2c_start();
i2cwrite_byte(0xEE); //16進制Oxa0轉成8bit二進制數:前7位是設備號,末位"0"表示向設備寫入。
i2c_response();
i2cwrite_byte(address); //向設備寫入需要查找的地址(移動設備內指針)
i2c_response();
i2c_start(); //刷新,再次查找設備
i2cwrite_byte(0xEF); // 16進制Oxa0轉成8bit二進制數:前7位是設備號,末位"1"表示從設備讀取。
i2c_response();
dat=i2cread_byte(); //讀取數據
i2c_stop(); //讀完後主機返回"非應答"(高電平),並直接發出終止信號
delay(10);
return dat;
}
C. 為什麼會出現串口通信,I2C通信,SPI通信,UART通信等等這么多的通信協議,
UART用在與主機(比如計算機)介面外設相連。
I2C是由飛利浦公司提出的,用內於與晶元與晶元之間的通容信。
spi是摩托羅拉最先提出的,用於晶元與晶元間的通信,與i2c不同的是傳輸需要四根線,i2c傳輸需要兩根線,所以速率比i2c快。
最早是沒有統一的串列介面標準的,各個公司在自己的領域分別提出來,最終成為了通用的標准。
D. I2C數據協議
沒有去查I2C的協議,但是讀寫位是LSB(低位)方向的,而讀寫位後發,所以可回以推測應該答是MSB(高位)先發的。
上面兩段程序如果只從SDA的賦值情況的話(其他邏輯我沒有細看),兩段程序有可能都可以:
1. 先把最高位移到CY裡面,再賦值,應該很好理解
2. 先由temp&0x80判斷的temp的最高位,並把結果賦給SDA:這種賦值法要看編譯器支持,因為SDA是一位,temp&0x80的結果是一個byte,也有寫成SDA=(temp&0x80 != 0)就是把表達式的結果true or false當成1,0賦值給SDA, 實際上翻譯過來就是
if(temp&0x80 != 0)
{
SDA=1;
}
else
{
SDA=0;
}
這些都要看編譯器支持,然後才移位。怎麼知道你的編譯器是否支持這種寫法呢?很簡單,你要查看編譯器生成的匯編文件,看看匯編代碼是否正確。
不過強烈建議不要用這種寫法,盡量讓你的代碼比較通用。
E. 51單片機串口通信,和I2C串口通信協議有什麼區別和相同
I2C匯流排是內部匯流排,用來連接內部系統內的晶元。比如mcu和存儲器、鍵盤現專實晶元、ad轉換等等。
串口通屬信是用來和系統外部的設別通信的。比如設備和設備之間通信。
I2C和串口在通信協議上可以做到一樣,也可做到不一樣,這取決與具體的情況。
mcu和2402通信,mcu和電腦通信它們之間的協議軟體可以做到完全一樣
比如mcu發送1 2402和電腦發送2。
F. 同步串口協議SSI(包括SPI)和I2C的區別
區別:SPI:高速同步串列口。
3~4線介面,收發獨立、可同步進行 UART:通用非同步串列口。
按照標准波特率完成雙向通訊,速度慢 SPI:一種串列傳輸方式,三線制,網上可找到其通信協議和用法的 3根線實現數據雙向傳輸 串列外圍介面 Serial peripheral interface UART:通用非同步收發器 UART是用於控制計算機與串列設備的晶元。
有一點要注意的是,它提供了RS-232C數據終 端設備介面,這樣計算機就可以和數據機或其它使用RS-232C介面的串列設備通信了 。
作為介面的一部分,UART還提供以下功能: 將由計算機內部傳送過來的並行數據轉換為輸出的串列數據流。
將計算機外部來的串列 數據轉換為位元組,供計算機內部使用並行數據的器件使用。
在輸出的串列數據流中加入 奇偶校驗位,並對從外部接收的數據流進行奇偶校驗。
在輸出數據流中加入啟停標記, 並從接收數據流中刪除啟停標記。
處理由鍵盤或滑鼠發出的中斷信號(鍵盤和鼠票也是 串列設備)。
可以處理計算機與外部串列設備的同步管理問題。
有一些比較高檔的UART 還提供輸入輸出數據的緩沖區,現在比較新的UART是16550,它可以在計算機需要處理數 據前在其緩沖區內存儲16位元組數據,而通常的UART是8250。
現在如果購買一個內置的 數據機,此數據機內部通常就會有16550 UART。
I2C:能用於替代標準的並行匯流排,能連接的各種集成電路和功能模塊。
I2C是多主控匯流排,所以任何一個設備都能像主控器一樣工作,並控制匯流排。
匯流排上每一個設備都有一個獨一無二的地址,根據設備它們自己的能力,它們可以作為發射器或接收器工作。
多路微控制器能在同一個I2C匯流排上共存。
G. I2C協議從機怎麼發送ACK信號啊,就是把SDA拉低,要怎麼編程實現啊
以復AT89c52單片機為例,主機發送指令過程中制,當需要判斷SDA是否被拉低時,先值高SDA,然後反復讀取SDA電平,當SDA=0時就判斷SDA被拉低了,在一定時間內沒有讀取到SDA=0就判斷出錯。
匯編舉例:
aACK: MOV R7,#0 ;
LOOP: CLR C ;
MOV C, IO_SDA ;
NOP;
JNC IO_SDA , LOOP_OK ;有確認信號轉
DJNZ R7, LOOP ;
LOOP_ERR: //一定時間內沒有檢測到ACK信號。
......
LOOP_OK: //一定時間內檢測到ACK信號。
......
H. I2C串列匯流排協議是什麼
I2C匯流排是PHLIPS公司推出的一種串列匯流排,是具備多主機系統所需的包括匯流排裁決和高低速器件同步功能的高性能串列匯流排。I2C匯流排只有兩根雙向信號線。一根是數據線SDA,另一根是時鍾線SCL。
更加詳細的可以去【周立功】了解更多的。
I. i2c協議的問題,請問主機如果讀從機的數據,怎麼知道從機(假如是感測器晶元)正好想發送數據呢
作為從機,只能接收主機的指令,不能主動發送數據。所以必須明白專,所有的通信都是屬由主機發起的,主機要讀取從機的數據,首先向從機發送讀數據指令,從機接收到之後,發出應答信號,就會想主機發送要求的數據。當然,如果從機是遵循I2C的感測器晶元,肯定有對應的指令格式,你得先看看數據手冊。
J. SCCB傳輸協議 ,I2C協議,I2S 這3種協議的差異
SCCB可以當做I2C,只不過不能連發。I2S是音頻的,和這兩個沒關系。
回SCCB是簡化的I2C協議,SCCB的匯流排答時序與I2C基本相同,它的響應信號ACK被稱為一個傳輸單元的第9位,分為Don』t care和NA。SCCB沒有重復起始的概念,因此在SCCB的讀周期中,當主機發送完片內寄存器地址後,必須發送匯流排停止條件。不然在發送讀命令時,從機將不能產生Don』t care響應信號。
I2S是飛利浦公司為數字音頻設備之間的音頻數據傳輸而制定的一種匯流排標准。I2S協議規定在高電平的時候傳輸左通道信息,在低電平時候傳輸右通道信息.
I2c能用於替代標準的並行匯流排,能連接的各種集成電路和功能模塊。