導航:首頁 > 操作系統 > 單片機iic通信原理難

單片機iic通信原理難

發布時間:2022-10-02 09:04:47

Ⅰ IIC匯流排的應答信號問題

1、首先IIC通信要分清主機與從機的關系,在主機對從機進行寫操作時,一般是在傳送完一個數據之後單片機就進入檢測應答信號狀態:先將兩個腳置位SDA=1;SCL=1;然後在一定時間內不斷檢測SDA腳的電平狀態,比如說你弄個循環for(i=255;i>0;i--){..;if(...)break;...}進行不斷判斷,當SDA的電平為低時就跳出循環,說明此時從機已經ACK,就可說明是I2C器件拉低;如果為高時,則一直判斷完整個循環,到最後還為高時,就說明沒有應答。
2、寫應答和讀應答肯定有所區別的。寫應答是在你讀從機數據期間,當你接收到一個數據時,可以應答的(想繼續通信就應答),就將SDA復位(拉低),不想應答(想結束通信時)就置位(SDA=1)。讀應答則在主機寫數據給從機期間,每當從機接收到一個數據就會應答一下(將數據SDA線拉低),主機將不斷檢測SDA線的電平,主機就是憑SDA的電平狀態才知道從機是否已經正確地接收了主機發送的數據。

Ⅱ 單片機iic程序不懂給分析下啊

貼個程序給你看看,,,單片機沒有I2C匯流排介面,只能靠軟體模擬
/*程序的I2C從器件地址為1010,片選地址為000*/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SDA=P1^7;
sbit SCL=P1^6;

void Delay(uint us)
{
for(us;us>0;us--);
}

void start_iic() // 啟動I2C匯流排
{
SDA=1; // 發送起始條件數據信號,啟動時,
SCL=1; // 必需使數據線、時鍾信號線處於高電平(空閑態)
Delay(10); // 使用I2C匯流排必需考慮保持時間和建立時間,故延時
SDA=0; //產生下降沿,發送起始信號
Delay(10);
SCL=0;
}

void stop_iic()
{
SDA=0; //為產生上跳沿做准備
SCL=1; //打開時鍾線
Delay(10);
SDA=1; //產生停止信號(上跳沿有效)
Delay(10);
SCL=0; //時鍾線恢復無效態//
}

void ack_iic()
{
SDA=0; // 接受器件發送應答信號
SCL=1;
Delay(10);
SCL=0;
SDA=1; //應答信號低電平有效,故需將其重新置高電平
}

void nack_iic()
{
SDA=1; //主器件發非應答信號,通知AT24C08不再發送數據
SCL=1;
Delay(10);
SCL=0;
SDA=0; //非應答信號高電平有效,故需將其重新置低電平
}

Write_byte(uchar c)
{
uchar i;
for(i=0;i<8;i++)
{
if(c&0x80)SDA=1;
else SDA=0;
SCL=1;
Delay(10);
SCL=0; //因為當時鍾線有效是,數據線必須保持穩定的電平,
c=c<<1; //要改變SDA電平,應先將SCL拉低
}
SDA=1; //釋放I2C匯流排,准備接受應答信號
SCL=1;
Delay(10);
if(SDA==1)F0=0; //沒有接到應答位
else F0=1;
SCL=0;
}

uchar Read_byte()
{
uchar i;
uchar r=0;
SDA=1; //置數據線為輸入方式
for(i=0;i<8;i++)
{
r=r<<1;
SCL=1;
Delay(10); //保證一定的電平保持時間
if(SDA==1)r++; //從高位開始,一位一位的讀
SCL=0;
}
return r;
}

main()
{
uchar slave=0xa0; //I2C匯流排從器件地址(注意:硬體電路的接法要是片選地址為0,否則不能工作)
uchar Rslave=slave+1; //主器件發送讀控制字位元組
uchar addre=0x20; // 指定的寫數據地址
uchar wbuf=0x23; //將要寫進addre的數據
uchar rbuf; //存放讀出的數據的臨時變數
start_iic(); //產生起始信號
Write_byte(slave); //發送從器件地址
if(F0==0)return 0; //檢查應答位
Write_byte(addre); //發送目的地址
if(F0==0)return 0;
Write_byte(wbuf); //發送8為數據
if(F0==0)return 0;
stop_iic(); //停止信號

/*8位的數據發送完畢*/

Delay(1000);
start_iic();
Write_byte(slave);
if(F0==0)return 0;
Write_byte(addre);
if(F0==0)return 0;

start_iic(); //再次產生起始信號,不能少
Write_byte(Rslave); //送讀控制字
if(F0==0)return 0;
rbuf=Read_byte(); //讀出指定單元的內容
nack_iic(); //非應答信號
stop_iic();

/*8位的數據讀取完畢*/

TMOD=0x20; //串口調試
TL1=0xfd;
TH1=0xfd;
SCON=0x40;
PCON=0x00;
TR1=1;
while(1)
{
SBUF=rbuf; //放入緩沖
while(TI==0);
TI=0;
Delay(10000);
}

}

Ⅲ 如何實現雙單片機模擬iic通信

