單片機(jī) arm 常用的接口總結(jié)
1 I2C總線
本文引用地址:http://butianyuan.cn/article/201611/321770.htmIISTAT: 狀態(tài)寄存器。選擇I2C的工作模式,發(fā)出S信號(hào),P信號(hào),使能接受/發(fā)送功能,并標(biāo)示各種狀態(tài),比如總線仲裁是否成功,作為從機(jī)時(shí)是否被尋址,是否接收到0地址,是否接收到ACK信號(hào)。
2 SPI總線協(xié)議的認(rèn)識(shí)(SPI中的極性CPOL和相位CPHA)
最近在看關(guān)于Silicon Labs的C8051F347的某個(gè)驅(qū)動(dòng)中,關(guān)于SPI部分初始化的代碼,看到其對(duì)于SPI的設(shè)置為CPOL=1,CPHA=0,對(duì)于CPOL及CPHA的含義不了解,想要搞懂,這兩個(gè)參數(shù)到底是什么意思,以及為何要這么設(shè)置。所以才去找了SPI的極性和相位的相關(guān)資料,整理如下。
設(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è)備,片選
先簡單說一下,關(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);
對(duì)于一個(gè)時(shí)鐘周期內(nèi),有兩個(gè)edge,分別稱為:
Leading edge=前一個(gè)邊沿=第一個(gè)邊沿,對(duì)于開始電壓是1,那么就是1變成0的時(shí)候,對(duì)于開始電壓是0,那么就是0變成1的時(shí)候;
Trailing edge=后一個(gè)邊沿=第二個(gè)邊沿,對(duì)于開始電壓是1,那么就是0變成1的時(shí)候(即在第一次1變成0之后,才可能有后面的0變成1),對(duì)于開始電壓是0,那么就是1變成0的時(shí)候;
本文采用如下用法:
極性=CPOL
相位=CPHA
SCLK=時(shí)鐘
第一個(gè)邊沿和第二個(gè)邊沿
【SPI的相位和極性】
CPOL和CPHA,分別都可以是0或時(shí)1,對(duì)應(yīng)的四種組合就是:
Mode 0 | CPOL=0, CPHA=0 |
Mode 1 | CPOL=0, CPHA=1 |
Mode 2 | CPOL=1, CPHA=0 |
Mode 3 | CPOL=1, CPHA=1 |
【如何看懂和記憶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ū)域的中間所對(duì)應(yīng)的位置,對(duì)應(yīng)到上面SCLK時(shí)鐘的位置,對(duì)應(yīng)著是第一個(gè)邊沿或是第二個(gè)邊沿,即CPHA是0或1。(對(duì)應(yīng)的是上升沿還是還是下降沿,要根據(jù)對(duì)應(yīng)的CPOL的值,才能確定)。
即:
(1)如何判斷CPOL:SCLK的空閑時(shí)候的電壓,是0還是1,決定了CPOL是0還是1;
(2)如何判斷CPHA:而數(shù)據(jù)采樣時(shí)刻對(duì)應(yīng)著的SCLK的電平,是第一個(gè)邊沿還是第二個(gè)邊沿,對(duì)應(yīng)著CPHA為0還是1。
【軟件中如何設(shè)置SPI的極性和相位】
SPI分主設(shè)備和從設(shè)備,兩者通過SPI協(xié)議通訊。
而設(shè)置SPI的模式,是從設(shè)備的模式,決定了主設(shè)備的模式。
所以要先去搞懂從設(shè)備的SPI是何種模式,然后再將主設(shè)備的SPI的模式,設(shè)置和從設(shè)備相同的模式,即可正常通訊。
對(duì)于從設(shè)備的SPI是什么模式,有兩種:
(1)固定的,有SPI從設(shè)備硬件決定的
SPI從設(shè)備,具體是什么模式,相關(guān)的datasheet中會(huì)有描述,需要自己去datasheet中找到相關(guān)的描述,即:
關(guān)于SPI從設(shè)備,在空閑的時(shí)候,是高電平還是低電平,即決定了CPOL是0還是1;
然后再找到關(guān)于設(shè)備是在上升沿還是下降沿去采樣數(shù)據(jù),這樣就是,在定了CPOL的值的前提下,對(duì)應(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),對(duì)應(yīng)的是SCLK的第一個(gè)邊沿,所以CPHA=0(此時(shí)對(duì)應(yīng)的是上升沿)。
舉例2:
“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.
從設(shè)備也是一個(gè)SPI控制器,4種模式都支持,此時(shí)只要自己設(shè)置為某種模式即可。
然后知道了從設(shè)備的模式后,再去將SPI主設(shè)備的模式,設(shè)置為和從設(shè)備模式一樣,即可。
對(duì)于如何配置SPI的CPOL和CPHA的話,不多細(xì)說,多數(shù)都是直接去寫對(duì)應(yīng)的SPI控制器中對(duì)應(yīng)寄存器中的CPOL和CPHA那兩位,寫0或?qū)?即可。
評(píng)論