S3C6410的SPI控制器
?********************************LoongEmbedded********************************
作者:LoongEmbedded(kandi)
時(shí)間:2011.12.07
類別:WINCE驅(qū)動(dòng)開發(fā)
********************************LoongEmbedded********************************
?
?
1.????? SPI控制器
1.1?? 概述
SPI總線是一種全雙工串行同步通訊協(xié)議,SPI(Serial Peripheral Interface)串行外圍接口能夠支持串行數(shù)據(jù)傳輸,其包含兩個(gè)獨(dú)立的8/16/32位移位寄存器分別用于發(fā)送和接收。在SPI傳輸期間,數(shù)據(jù)同步發(fā)送(串行移出)和接收在(串行移入)。
?
1.2?? SPI控制器支持下面的特征
1)????? 全雙工,表示可以同時(shí)發(fā)送和接收。
2)????? 用于發(fā)送和接收的8/16/32位移位寄存器。
3)????? 8位預(yù)分頻邏輯,由時(shí)鐘配置寄存器的低八位決定。
4)????? 3個(gè)時(shí)鐘源,包括PCLK、USBCLK和Epll clock。
5)????? 支持National Semiconductor Microwire的協(xié)議和Motorola的串行外設(shè)接口。
6)????? 兩個(gè)獨(dú)立的發(fā)送和接收FIFO,each 16 samples deep by 32-bits wide。
7)????? 支持主模式和從模式。
8)????? 支持只接收沒發(fā)送的操作。
9)????? 發(fā)送/接收的最大頻率為50MHZ,但在CPHA=1,且從發(fā)送模式時(shí),最大頻率為20MHz。
?
1.3?? 信號(hào)描述
S3C6410的SPI控制器和SPI接口的外部設(shè)備之間的外部信號(hào)有4個(gè)接口,這幾個(gè)接口在SPI禁用的時(shí)候可以用作通用的GPIO口。
?
XspiCLK:
串行時(shí)鐘信號(hào),用于控制傳輸數(shù)據(jù)的時(shí)間,可作為輸入和輸出。
XspiMISO:
在主模式下,主設(shè)備通過此引腳獲取從設(shè)備的輸出引腳輸出的數(shù)據(jù),此時(shí)作為輸入;在從模式下,主設(shè)備通過此引腳輸出數(shù)據(jù)到從設(shè)備,此時(shí)作為輸出。
XspiMOSI:
在主模式下,主設(shè)備通過此引腳輸出數(shù)據(jù)給從設(shè)備,此時(shí)作為輸出;在從模式下,主設(shè)備通過此引腳接收來之從設(shè)備輸出的數(shù)據(jù),此時(shí)作為輸入。
XspiCS:
從選擇信號(hào),當(dāng)此引腳為低電平的時(shí)候,所有的數(shù)據(jù)發(fā)送/接收順序被執(zhí)行。
?
1.4?? SPI的操作
S3C6410的SPI接口在S3C6410和外設(shè)之間傳輸一位串行數(shù)據(jù),S3C6410的SPI支持CPU或DMA分別發(fā)送或接收FIFO,并且支持同時(shí)雙向傳輸數(shù)據(jù)。SPI有兩個(gè)通道,分別為TX通道和RX通道,TX通道有一個(gè)從TX FIFO傳輸數(shù)據(jù)到外設(shè)的途徑,RX通道有一個(gè)從外設(shè)接收數(shù)據(jù)到RX FIFO的途徑。
?
CPU或DMA如果要寫數(shù)據(jù)到FIFO中,就必須先寫數(shù)據(jù)到SPI_TX_DATA寄存器中,這樣此寄存器中的內(nèi)容就會(huì)自動(dòng)移動(dòng)到發(fā)送FIFO中,同樣的道理;如果要從接收FIFO中讀取數(shù)據(jù),CPU或DMA就必須訪問寄存器SPI_RX_DATA,緊接著,接收FIFO的數(shù)據(jù)就會(huì)自動(dòng)移動(dòng)到SPI_RX_DATA寄存器中。在此結(jié)合前面提到的移位寄存器,我們把數(shù)據(jù)寄存器、FIFO和移位寄存器的關(guān)系以圖1體現(xiàn):
圖1 數(shù)據(jù)寄存器、FIFO和移位寄存器的關(guān)系圖
為更好去理解SPI的控制邏輯,貼出SPI總線協(xié)議的邏輯框圖,如圖2所示:
圖2 SPI總線規(guī)范邏輯框圖
?
1.4.1???????? 操作模式
HS_SPI支持主和從這兩個(gè)操作模式,在主模式中,主設(shè)備產(chǎn)生HS_SPICLK并且發(fā)送到外設(shè)。XspiCS信號(hào)用于選擇從設(shè)備,當(dāng)其為低電平時(shí)指示數(shù)據(jù)有效,也就是,在開始發(fā)送或者接收數(shù)據(jù)包之前必須先設(shè)置XspiCS為低電平。
?
1.4.2???????? FIFO訪問
S3C6410的SPI支持CPU和DMA來訪問FIFO,CPU和DMA訪問FIFO數(shù)據(jù)的大小可以選擇8/16/32位。如果選擇8位的數(shù)據(jù)大小,有效的數(shù)據(jù)位為0位到7位。通過觸發(fā)用于定義的閾值,CPU對(duì)FIFO的訪問正常打開和關(guān)閉。每個(gè)FIFO的觸發(fā)閾值可以設(shè)備為0到64字節(jié)中任何一個(gè)值。如果采用DMA訪問,那么SPI_MODE_CFG寄存器的TxDMAOn或者RxDMAOn位必須置位,DMA訪問只支持單傳輸和4突發(fā)式傳輸,在往TX FIFO發(fā)送數(shù)據(jù)時(shí),DMA請(qǐng)求信號(hào)在FIFO滿之前一直為高電平。在從RX FIFO接收數(shù)據(jù)時(shí),只要FIFO非空,DMA請(qǐng)求信號(hào)都為高電平。
?
1.4.3???????? RX FIFO中的結(jié)尾字節(jié)
在中斷模式下,RX FIFO中采樣的數(shù)量小于閾值,或是在DMA的4突發(fā)式模式下,并且沒有額外的數(shù)據(jù)被接收,這些留下的字節(jié)被稱為結(jié)尾字節(jié)。為了從RX FIFO中移走這些字節(jié),需要用到內(nèi)部定時(shí)器和中斷信號(hào),基于APB總線時(shí)鐘,內(nèi)部時(shí)鐘的值可以設(shè)置到1024個(gè)時(shí)鐘。當(dāng)此定時(shí)器的值變?yōu)?時(shí),中斷信號(hào)發(fā)生并且CPU能移走RX FIFO中的這些結(jié)尾字節(jié)。
?
1.4.4???????? 數(shù)據(jù)包數(shù)目控制
在主模式下,SPI能夠控制接收的數(shù)據(jù)包數(shù)量。如果要接收任何數(shù)目的數(shù)據(jù)包,只需要設(shè)置PACKET_CNT_REG寄存器,當(dāng)接收到的數(shù)據(jù)包的數(shù)量和設(shè)置的一樣時(shí),SPI停止產(chǎn)生SPICLK,如果要重新裝載此功能,需要強(qiáng)制性遵循軟件或是硬件復(fù)位,其中軟件復(fù)位能夠清除除了特殊功能寄存器之外的所有寄存器,而硬件復(fù)位則清除所有的寄存器。
?
1.4.5???????? 片選控制
XspiCS可以選擇為手動(dòng)控制或是自動(dòng)控制。對(duì)于手動(dòng)控制模式,需要對(duì)從選擇信號(hào)控制寄存器CS_REG的AUTO_N_MANUAL位清零,此模式的XspiCS電平由此寄存器的NSSOUT位控制;對(duì)于自動(dòng)控制模式,需要對(duì)從選擇信號(hào)控制寄存器CS_REG的AUTO_N_MANUAL位置位,XspiCS電平被自動(dòng)確定在包與包之前,其非活動(dòng)期間有NCS_TIME_COUNT的值來決定,此模式下的NSSOUT是無效的,見下圖:
圖3 自動(dòng)片選模式波形圖
1.4.6???????? SPI傳輸格式
為了支持不同傳輸特性的外圍設(shè)備,S3C6410的SPI支持4種數(shù)據(jù)傳輸格式,這是由CPOL和CPHA來決定的,下面先來學(xué)習(xí)這兩個(gè)概念。
?
CPOL:
CPOL(clock polarity)時(shí)鐘極性控制位指定串行時(shí)鐘是active high(也就是當(dāng)SCLK時(shí)鐘有效的時(shí)候?yàn)楦唠娖降臅r(shí)候)還是active low(也就是當(dāng)SCLK時(shí)鐘有效的時(shí)候?yàn)榈碗娖降臅r(shí)候),此控制位對(duì)傳輸格式?jīng)]有重大的影響。CPOL=0時(shí),表示SCLK空閑時(shí)候?yàn)榈碗娖?#xff1b;CPOL=1時(shí),表示SCLK空閑的時(shí)候?yàn)楦唠娖?/p>
?
CPHA:
CPHA(clock phase)時(shí)鐘相位控制位選擇兩個(gè)不同的基礎(chǔ)傳輸格式中的一種,CPHA表示數(shù)據(jù)采樣的時(shí)刻,如果數(shù)據(jù)采樣時(shí)刻對(duì)應(yīng)是SCLK的第一個(gè)跳變沿,則CPHA=0;如果數(shù)據(jù)采樣時(shí)刻對(duì)應(yīng)是SCLK的第二個(gè)跳變沿,則CPHA=1。
?
SPI主設(shè)備和從設(shè)備的時(shí)鐘相位和極性應(yīng)該一致,這樣,SPI主設(shè)備就需要根據(jù)從設(shè)備的時(shí)鐘相位和極性這兩個(gè)特性來確定CPOL和CPHA的值了。在一些情況下,為了允許一個(gè)主設(shè)備和多個(gè)有不同要求的從設(shè)備通訊,需要主設(shè)備來改變時(shí)鐘相位和極性的值。
?
接下來,我們來學(xué)習(xí)SPI總線規(guī)范中CPHA=0和CPHA=1的傳輸格式
圖4 CPHA=0時(shí)的時(shí)序圖
第1個(gè)跳變沿:
SCLK的第一個(gè)跳變沿,從設(shè)備的第一個(gè)數(shù)據(jù)位輸入到主設(shè)備(也即鎖存到主設(shè)備,這里的鎖存也可以理解為采樣)和主設(shè)備的第一個(gè)數(shù)據(jù)位輸入到從設(shè)備(也即鎖存到從設(shè)備)中。對(duì)于一些設(shè)備,只要從設(shè)備被選擇,從設(shè)備數(shù)據(jù)輸出引腳輸出的數(shù)據(jù)的第一位是有效的,在這種格式中,在/SS引腳變低后的半個(gè)時(shí)鐘周期就產(chǎn)生第一個(gè)跳變沿。SPI控制器部分CPOL=0,CPHA=0的時(shí)序圖就屬于這種情形
圖5 CPOL=0和CPHA=0的波形圖
?
接著繼續(xù)描述圖4的時(shí)序圖
第2個(gè)跳變沿:
前面一個(gè)跳變沿從串行數(shù)據(jù)輸入引腳鎖存到主設(shè)備和從設(shè)備的數(shù)據(jù)位被移入到對(duì)應(yīng)的移位寄存器的LSB或MSB,這由LSBFE位來決定。
?
這樣前面的兩個(gè)跳變沿就完成了一個(gè)數(shù)據(jù)位的傳輸了,也說明了對(duì)應(yīng)于一個(gè)跳變沿,發(fā)送和接收時(shí)同時(shí)進(jìn)行的,而不是一個(gè)跳變沿對(duì)應(yīng)發(fā)送,另一個(gè)跳變沿對(duì)應(yīng)接收。
?
第3個(gè)跳變沿:
SPI主設(shè)備的下一位數(shù)據(jù)從輸出引腳輸入到從設(shè)備的輸入引腳,與此同時(shí),從設(shè)備的下一位數(shù)據(jù)從輸出引腳輸入到主設(shè)備的輸入引腳,如此循環(huán),此過程繼續(xù)SCLK的16個(gè)跳變沿,可以總結(jié)出來的規(guī)律是:在跳變沿奇數(shù)的時(shí)候,數(shù)據(jù)被鎖存到設(shè)備中,在跳變沿偶數(shù)的時(shí)候,數(shù)據(jù)被移入到移位寄存器中。
?
這樣在16個(gè)SCLK的跳變沿之后,之前在SPI主設(shè)備數(shù)據(jù)寄存器中的數(shù)據(jù)已經(jīng)為移入到從設(shè)備數(shù)據(jù)寄存器中,而之前從設(shè)備數(shù)據(jù)寄存器中的數(shù)據(jù)已經(jīng)移入到主設(shè)備的數(shù)據(jù)寄存器中了。
圖6 CPHA=1的時(shí)序圖
一些設(shè)備在數(shù)據(jù)輸出引腳輸出的第一個(gè)數(shù)據(jù)位有效之前需要第一個(gè)SCK跳變沿,在第二個(gè)跳變沿的時(shí)候才同步數(shù)據(jù)輸入到主設(shè)備和從設(shè)備中,在這種格式中,在8個(gè)時(shí)鐘傳輸操作周期的開始的時(shí)候通過設(shè)置CPHA位(CPHA=1)來產(chǎn)生第一個(gè)跳變沿。
?
第1個(gè)跳變沿:
在SCK時(shí)鐘同步延時(shí)半個(gè)周期后馬上產(chǎn)生第一個(gè)跳變沿,此時(shí)主設(shè)備指示從設(shè)備發(fā)送其第一個(gè)數(shù)據(jù)位到主設(shè)備的數(shù)據(jù)輸入引腳,但是此數(shù)據(jù)位并不是即將要發(fā)送的數(shù)據(jù)字節(jié)有效的數(shù)據(jù)位,S3C6410的SPI控制器的CPOL=0和CPHA=1的時(shí)序圖如下:
圖7? SPI控制器CPOL=0和CPHA=1的時(shí)序圖
第2個(gè)跳變沿
這是主設(shè)備和從設(shè)備的鎖存跳變沿,也就是說在此跳變沿的時(shí)候,從設(shè)備的第一個(gè)數(shù)據(jù)位輸入到主設(shè)備(也即鎖存到主設(shè)備)和主設(shè)備的第一個(gè)數(shù)據(jù)位輸入到從設(shè)備(也即鎖存到從設(shè)備)中。
?
第3個(gè)跳變沿:
前面一個(gè)跳變沿從串行數(shù)據(jù)輸入引腳鎖存到主設(shè)備和從設(shè)備的數(shù)據(jù)位被移入到對(duì)應(yīng)的移位寄存器的LSB或MSB,這由LSBFE位來決定,到此就完成了一個(gè)數(shù)據(jù)位的傳輸了。
?
第4個(gè)跳變沿:
SPI主設(shè)備的下一位數(shù)據(jù)從輸出引腳輸入到從設(shè)備的輸入引腳,與此同時(shí),從設(shè)備的下一位數(shù)據(jù)從輸出引腳輸入到主設(shè)備的輸入引腳,如此循環(huán),此過程繼續(xù)SCLK的16個(gè)跳變沿,可以總結(jié)出來的規(guī)律是:在跳變沿偶數(shù)的時(shí)候,數(shù)據(jù)被鎖存到設(shè)備中,在跳變沿奇數(shù)的時(shí)候,數(shù)據(jù)被移入到移位寄存器中。
?
這樣在16個(gè)SCLK的跳變沿之后,之前在SPI主設(shè)備數(shù)據(jù)寄存器中的數(shù)據(jù)已經(jīng)為移入到從設(shè)備數(shù)據(jù)寄存器中,而之前從設(shè)備數(shù)據(jù)寄存器中的數(shù)據(jù)已經(jīng)移入到主設(shè)備的數(shù)據(jù)寄存器中了。
?
下面來看S3C6410的SPI控制器支持的4中傳輸格式的波形圖
圖8? SPI控制器支持的4中波形圖
?
?
總結(jié)
以上是生活随笔為你收集整理的S3C6410的SPI控制器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WINCE6.0在应用程序中调用控制面板
- 下一篇: S3C6410 KeyPad驱动(上)