本文介紹如何將 GPIO 端口連接到 SPI 外設。它定義了SPI協議的基礎知識,信號和SCK信號的四種傳輸變體。包括一個軟件程序,用于使用MAX7651實現SPI接口,MAX12是一種閃存可編程的<>位集成數據采集系統(tǒng)。
介紹
The SPI?總線是許多微處理器外設芯片使用的4線串行通信接口。MAX7651微處理器不包括實現接口的專用硬件。但是,圖中顯示了可以向SPI外設發(fā)送和接收數據的簡單軟件例程。
SPI接口的4個引腳如下:
SCK(串行數據時鐘):數據在SCK的上升沿或下降沿上移動/鎖定(請參閱下一節(jié))。
MOSI(主輸出/從輸入):如果芯片是主設備,則數據從此引腳傳輸出去,如果芯片是從設備,則數據傳輸到此引腳。
MISO(主輸入/從輸出):如果芯片是主設備,則數據接收到此引腳,如果芯片是從設備,則從該引腳傳輸出去。
/CS(芯片選擇,低電平有效):告知外圍設備傳輸即將開始。
SPI協議定義了SCK相位和極性的四種數據組合。如果芯片具有設置這四種狀態(tài)的控制位,則它們通常稱為CPOL(時鐘極性)和CPHA(時鐘相位)。SPI 始終以 8 位塊傳輸數據。您可以根據需要傳輸任意數量的 8 位塊。例如,16 位寫入從前 8 位開始到第 <> 位結束斷言/CS。
CPOL | CPHA | Transfer |
0 | 0 |
SCK上升沿轉移。 SCK 在位定時中間進行轉換。 |
1 | 0 |
SCK 落邊轉移。 SCK 在位定時中間進行轉換。 |
0 | 1 |
SCK 落邊轉移。 SCK 在位時序開始時轉換。 |
1 | 1 |
SCK上升沿轉移。 SCK 在位時序開始時轉換。 |
在讀取SPI外設的數據手冊時,通常會看到對SPI模式的引用為CPOL = 0、CPHA = 0等,即使芯片本身在物理上不包含這些位定義。相反,SPI接口是“硬連線”的,以發(fā)送/接收數據,就好像CPOL和CPHA位已設置為0一樣。例如,MAX5154 12位DAC采用SPI接口,具有上升沿中位數據傳輸功能。這對應于CPOL = 0,CPHA = 0協議。因為這是迄今為止最常見的SPI傳輸,所以這就是我們將要討論的示例代碼。下圖來自MAX5154數據資料。信號/CS是SPI信號Active-Low SS,SCLK是SCK,DIN將連接到MODI,因為外設是從機,只有一個輸入(沒有回讀)。這部分在傳輸中使用 16 位。
圖1.串行接口時序圖。
代碼示例:8 位數據傳輸
以下示例是最常見的 SPI 傳輸類型,CPO = 0,CPHA = 0。該例程不假設MAX7651的時鐘速度,因為I/O端口位只是盡可能快地“位敲擊”。數據傳輸時間顯示在本節(jié)末尾。
圖2所示為MAX7651/MAX7652與SPI外設之間的典型連接。
圖2.通用 SPI 連接。
注釋字段中的數字 {N} 是執(zhí)行指令的時鐘周期數。
;用于 8 位外設的 SPI 數據傳輸。MAX7651為主站;外圍是奴隸。
;
;使用以下SPI定義的引腳。(某些外圍設備是寫入的 僅,因此只需要 3 根電線。
;SCK:數據傳輸時鐘
;MISO:主輸入數據(來自外設),并不總是使用
;MOSI:主輸出數據(到外設);
SS:從選擇(低電平有效))
;
SCK | EQU | P1.0 | |
MISO | EQU | P1.1 | |
MOSI | EQU | P1.2 | |
CS | EQU | 小1.3 | ;使用端口 1,但這是 100% 任意的。使用任何可用的 引 腳。 |
;
;現在我們需要使用MAX7651中的一些內部RAM作為數據存儲。
;為了執(zhí)行速度,其中兩個變量必須位于 RAM 區(qū)域
;這允許在字節(jié)內進行位尋址。在MAX7651中,RAM空間對應于
;到地址 20H 到 2FH。低于 20H 或高于 2FH 的地址不能被位尋址!
SPI_In | EQU | 20+ | ;從從屬設備讀取 8 位的結果。 |
SPI_Out | EQU | 21+ | ;我們希望發(fā)送給奴隸的數據。 |
;
;最后,我們需要一個循環(huán)計數器來跟蹤發(fā)送 8 位。
;這可以是“R”寄存器 (R0-R7) 或
;任何 RAM 寄存器(不必是位可尋址的)。讓我們使用
內存 ;注冊。
LOOP | EQU | 30+ | ;可以在地圖中的任何位置;這只是一個例子。 |
;
;假設調用時,已經設置了片選位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 周期總數為 6 + 8 × 23 + 1 = 191。僅供讀取或寫入,總數為 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主機設置為最慢的位傳輸速度(125KHz),MAX7651必須工作在12MHz時鐘速度。
審核編輯:郭婷
-
芯片
+關注
關注
452文章
50209瀏覽量
420947 -
微處理器
+關注
關注
11文章
2244瀏覽量
82267 -
總線
+關注
關注
10文章
2858瀏覽量
87912
發(fā)布評論請先 登錄
相關推薦
評論