新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī) arm 常用的接口總結(jié)

單片機(jī) arm 常用的接口總結(jié)

作者: 時(shí)間:2016-11-26 來源:網(wǎng)絡(luò) 收藏
常用的接口有spi,I2c,uart等,他們都有自己的協(xié)議規(guī)定,下面談?wù)勊鼈冎g的聯(lián)系與區(qū)別:

1 I2C總線

本文引用地址:http://m.butianyuan.cn/article/201611/321770.htm

涉及到I2C的編程主要涉及到兩種情況:有專用控制器的arm芯片,無控制器的單片機(jī)芯片。有控制器的arm芯片,主要就是依據(jù)數(shù)據(jù)手冊,通過設(shè)置相應(yīng)的寄存器(控制寄存器,狀態(tài)寄存器等)來實(shí)現(xiàn)相應(yīng)的操作;然而對于沒有控制器的單片機(jī)芯片,只有通過相應(yīng)的引腳根據(jù)I2c協(xié)議來予以模擬實(shí)現(xiàn)。

首先來談?wù)処2c協(xié)議。涉及到的信號主要分為三類:開始信號,停止信號,發(fā)送數(shù)據(jù)。既然是協(xié)議,就是雙方事先約定好的規(guī)定,通信雙方按照這個(gè)標(biāo)準(zhǔn)來進(jìn)行數(shù)據(jù)的傳輸就可以了。保證數(shù)據(jù)傳輸?shù)囊恢滦缘脑?,還有在某些時(shí)候發(fā)送一些附帶的檢查信息,例如ack信號,非ack信號;

開始信號:SCL為高電平時(shí),SDA由高電平向低電平跳變,開始傳送數(shù)據(jù)。
結(jié)束信號:SCL為高電平時(shí),SDA由低電平向高電平跳變,結(jié)束傳送數(shù)據(jù)。
應(yīng)答信號:接收數(shù)據(jù)的IC在接收到8bit數(shù)據(jù)后,向發(fā)送數(shù)據(jù)的IC發(fā)出特定的低電平脈沖,表示已收到數(shù)據(jù)。CPU向受控單元發(fā)出一個(gè)信號后,等待受控單元發(fā)出一個(gè)應(yīng)答信號,CPU接收到應(yīng)答信號后,根據(jù)實(shí)際情況作出是否繼續(xù)傳遞信號的判斷。若未收到應(yīng)答信號,由判斷為受控單元出現(xiàn)故障。

基于單片機(jī)的模擬I2C的信號,應(yīng)該嚴(yán)格按照以上的時(shí)序進(jìn)行研究實(shí)現(xiàn)。

接下來看看帶有I2C的控制器的arms3c2410,s3c2440芯片的i2c的控制。主要包括四個(gè)相關(guān)的寄存器的設(shè)置:通過它們之間的相互配合,實(shí)現(xiàn)i2c的數(shù)據(jù)傳輸。

IICON:控制寄存器。主要是用于控制是否發(fā)出ACK信號,設(shè)置發(fā)送器的時(shí)鐘,開啟I2c中斷,并標(biāo)示中斷是否發(fā)生。

  IISTAT: 狀態(tài)寄存器。選擇I2C的工作模式,發(fā)出S信號,P信號,使能接受/發(fā)送功能,并標(biāo)示各種狀態(tài),比如總線仲裁是否成功,作為從機(jī)時(shí)是否被尋址,是否接收到0地址,是否接收到ACK信號。

IICADD:多主機(jī)I2C地址寄存器;

IICDS:發(fā)送、接受數(shù)據(jù)移位寄存器;

接下來按照數(shù)據(jù)手冊,根據(jù)其主機(jī)發(fā)送器的工作流程來編寫相應(yīng)的代碼。

三個(gè)函數(shù)就可以實(shí)現(xiàn)簡單的I2C協(xié)議: 讀取,寫入,中斷;

編程思路如下:

寫函數(shù),讀函數(shù),僅僅是啟動I2C傳輸,然后等待,直到數(shù)據(jù)在中斷服務(wù)程序中傳輸完畢后再返回。

2 SPI總線協(xié)議的認(rèn)識(SPI中的極性CPOL和相位CPHA)

【背景】

