STM32通訊介面(二)IIC 軟體模擬

2021-08-19 14:24:40 字數 3827 閱讀 7519

一、概述    

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