一、概述
iic 即inter-integrated circuit(積體電路匯流排),這種匯流排型別是由
飛利浦半導體公司在八十年代初設計出來的一種簡單、雙向、二線制、同步序列匯流排,主要是用來連線整體電路(
ics) ,iic是一種多向
控制匯流排
,也就是說多個晶元可以連線到同一
匯流排結構
下,同時每個晶元都可以作為實時資料傳輸的控制源。
iic是 由資料線sda和時鐘scl構成的序列匯流排,可傳送和接收資料。在cpu與被控ic之間、ic與ic之間進行雙向傳送,高速iic匯流排一般可達400kbps以上。
二、基本原理
(iic匯流排的時序圖)
iic匯流排在傳輸資料的過程中共有三種型別的訊號,分別為:開始訊號、結束訊號和應答訊號。
由時序圖可知:
1、開始訊號:在scl為高電平時,sda由高電平向低電平跳變,開始傳輸資料。
2、結束訊號:在scl為高電平時,sda由低電平向高電平跳變,結束傳輸資料。
3、應答訊號:接收資料的ic在接收到8bit資料後,向傳送資料的ic發出特定的低電平脈衝,表示已收到資料。cpu向受控單元發出乙個訊號後,等待受控單元發出乙個應答訊號,cpu接收到應答訊號後,根據實際情況作出是否繼續傳遞訊號的判斷。若未接收到訊號,由判斷為受控單元出現故障。
這些訊號中,起始訊號是必需的,結束訊號和應答訊號都可以不要。
注意:當scl為高電平的時候,sda為出現下降沿為start位,當生成了為低電平的時候,sda出現上公升沿為stop位,所以在scl為高電平的時候sda應該保持穩定不能隨意亂動(傳輸資料時)。
寫入資料狀態:
scl為高電平的時候sda的資料被寫入從機,
scl為低電平的時候sda的資料被寫入主機
讀取資料狀態:
scl為低電平的時候器件的資料被讀出到sda匯流排上,在scl高電平器件保持資料穩定
scl為高電平的時候主機將sda匯流排上的資料讀出被儲存,在scl低電平時間保持穩定
應答訊號ack:
傳送器每傳送乙個位元組,就在時鐘脈衝9期間釋放資料線,由接收器反饋乙個應答訊號。應答訊號為低電平時,規定為有效應答位(ack),表示接收器已成功地接收了該位元組,應答訊號為高電平時,規定為非應答(nack),表示接收未成功
三、stm32上的iic
在正點原子的教程中說,stm32的硬體iic設計比較複雜,而且穩定性不佳(貌似是st為了規避飛利浦iic的版權問題),所以建議使用軟體模擬iic的方式。
用軟體模擬iic也有不少的優點,最大的好處當然是方便移植,同乙個**相容各種的mcu,無論是51,32還是430還是別的微控制器,在移植的時候只要將引腳的設定一更改即可,但如果使用硬體iic,那基本就是推倒重建了。。。。其次,用硬體模擬iic更能夠理解iic的時序以及流程,更加有利於學習。
當然硬體iic也不是一無是處的,若使用硬體iic,**的可靠性會提高,同時,對於實時性要求較高的模組還是使用硬體iic更好,使用硬體iic就可以使用中斷以及dma,可以使資料的傳輸速率大大提高。
但是。。。本人現在還沒有研究硬體iic的用法,以後使用後會再寫一篇部落格。
四、iic的**實現
我借助正點原子的**來分析一下軟體iic的實現
標頭檔案:
#ifndef __myiic_h
#define __myiic_h
#include "sys.h"
//io方向設定
#define sda_in() //pb9輸入模式
#define sda_out() //pb9輸出模式
//io操作函式
#define iic_scl pbout(8) //scl
#define iic_sda pbout(9) //sda
#define read_sda pbin(9) //輸入sda
//iic所有操作函式
void iic_init(void); //初始化iic的io口
void iic_start(void); //傳送iic開始訊號
void iic_stop(void); //傳送iic停止訊號
void iic_send_byte(u8 txd); //iic傳送乙個位元組
u8 iic_read_byte(unsigned char ack);//iic讀取乙個位元組
u8 iic_wait_ack(void); //iic等待ack訊號
void iic_ack(void); //iic傳送ack訊號
void iic_nack(void); //iic不傳送ack訊號
#endif
sda_in()與sda_out() 是用來設定iic的傳輸方向 cpu接收資料與輸出資料
.c檔案
void iic_init(void)
//產生iic起始訊號
void iic_start(void)
//產生iic停止訊號
void iic_stop(void)
//等待應答訊號到來
//返回值:1,接收應答失敗
// 0,接收應答成功
u8 iic_wait_ack(void)
} iic_scl=0;//時鐘輸出0
return 0;
} //產生ack應答
void iic_ack(void)
//不產生ack應答
void iic_nack(void)
//iic傳送乙個位元組
//返回從機有無應答
//1,有應答
//0,無應答
void iic_send_byte(u8 txd)
}
//讀1個位元組,ack=1時,傳送ack,ack=0,傳送nack
u8 iic_read_byte(unsigned char ack)
if (!ack)
iic_nack();//傳送nack
else
iic_ack(); //傳送ack
return receive;
}
注意:當sda和scl同時為高電平時,iic匯流排為空閒狀態。
初始化:使能io口時鐘,設定sda和scl為推挽輸出,拉高sda和scl。
產生起始訊號:設定sda為輸出,拉高sda和scl,延時4us,拉低sda,延時4us,拉低scl鉗住iic匯流排,準備傳送或接收資料。
產生停止訊號:設定sda為輸出,拉低sda和scl,延時4us,依次拉高scl和sda,傳送結束訊號。
產生應答訊號:拉低scl,設定sda為輸出,拉低sda,延時2us,拉高scl,延時2us後拉低
不產生應答引號:與產生應答訊號基本相同,區別在於將sda拉高。
傳送乙個位元組:設定sda為輸出,然後從左往右將8bit的資料一位一位的傳送,傳送時要先將scl拉高延時2us後拉低
讀乙個位元組:設定sda為輸入,定義乙個unsigned char型別的變數來存放接收到的資料,拉低時鐘線,延時2us後拉高,讀sda上的資料,按這個步驟依次讀出8個位上的資料,資料讀取完畢後可以選擇是否傳送應答
等待應答的到來:設定sda為輸入,依次拉高sda和scl,等待sda上低電平的到來(應答訊號),可以設定等待時間,超過等待時間可以停止iic匯流排,最後拉低scl。
STM32通訊介面(三)硬體SPI
spi是序列外設介面 serial peripheral inte ce 的縮寫。spi,是一種高速的,全雙工,同步的通訊匯流排,是motorola最先在其的mc68hcxx晶元上使用,並且在晶元的管腳上只占用四根線,節約了晶元的管腳,同時為pcb的布局上節省空間,提供方便,正是出於這種簡單易用的特...
stm32軟體模擬iic
iic inter integrated circuit 匯流排是一種由philips公司在80年代開發的兩線式序列匯流排,用於連線微控制器及其外圍裝置。它是半雙工通訊方式。iic匯流排最主要的優點是其簡單性和有效性。由於介面直接在元件之上,因此iic匯流排占用的空間非常小,減少了電路板的空間和晶元...
樹莓派與STM32通訊
硬體 使用ch340的usb轉ttl 一般接有 根線 電源 gnd tx rx 操作 開啟樹莓派的終端 輸入 lsusb 會顯示出相應的usb裝置 找到hl 340 usb serial 輸入 pip list 檢視是否安裝pyserial 在測試之前要檢視usb的裝置號 在終端輸入 ls l de...