最近在看關(guān)于Silicon Labs的C8051F347的某個(gè)驅(qū)動中,關(guān)于SPI部分初始化的代碼,看到其對于SPI的設(shè)置為CPOL=1,CPHA=0,對于CPOL及CPHA的含義不了解,想要搞懂,這兩個(gè)參數(shù)到底是什么意思,以及為何要這么設(shè)置。所以才去找了SPI的極性和相位的相關(guān)資料,整理如下。

【SPI基礎(chǔ)知識簡介】

設(shè)備與設(shè)備之間通過某種硬件接口通訊,目前存在很多種接口,SPI接口是其中的一種。

SPI中分Master主設(shè)備和Slave從設(shè)備,數(shù)據(jù)發(fā)送都是由Master控制。

一個(gè)master可以接一個(gè)或多個(gè)slave。

常見用法是一個(gè)Master接一個(gè)slave,只需要4根線:

SCLK:Serial Clock,(串行)時(shí)鐘

MISO:Master In Slave Out,主設(shè)備輸入,從設(shè)備輸出

MOSI:Master Out Slave In,主設(shè)備輸出,從設(shè)備輸入

SS: Slave Select,選中從設(shè)備,片選

SPI由于接口相對簡單(只需要4根線),用途算是比較廣泛,主要應(yīng)用在 EEPROM,F(xiàn)LASH,實(shí)時(shí)時(shí)鐘,AD轉(zhuǎn)換器,還有數(shù)字信號處理器和數(shù)字信號解碼器之間。即一個(gè)SPI的Master通過SPI與一個(gè)從設(shè)備,即上述的那些Flash,ADC等,進(jìn)行通訊。
而主從設(shè)備之間通過SPI進(jìn)行通訊,首先要保證兩者之間時(shí)鐘SCLK要一致,互相要商量好了,要匹配,否則,就沒法正常通訊了,即保證時(shí)序上的一致才可正常訊。而這里的SPI中的時(shí)鐘和相位,指的就是SCLk時(shí)鐘的特性,即保證主從設(shè)備兩者的時(shí)鐘的特性一致了,以保證兩者可以正常實(shí)現(xiàn)SPI通訊。

【SPI相關(guān)的縮寫或說法】

先簡單說一下,關(guān)于SPI中一些常見的說法:

SPI的極性Polarity和相位Phase,最常見的寫法是CPOL和CPHA,不過也有一些其他寫法,簡單總結(jié)如下:

(1) CKPOL (Clock Polarity) = CPOL = POL = Polarity =(時(shí)鐘)極性;

(2) CKPHA (Clock Phase) = CPHA = PHA = Phase =(時(shí)鐘)相位;

(3) SCK=SCLK=SPI的時(shí)鐘;

(4) Edge=邊沿,即時(shí)鐘電平變化的時(shí)刻,即上升沿(rising edge)或者下降沿(falling edge);

對于一個(gè)時(shí)鐘周期內(nèi),有兩個(gè)edge,分別稱為:

Leading edge=前一個(gè)邊沿=第一個(gè)邊沿,對于開始電壓是1,那么就是1變成0的時(shí)候,對于開始電壓是0,那么就是0變成1的時(shí)候;

Trailing edge=后一個(gè)邊沿=第二個(gè)邊沿,對于開始電壓是1,那么就是0變成1的時(shí)候(即在第一次1變成0之后,才可能有后面的0變成1),對于開始電壓是0,那么就是1變成0的時(shí)候;

本文采用如下用法:

極性=CPOL

相位=CPHA

SCLK=時(shí)鐘

第一個(gè)邊沿和第二個(gè)邊沿

【SPI的相位和極性】

CPOL和CPHA,分別都可以是0或時(shí)1,對應(yīng)的四種組合就是:

Mode 0CPOL=0, CPHA=0
Mode 1CPOL=0, CPHA=1
Mode 2CPOL=1, CPHA=0
Mode 3CPOL=1, CPHA=1

結(jié)合這個(gè)圖已經(jīng)很清楚的認(rèn)識到,極性和相位主要是控制什么東東了.cpol等于0時(shí),時(shí)鐘的空閑電平就是0;cpol等于1時(shí),空閑電平就是1;而cpha決定了數(shù)據(jù)采樣的時(shí)刻,是第一個(gè)邊沿的時(shí)候,還是第二個(gè)邊沿的時(shí)候。

【如何看懂和記憶CPOL和CPHA】