對於疑問1:for循環已經把數據從主器件發送到從器件,沒錯,後面加那幾句是為了釋放數據匯流排,這是晶元協議已經規定了的,為什麼是scl=0;而sda=1呢,應該匯流排SCL與SDA都是線與關系,任意一個器件輸出低電平,都使該匯流排的信號變低,你可能會這么想:為什麼不是scl=1;delay();sda=1;delay();呢?那是因為當scl=1;sda=1;這是終止信號。對吧,這樣寫的話IIC將會停止工作。
對於疑問2:加這幾句也一樣,是晶元現已規定:無論是寫數據還是讀數據,寫完讀完之後需釋放匯流排,for循環語句的意思是:
for(i=0;i<8;i++)
{
scl=1; //拉高時鍾匯流排,開始讀數據
delay();
k=(k<<1)|sda; // 將讀取到的sda數據存放到k中,這里你可能有點無法理解,我舉個例子:剛開始k=0x00(系統默認),當讀取到的sda數據為1時,k=0x01;對吧,反之當讀取到的sda數據為0時,k=0x00;
scl=0;// 讀取完一個數據,拉低時鍾匯流排
delay();
}
就這樣循環8次,這樣一個位元組的數據就從主器件讀到了從器件了。對吧。
如果那個釋放匯流排你理解不了,你就記住,這是晶元協議規定,讀完或寫完都必須釋放匯流排。iic協議都是如此。
希望能幫助到你。

Ⅳ 單片機虛擬I2C匯流排誰搞過難度有多大花了多長時間能不能交流一下體驗或者困難最終如何理解的

學單片機的幾乎都學24C02的讀寫,仔細研究一下I2C的通信協議,再研究教材上提供的程序,你會發現它並不難
會產生時鍾脈沖,再會讀寫一位數據,最後會讀寫一個位元組,只不過無論是讀數據還是寫數據,都要先寫一個地址,另外讀和寫都要發送器件地址,並且這個地址的最後一位是不一樣的

Ⅳ 單片機iic是做什麼的

與使用IIC協議的晶元連接通信。單片機的IIC一般是指的單片機能夠通過編程實現硬體IIC。你說的是STM32單片機吧?
硬體IIC比模擬IIC速度更快,但是介面固定,並不是一個好選擇。用來學習還是不錯。

Ⅵ 用手觸碰IIC匯流排的時鍾線後,IIC匯流排才能正常通信!各位看官,這是什麼

IIC串列匯流排一般有兩根信號線,一根是雙向的數據線SDA,另一根是時鍾線SCL。所有接到I2C匯流排設備上的串列數據SDA都接到匯流排的SDA上,各設備的時鍾線SCL接到匯流排的SCL上,一般SDA、SCL都會接上拉電阻實現電平的轉換以及提高驅動能力。
IIC匯流排協議包括:起始信號、停止信號、數據位、應答位;一般一次通信為9個clk:8個數據位+一個應答位。

Ⅶ 有沒有大神會兩個stm32單片機之間的IIC通信

stm32的iic好像不好用,可以根據時序,通過IO模擬iic,注意時鍾拉高或者拉低時需要加延時。其他通信方式你可以參考串口、CAN、SPI、FSMC等。

Ⅷ iic匯流排實現雙機通信,求接線圖和原理

IIC匯流排在沒有總裁模式的前提下,只能實現主從通信。也就是主機可以隨時向從機發送數據,但只能等主機訪問才能從機才能應答。這個是標准IIC協議。不知道符不符合你對雙機通信的要求。電路圖很簡單,只用連上2條上,上拉個電阻就可以啦。IIC通信的原理參考飛利浦的標准,兩線特定的狀態實現數據傳輸開始,應答,結束等等,多看看時序圖就了解啦。

但是大多數的51單片機不帶硬體IIC模塊,我們可以用軟體來模擬。我只寫過主機的模擬IIC程序,從機的沒寫過。從機程序51實現難度很大,也不實用。機制問題,從機響應如不能用中斷實現,只能一直讓程序在查詢,實現起來沒什麼意義。如果你的51帶管腳電平變化中斷,可以去嘗試下。

Ⅸ 51單片機的iic通信問題,求助啊

IIC匯流排的時序,好像是:最高頻率在400KHz。
單片機指令的執行時間,速度快,所以要加延時。
停止函數,是在SCL=1期間,SDA出現上升,那麼SDA先要為0,這個0,要在SCL=0實現。

Ⅹ 求教:兩個51單片機之間的IIC通訊

IIC通訊只能是TTL連接通信,要求兩個單片機是近距離的,應在1米以內。既然是TTL連接,為何不用串口呢,也是TTL連接,串口通信簡單多了。
而IIC通信,兩個單片機都是用引腳來模擬的,通信協議比較麻煩,寫程序很麻煩的,又何苦呢?

閱讀全文

與單片機iic通信原理難相關的資料

熱點內容
滴滴金融app被下架如何還款 瀏覽:208
jpg轉換成pdf免費軟體 瀏覽:741
范里安pdf 瀏覽:443
偽造pdf 瀏覽:75
能刪除android文件夾嗎 瀏覽:446
LINUX使用V2ray 瀏覽:797
找人幫忙注冊app推廣是什麼 瀏覽:820
獨立伺服器如何恢復初始化 瀏覽:11
優秀到不能被忽視pdf 瀏覽:316
導遊程序員家政 瀏覽:586
22乘28的快速演算法 瀏覽:338
軟通動力程序員節2021 瀏覽:845
安卓系統如何卸載安裝包 瀏覽:870
簡訊刪除助手文件夾 瀏覽:688
java辦公自動化 瀏覽:342
php中超鏈接 瀏覽:254
linux默認路由設置 瀏覽:36
linux如何掛載iso 瀏覽:432
vs程序換文件夾後不能編譯 瀏覽:558
安卓源碼編譯輸入腳本沒反應 瀏覽:47