去年的時候調(diào)了一下2410的SPI,很暈,但最后還是通了,今天簡單記錄一下大概的過程。?
按著我的慣例先引用一段網(wǎng)絡(luò)上的文章來預(yù)熱一下。
引用:
概況:
S3C2410X的連續(xù)外圍設(shè)備接口(SPI)能連接電路實現(xiàn)連續(xù)數(shù)據(jù)傳遞。S3C2410X包含2個SPI,,每個都分別有兩個8位轉(zhuǎn)移寄存器用于數(shù)據(jù)的傳輸和接收。在一個SPI進行數(shù)據(jù)傳遞時,同步傳送數(shù)據(jù)并連續(xù)輸出數(shù)據(jù)。在某一頻率的8位連續(xù)數(shù)據(jù)由它相應(yīng)的通訊控制寄存器設(shè)置所決定。假如你只發(fā)送數(shù)據(jù),接收數(shù)據(jù)就能設(shè)為啞元。反之,如果你只想接收數(shù)據(jù),你應(yīng)該發(fā)送設(shè)為啞元'1'數(shù)據(jù)。
S3C2410有4個與SPI傳輸有關(guān)的I/O信號引腳:SCK(SPICLK0,1)、MISO(SPIMISOO,1)數(shù)據(jù)線,MOSI(SPIMOSIO,1)和低電平有效的/SS(nSS0,1)引腳(輸入)。
特點
與SPI協(xié)議(Ver.2.11)兼容
8位移位寄存器輸出
8位移位寄存器接收
8位預(yù)分頻邏輯
查詢,中斷,DMA傳輸模式
?
SPI操作
采用SPI接口, S3C2410X可發(fā)送/接收與外部設(shè)備同步的8位數(shù)據(jù)。一個串行時鐘線與兩條用來移位和采樣信息的數(shù)據(jù)線同步。 當SPI為主機時,發(fā)送頻率可以通過為SPPREn寄存器設(shè)置合適的值來控制。你可以通過調(diào)整波特率數(shù)據(jù)寄存器的值來修改它的頻率。當SPI為從機時,其它的主機提供時鐘。當編程者向SPTDATn寄存器寫字節(jié)數(shù)據(jù)時,SPI的收/發(fā)將會同時開始。在其它情況下,在向SPTDATn寄存器寫入字節(jié)數(shù)據(jù)時要把nSS激活。
編輯程序
當向SPTDATn寄存器寫入字節(jié)時,如果ENSCK和SPCONn被設(shè)置的話,SPI就開始傳輸
你可以使用一上典型的程序來操作一個SPI卡。
編程SPI模式,基本遵循這些基本步驟:
1.?????? 設(shè)置波特率寄存器(SPPREn)
2.?????? 設(shè)置SPCONn以選擇合適的SPI模式。
3.??????? 寫數(shù)據(jù)0xFF到SPTDATn10次以初始化MMC或SD卡。.
4.?????? 設(shè)置GPIO引腳使其具有nSS功能,低電平時使MMC或SD卡有效。
5.?????? 發(fā)送數(shù)據(jù):檢查發(fā)送準備樗是否為1,如果為1 的話就開始向SPTDATn寫數(shù)據(jù)。
6.?????? 接收數(shù)據(jù)(1):SPCONn的 TAGD 位禁用 = 正常模式
??? :向SPTDATn 寫0xFF,然后測試REDY,再從讀緩存中讀取數(shù)據(jù)。
7.?????? 接收數(shù)據(jù):SPCONn的TAGD位 能用 = 自動接收垃圾數(shù)據(jù)模式。
??? :測試REDY,然后從讀緩存中讀取數(shù)據(jù)。
8.?????? 設(shè)置GPIO引腳使其具有nSS功能,高電平時使MMC或SD卡有效。
通過DMA發(fā)送的步驟
1.?????? SPI的配置為DMA模式
2.?????? DMA合適設(shè)置
3.?????? SPI請求DMA服務(wù)
4.?????? DMA向SPI發(fā)送一個字節(jié)數(shù)據(jù).
5.??????? SPI向卡里發(fā)送數(shù)據(jù)
6.?????? 返回到步驟3直到DAM計數(shù)變?yōu)?
7.?????? 用SMOD位把SPI設(shè)置為中斷或查詢模式
?
通過DMA接收的步驟
1.?????? 把SPI設(shè)置為DMA以SMOD位開始,并且設(shè)置TAGD位.
2.?????? 全適配置 DMA
3.?????? SPI從卡里接收一字節(jié)數(shù)據(jù)
4.?????? SPI請求DMA服務(wù)
5.?????? DMA從SPI接收數(shù)據(jù)
6.??????? 自動的向SPIDATn寫數(shù)據(jù)0xFF
7.??????? 回到步驟4至DAM計數(shù)變?yōu)?
8.?????? 用SMOD位把SPI配置為查詢模式,并且清TAGD位
9.?????? 如果SPSTAn的REDY 標志被設(shè)置,就讀取最后的字節(jié)數(shù)據(jù)
?
注:
總接收的數(shù)據(jù) = DAM TC 值+在查詢模式下的最后值.
DAM接收的第一個數(shù)據(jù)是啞元,所以使用者可以忽略它
SPI 從機接收模式和B模塊
?
如果SPI從機接收模式有效和SPI模塊被設(shè)成B模塊,SPI操作將會失敗。
READY信號這一內(nèi)部信號將在SPI_CNT達到0之前變成高電平。因此,在DMA模式中,DATA_READ信號應(yīng)該在最后一個數(shù)據(jù)結(jié)束之前產(chǎn)生。
注意
1)????? DMA模式:這種模式不能在SPI從機接收模式和B模塊下使用。
2)????? 查詢模式:在SPI從機接收模式和B模塊下DATA_READ信號應(yīng)該推遲SPICLK的一個相位。
3)????? 中斷模式:在SPI從機接收模式和B模塊下DATA_READ信號應(yīng)該推遲SPICLK的一個相位。
SPI特殊寄存器
SPI控制寄存器
SPI狀態(tài)寄存器
SPI引腳控制寄存器
如果SPI系統(tǒng)使能時,除nSS引腳外的其它引腳的方向通過SPCONn的MSTR位來控制。nSS引腳的方向總是輸入。
當SPI為主機時,nSS引腳用來檢查由SPPIN的ENMUL位提供的多主機錯誤信號,另一個GPIO應(yīng)該選擇從機。
如果SPI被設(shè)置為從機,nSS引腳獎被一個主機選擇為從機。
SPIMISO和SPIMOSI數(shù)據(jù)引腳用來發(fā)送和接收串行數(shù)據(jù)。當SPI為主機時,SPIMISO是數(shù)據(jù)輸入引腳,SPIMOSI是數(shù)據(jù)輸出引腳,SPICLK(SCK)是時鐘輸出線。當SPI為從機時,這些引腳執(zhí)行相反的功能。在多主機系統(tǒng)中,SPICLK(SCK)、SPIMOSI、SPIMISO將被分別的配置在一個體系中。
當其它的SPI設(shè)備作為從機選擇S3C2410 的SPI為從機時,一個主機SPI可以發(fā)出一個多主機錯誤信號。當這個信號被探測到,將會立刻發(fā)生下面所說的事情。但是如果你想探測到這種信號的話必須事先設(shè)置SPPINn的ENMUL位。
?
1.?????? SPCONn的MSTR位被強制為0來啟動從機模式。
2.?????? SPSTAn的MULF標志位被置位,一個SPI中斷會產(chǎn)生。
?
?
這個是我從網(wǎng)上搜到的一篇可以說是2410datasheet??? SPI部分簡單翻譯的文章,不過感覺不是很好,最好是過完一遍后再去讀英文的文檔,那個才是“根本”,才能看得懂,看得明白。
不過下面還是比出一個比較好的文章,介紹得很全。其中有臭氧層子的東西,也有寄存器的介紹,這樣設(shè)置起來也比較容易,畢竟最干的、最實際的、最精華的地方還是在這里嘛。如下:
SPI接口概述
?SPI接口:SPI(Serial Peripheral Interface,串行外設(shè)接口)是Motorola公司開發(fā)的一種同步串行外設(shè)接口標準。
?SPI接口信號:有4個信號:數(shù)據(jù)發(fā)送、數(shù)據(jù)接收、時鐘和片選。在時鐘信號的作用下,發(fā)送的同時,接收對方發(fā)來的數(shù)據(jù);也可以只發(fā)送、或者只接收。SPI的波特率可以達到20Mb/s以上。
??S3C2410 ARM9有2個SPI接口,既可以作為主SPI使用,也可以作為從SPI使用。
?主要特點:
?與SPI 協(xié)議 (ver. 2.11) 兼容;
?8位發(fā)送移位寄存器;
?8位接收移位寄存器;
?8位預(yù)分頻器;
?具有查詢、中斷、DMA傳輸模式。
???