所以,關(guān)于在其他地方介紹的,看似多么復(fù)雜難懂難記憶的CPOL和CPHA,其實(shí)經(jīng)過上面解釋,就很容易看懂了:

去看時(shí)序圖,如果起始的始終SCLK的電平是0,那么CPOL=0,如果是1,那么CPOL=1,

然后看數(shù)據(jù)采樣時(shí)刻,即時(shí)序圖數(shù)據(jù)線上的數(shù)據(jù)那個(gè)矩形區(qū)域的中間所對應(yīng)的位置,對應(yīng)到上面SCLK時(shí)鐘的位置,對應(yīng)著是第一個(gè)邊沿或是第二個(gè)邊沿,即CPHA是0或1。(對應(yīng)的是上升沿還是還是下降沿,要根據(jù)對應(yīng)的CPOL的值,才能確定)。

即:

(1)如何判斷CPOL:SCLK的空閑時(shí)候的電壓,是0還是1,決定了CPOL是0還是1;

(2)如何判斷CPHA:而數(shù)據(jù)采樣時(shí)刻對應(yīng)著的SCLK的電平,是第一個(gè)邊沿還是第二個(gè)邊沿,對應(yīng)著CPHA為0還是1。

【軟件中如何設(shè)置SPI的極性和相位】

SPI分主設(shè)備和從設(shè)備,兩者通過SPI協(xié)議通訊。

而設(shè)置SPI的模式,是從設(shè)備的模式,決定了主設(shè)備的模式。

所以要先去搞懂從設(shè)備的SPI是何種模式,然后再將主設(shè)備的SPI的模式,設(shè)置和從設(shè)備相同的模式,即可正常通訊。

對于從設(shè)備的SPI是什么模式,有兩種:

(1)固定的,有SPI從設(shè)備硬件決定的

SPI從設(shè)備,具體是什么模式,相關(guān)的datasheet中會有描述,需要自己去datasheet中找到相關(guān)的描述,即:

關(guān)于SPI從設(shè)備,在空閑的時(shí)候,是高電平還是低電平,即決定了CPOL是0還是1;

然后再找到關(guān)于設(shè)備是在上升沿還是下降沿去采樣數(shù)據(jù),這樣就是,在定了CPOL的值的前提下,對應(yīng)著可以推算出CPHA是0還是1了。

舉例1:

CC2500- Low-Cost Low-Power 2.4 GHz RF Transceiver的datasheet中SPI的時(shí)序圖是:

從圖中可以看到,最開始的SCLK和結(jié)束時(shí)候的SCLK,即空閑時(shí)刻的SCLK,是低電平,推導(dǎo)出CPOL=0,然后可以看到數(shù)據(jù)采樣的時(shí)候,即數(shù)據(jù)最中間的那一點(diǎn),對應(yīng)的是SCLK的第一個(gè)邊沿,所以CPHA=0(此時(shí)對應(yīng)的是上升沿)。

舉例2:

SSD1289- 240 RGB x 320 TFT LCD Controller Driver的datasheet中提到:

“SDI is shifted into 8-bit shift register on every rising edge of SCK in the order of data bit 7, data bit 6 …… data bit 0.”

意思是,數(shù)據(jù)是在上升沿采樣,所以可以斷定是CPOL=0,CPHA=0,或者CPOL=1,CPHA=1的模式,但是至于是哪種模式。

按理來說,接下來應(yīng)該再去確定SCLK空閑時(shí)候是高電平還是低電平,用以確定CPOL是0還是1,但是datasheet中沒有提到這點(diǎn)。

所以,此處,目前不太確定,是兩種模式都支持,還是需要額外找證據(jù)卻確定CPOL是0還是1.

(2)可配置的,由軟件自己設(shè)定

從設(shè)備也是一個(gè)SPI控制器,4種模式都支持,此時(shí)只要自己設(shè)置為某種模式即可。

然后知道了從設(shè)備的模式后,再去將SPI主設(shè)備的模式,設(shè)置為和從設(shè)備模式一樣,即可。

對于如何配置SPI的CPOL和CPHA的話,不多細(xì)說,多數(shù)都是直接去寫對應(yīng)的SPI控制器中對應(yīng)寄存器中的CPOL和CPHA那兩位,寫0或?qū)?即可。


上一頁 1 2 下一頁

關(guān)鍵詞: 單片機(jī)arm接口總

評論


技術(shù)專區(qū)

關(guān)閉