備戰藍橋--對iic總線的學習認知
哈嘍 !大家好,YuXi小呆萌前來報到。被新冠病毒折磨在家中你們肯定也像我一樣在家無聊的想yue(吐)吧,相信宅在家中的鐵子們大都像我一樣每天準時在釘釘打卡看直播(當然,肯定還有老鐵剛做釘釘的全職主播
)。做了兩周鐵子的我又想起今年的藍橋杯備戰,漫漫長夜無心睡眠,因此突發奇想想和大家分享一下對iic總線通信的學習,若有不足之處,還請各位道友多多指點
。
在前段時間學習使用DS18B20溫度傳感器中,初次了解到通信協議,后來又在網上查了一下有關通信協議的內容,了解到了iic協議和SPI協議。剛開始看這些協議的時候,文章字數一大堆,看的腦殼疼,果斷的放棄繼續閱讀,這不剛過幾天,不想看也得看了 (腦殼疼)難搞哦!
對于單總線的學習呢,一定要注意時序,遵守有借有還的原則。好了不跑題,跟大家簡單的分享一下對iic總線的學習心得。
IIc :
IIC 是多主設備的總線,只使用兩條信號線—— ‘serial data’ (SDA) 和 ‘serial clock’ (SCL)。
IIC協議規定:
第一,每一支IIC設備都有一個唯一的七位設備地址;
第二,數據幀大小為8位的字節;
第三,數據(幀)中的某些數據位用于控制通信的開始、停止、方向(讀寫)和應答機制。
IIC 數據傳輸速率有標準模式(100 kbps)、快速模式(400 kbps)和高速模式(3.4 Mbps),另外一些變種實現了低速模式(10 kbps)和快速+模式(1 Mbps)。 (此處就簡單的跟大家分享一下,我也沒了解太多)
IIC 通信過程其實也很簡單,首先,主設備發一個START信號,這個信號就像對所有其它設備喊:請大家注意!然后其它設備開始監聽總線以準備接收數據。接著,主設備發送一個7位設備地址加一位的讀寫操作的數據幀。當所設備接收數據后,比對地址自己是否目標設備。如果比對不符,設備進入等待狀態,等待STOP信號的來臨;如果比對相符,設備會發送一個應答信號——ACKNOWLEDGE作回應。(在此緬懷那些我們在教師上課的歲月)我們可以把通信的過程當做老師那萬惡的點名(this is a joke),老師相當于我們這個教室的主設備,而學生就相當于接收設備,當老師叫到某個學生的名字(START信號),當老師叫到某個學生名字時,該同學會回答“到”表示自己已經接受到信號并給老師反饋,而那些沒有被叫到名字的同學則會繼續等待老師點自己名字,直到被老師點到名字,作出回應。(我們班上課可沒有別的同學代答“到”O)
當主設備收到應答后便開始傳送或接收數據。數據幀大小為8位,尾隨一位的應答信號。主設備發送數據,從設備應答;相反主設備接數據,主設備應答。當數據傳送完畢,主設備發送一個STOP信號,向其它設備宣告釋放總線,其它設備回到初始狀態。
基于IIC總線的物理結構,總線上的START和STOP信號必定是唯一的。另外,IIC總線標準規定SDA線的數據轉換必須在SCL線的低電平期,在SCL線的高電平期,SDA線的上數據是穩定的。
就和大家分享那么多,相信這些足夠大家備戰藍橋杯了,下面總結一下代碼,有不足之處還請路過的大神多多指點。
void init()//總線初始化 { sda=1; delay(); scl=1; delay(); } /*===========================================================================================================*/ void start () //開始信號 { sda = 1; delay(); scl = 1; delay(); sda = 0; delay(); } /*===========================================================================================================*/ void stop() //停止 { sda=0; delay(); scl=1; delay(); sda=1; delay(); } /*===========================================================================================================*/ void respons() //應答 { uchar i; scl=1; delay(); //至多等待250個CPU時鐘周期 while((sda==1)&&(i<250))i++; scl=0; delay(); } /*===========================================================================================================*/ void write_byte(uchar date) //寫一個字節 { uchar i,temp; temp=date; for(i=0;i<8;i++) { temp=temp<<1; scl=0;//拉低SCL,因為只有在時鐘信號為低電平期間按數據線上的高低電平狀態才允許變化;并在此時和上一個循環的scl=1一起形成一個上升沿 delay(); sda=CY; delay(); scl=1;//拉高SCL,此時SDA上的數據穩定 delay(); } scl=0;//拉低SCL,為下次數據傳輸做好準備 delay(); sda=1;//釋放SDA總線,接下來由從設備控制,比如從設備接收完數據后,在SCL為高時,拉低SDA作為應答信號 delay(); } /*===========================================================================================================*/ uchar read_byte()//讀一個字節 { uchar i,dat; scl=0; delay(); sda=1; delay(); for(i=0;i<8;i++) { scl=1; delay(); dat=(dat<<1)|sda; scl=0;//拉低SCL,使發送端可以把數據放在SDA上 delay(); } return dat; } /*===========================================================================================================*/ void write_add(uchar address,uchar date)//任意地址寫一個字節 { start();//啟動 write_byte(0xa0);//發送從設備地址 respons();//等待從設備的響應 write_byte(address);//發出芯片內地址 respons();//等待從設備的響應 write_byte(date);//發送數據 respons();//等待從設備的響應 stop();//停止 } /*===========================================================================================================*/
(這還沒高數難)
我的水平有限,很多重點的只是都沒給大家分享出來,有興趣的同學可以自己在網上查閱資料,希望大家都能養成自己去探索未知的習慣。 最后希望大家在這個疫情待家的時間里,合理安排自己的時間,找到自己的目標,加油?。?!
*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。
隔離器相關文章:隔離器原理