本文介紹如何將 GPIO 端口連接到 SPI 外設(shè)。它定義了SPI協(xié)議的基礎(chǔ)知識,信號和SCK信號的四種傳輸變體。包括一個軟件程序,用于使用MAX7651實現(xiàn)SPI接口,MAX12是一種閃存可編程的<>位集成數(shù)據(jù)采集系統(tǒng)。
介紹
The SPI?總線是許多微處理器外設(shè)芯片使用的4線串行通信接口。MAX7651微處理器不包括實現(xiàn)接口的專用硬件。但是,圖中顯示了可以向SPI外設(shè)發(fā)送和接收數(shù)據(jù)的簡單軟件例程。
SPI接口的4個引腳如下:
SCK(串行數(shù)據(jù)時鐘):數(shù)據(jù)在SCK的上升沿或下降沿上移動/鎖定(請參閱下一節(jié))。
MOSI(主輸出/從輸入):如果芯片是主設(shè)備,則數(shù)據(jù)從此引腳傳輸出去,如果芯片是從設(shè)備,則數(shù)據(jù)傳輸?shù)酱艘_。
MISO(主輸入/從輸出):如果芯片是主設(shè)備,則數(shù)據(jù)接收到此引腳,如果芯片是從設(shè)備,則從該引腳傳輸出去。
/CS(芯片選擇,低電平有效):告知外圍設(shè)備傳輸即將開始。
SPI協(xié)議定義了SCK相位和極性的四種數(shù)據(jù)組合。如果芯片具有設(shè)置這四種狀態(tài)的控制位,則它們通常稱為CPOL(時鐘極性)和CPHA(時鐘相位)。SPI 始終以 8 位塊傳輸數(shù)據(jù)。您可以根據(jù)需要傳輸任意數(shù)量的 8 位塊。例如,16 位寫入從前 8 位開始到第 <> 位結(jié)束斷言/CS。
CPOL | CPHA | Transfer |
0 | 0 |
SCK上升沿轉(zhuǎn)移。 SCK 在位定時中間進行轉(zhuǎn)換。 |
1 | 0 |
SCK 落邊轉(zhuǎn)移。 SCK 在位定時中間進行轉(zhuǎn)換。 |
0 | 1 |
SCK 落邊轉(zhuǎn)移。 SCK 在位時序開始時轉(zhuǎn)換。 |
1 | 1 |
SCK上升沿轉(zhuǎn)移。 SCK 在位時序開始時轉(zhuǎn)換。 |
在讀取SPI外設(shè)的數(shù)據(jù)手冊時,通常會看到對SPI模式的引用為CPOL = 0、CPHA = 0等,即使芯片本身在物理上不包含這些位定義。相反,SPI接口是“硬連線”的,以發(fā)送/接收數(shù)據(jù),就好像CPOL和CPHA位已設(shè)置為0一樣。例如,MAX5154 12位DAC采用SPI接口,具有上升沿中位數(shù)據(jù)傳輸功能。這對應(yīng)于CPOL = 0,CPHA = 0協(xié)議。因為這是迄今為止最常見的SPI傳輸,所以這就是我們將要討論的示例代碼。下圖來自MAX5154數(shù)據(jù)資料。信號/CS是SPI信號Active-Low SS,SCLK是SCK,DIN將連接到MODI,因為外設(shè)是從機,只有一個輸入(沒有回讀)。這部分在傳輸中使用 16 位。
圖1.串行接口時序圖。
代碼示例:8 位數(shù)據(jù)傳輸
以下示例是最常見的 SPI 傳輸類型,CPO = 0,CPHA = 0。該例程不假設(shè)MAX7651的時鐘速度,因為I/O端口位只是盡可能快地“位敲擊”。數(shù)據(jù)傳輸時間顯示在本節(jié)末尾。
圖2所示為MAX7651/MAX7652與SPI外設(shè)之間的典型連接。
圖2.通用 SPI 連接。
注釋字段中的數(shù)字 {N} 是執(zhí)行指令的時鐘周期數(shù)。
;用于 8 位外設(shè)的 SPI 數(shù)據(jù)傳輸。MAX7651為主站;外圍是奴隸。
;
;使用以下SPI定義的引腳。(某些外圍設(shè)備是寫入的 僅,因此只需要 3 根電線。
;SCK:數(shù)據(jù)傳輸時鐘
;MISO:主輸入數(shù)據(jù)(來自外設(shè)),并不總是使用
;MOSI:主輸出數(shù)據(jù)(到外設(shè));
SS:從選擇(低電平有效))
;
SCK | EQU | P1.0 | |
MISO | EQU | P1.1 | |
MOSI | EQU | P1.2 | |
.CS | EQU | 小1.3 | ;使用端口 1,但這是 100% 任意的。使用任何可用的 引 腳。 |
;
;現(xiàn)在我們需要使用MAX7651中的一些內(nèi)部RAM作為數(shù)據(jù)存儲。
;為了執(zhí)行速度,其中兩個變量必須位于 RAM 區(qū)域
;這允許在字節(jié)內(nèi)進行位尋址。在MAX7651中,RAM空間對應(yīng)于
;到地址 20H 到 2FH。低于 20H 或高于 2FH 的地址不能被位尋址!
SPI_In | EQU | 30H | ;從從屬設(shè)備讀取 8 位的結(jié)果。 |
SPI_Out | EQU | 21小時 | ;我們希望發(fā)送給奴隸的數(shù)據(jù)。 |
;
;最后,我們需要一個循環(huán)計數(shù)器來跟蹤發(fā)送 8 位。
;這可以是“R”寄存器 (R0-R7) 或
;任何 RAM 寄存器(不必是位可尋址的)。讓我們使用
內(nèi)存 ;注冊。
LOOP | EQU | 30H | ;可以在地圖中的任何位置;這只是一個例子。 |
;
;假設(shè)調(diào)用時,已經(jīng)設(shè)置了片選位SS 到 1.
SPI_IO: | CLR | SCK | ; SCK starts off low. {1} |
CLR | CS | ; Clearing CS begins the data transfer. {1} | |
SETB | MISO | ; To be used as input, must be set internally. {1} | |
MOV | LOOP,#8 | ; Eight bits to transfer. {3} | |
XFER: | MOV | C,SPI_Out.7 | ; Move bit 7 into Carry (SPI is MSB first). {2} |
MOV | MOSI,C | ; I/O port reflects the Carry bit, which is the Data bit. {2} | |
SETB | SCK | ; Generate SCK rising edge, after Data is stable. {1} | |
MOV | C,MISO | ; Read data from Slave into Carry (optional). {2} | |
MOV | SPI_In.7,C | ; Copy into the received data byte, bit-7 position. {2} | |
CLR | SCK | ; Generate SCK falling edge, after data read in. {1} | |
MOV | A,SPI_Out | ; Accumulator is temp holder for shift operation. {2} | |
RL | A | ; Rotate left (but not through Carry!). {1} | |
MOV | SPI_Out, A | ; Prepare bit 7 for next transfer to Slave. {2} | |
MOV | A,SPI_In | ; Get previous Slave read data. {2} | |
RL | A | ; Rotate left to get next bit position into proper spot. {1} | |
MOV | SPI_In,A | ; Save result. {2} | |
DJNZ | LOOP,XFER | ; Decrement LOOP. Jump if not zero to XFER. {3} | |
; Transfer done. | |||
SETB | CS | ; De-assert chip select. {1} | |
.END | ; Tell assembler code completed. |
傳輸 8 位(讀取和寫入從屬)的 CPU 周期總數(shù)為 6 + 8 × 23 + 1 = 191。僅供讀取或?qū)懭耄倲?shù)為 6 + 8 × 18 + 1 = 151 個 CPU 周期。下表給出了使用MAX7651常用時鐘速度的各種傳輸速率。
MAX7651時鐘速度 | 位傳輸時間 |
總讀/寫 傳輸時間 |
12兆赫 | 7.95us (~125KHz) | 63.6秒 |
11.0592兆赫 | 8.63us (~116KHz) | 69.08秒 |
4兆赫 | 23.88us (~41.9KHz) | 191us |
從此表中,我們可以看到最快的SPI字節(jié)傳輸約為15.7KHz,而最慢的速率為5.2KHz。這比專用的1MHz SPI硬件端口慢得多!因此,如果MAX7651用作從機,則必須將SPI主機設(shè)置為最慢的位傳輸速度(125KHz),MAX7651必須工作在12MHz時鐘速度。
審核編輯:郭婷
-
芯片
+關(guān)注
關(guān)注
454文章
50460瀏覽量
421971 -
微處理器
+關(guān)注
關(guān)注
11文章
2247瀏覽量
82331 -
GPIO
+關(guān)注
關(guān)注
16文章
1196瀏覽量
51934
發(fā)布評論請先 登錄
相關(guān)推薦
評論