MC9S12XEP100的SPI模塊(S12SPIV5)

最近要用到W5500,終於有機會使用SPI模塊了,把相關資料看了遍,各種速成教程還是沒有數據手冊靠譜。於是直接翻譯一遍。

SPI模塊的硬件驅動部分已經寫好。http://blog.csdn.net/lin_strong/article/details/79361503

如果翻譯中發現了什麼問題歡迎聯繫我指正。


第21章 串行外設接口(S12SPIV5)

譯者注:譯者博客(http://blog.csdn.net/lin_strong),轉載請保留這條。此爲 MC9S12XEP100RMV1芯片手冊的第21章內容,僅供學習交流使用,請勿用於商業用途。

介紹

SPI模塊實現了MCU與外設設備間的雙工同步串行通信。軟件可以通過輪詢標誌位或者異步中斷通知的方式來與SPI模塊交互。

術語縮寫

縮寫 全稱(英) 全稱(中)
SPI Serial Peripheral Interface 串行外設接口
SS Slave Select 從機選定
SCK Serial Clock 串行時鐘
MOSI Master Output, Slave Input 主(機)(輸)出從(機)(輸)入
MISO Master Input, Slave Output 主入從出
MOMI Master Output, Master Input 主入主出
SISO Slave Input, Slave Output 從入從出

特性

SPI模塊包含以下特性:

  • 可以設置爲主節點或從節點
  • 可選傳輸數據寬度爲8或16位
  • 單線雙向(Bidirectional,譯者注:直譯爲“雙向”,但意思上看應該是指單線雙向,因爲SPI本身就是雙向的,所以後面譯爲“單線雙向”)模式
  • 從機選定信號輸出
  • 帶有中斷功能的模式故障錯誤標誌位
  • 雙緩衝數據寄存器
  • 可通過編程更改極性和相位的串行時鐘
  • 控制SPI在等待模式下運作

運行模式

SPI模塊可以在三種模式下運行:run、wait和stop。

  • Run模式
    這是基本的運行模式
  • Wait模式
    在wait模式中運行的SPI是一個可配置的低能耗模式,由SPICR2寄存器內的SPISWAI位控制。在wait模式下,如果SPISWAI位爲0,SPI就會如在run模式下一樣運行。如果SPISWAI位爲1,SPI會進入低能耗狀態,SPI時鐘生成會被關閉。如果SPI被配置爲主機,任何進行中的傳輸都會停止,但是會在CPU進入run模式後恢復。如果SPI被配置爲從機,數據的接收和傳輸會繼續,這樣從機就能與主機保持同步。
  • Stop模式
    爲了節能,SPI在stop模式下是不活躍的。如果SPI被配置爲主機,任何進行中的傳輸都會停止,但是會在CPU進入run模式後恢復。如果SPI被配置爲從機,數據的接收和傳輸會繼續,這樣從機就能與主機保持同步。

想了解細節的話,請參閱4.7“低能耗模式選項”。

框圖

下圖給出了SPI架構的綜覽。SPI模塊主要由狀態、控制和數據寄存器、移位邏輯、波特率生成器、主/從控制邏輯和端口控制邏輯構成。

SPI框圖
圖 1.SPI框圖

引腳描述

這個部分列出了所有可能會與外部芯片連接的端口。SPI模塊總共有4個外部引腳。

MOSI — 主出/從入引腳

當配置爲主機時,這個引腳用於把數據傳出SPI模塊;當配置爲從機時,用於接收數據。

MISO — 主入/從出引腳

當配置爲從機時,這個引腳用於把數據傳出SPI模塊;當配置爲主機時,用於接收數據。

大SS — 從機選定引腳

當配置爲主機時,這個引腳用於從SPI模塊輸出選定信號到要接收數據的外設;當配置爲從機時,用於接收從機選定信號。

SCK — 串行時鐘引腳

在主機模式下,這是同步時鐘輸出引腳;在從機模式下,這是同步時鐘接收引腳。

內存映射與寄存器定義

這個部分提供了SPI模塊的地址空間與寄存器的細節描述。

模塊內存映射

圖2給出了SPI模塊的內存映射。每個寄存器前列出的地址指的是偏移量。基地址定義在SoC等級,地址偏移定義在模塊等級。讀保留位會返回0,寫保留位沒有任何用處。

SPI寄存器總結
圖 2.SPI寄存器總結

寄存器描述

這個部分按照地址順序描述了每個寄存器。每個描述都包含帶有相關數字的標準寄存器圖。然後緊跟着寄存器位和字段功能的描述,按照位順序。

SPI控制寄存器1(SPICR1)

SPI控制寄存器1
圖 3. SPI控制寄存器1

讀:隨時
寫:隨時

表 2. SPICR1字段描述

字段 描述
7
SPIE
SPI 中斷使能位 — 如果SPIF或者MODF狀態標誌位被置位,這個位會使能SPI中斷請求。
0 禁用SPI中斷。
1 使能SPI中斷
6
SPE
SPI 系統使能位 — 這個位會使能SPI系統並把SPI端口引腳賦予SPI系統使用。如果SPE被清零,SPI就會被禁用並強制進入空閒狀態,SPISR寄存器內的狀態位會被重置。
0 禁用SPI(低能耗)。
1 使能SPI,端口引腳賦予SPI模塊使用。
5
SPTIE
SPI 傳輸中斷使能 — 如果SPTEF標誌位被置位,這個位會使能SPI中斷請求。
0 禁用SPTEF中斷。
1 使能SPTEF中斷
4
MSTR
SPI 主/從模式選擇位 — 這個位用於選擇SPI是主機還是從機。將SPI從主機切換爲從機或反之會強迫SPI系統進入空閒狀態。
0 SPI從機模式。
1 SPI主機模式
3
CPOL
SPI 時鐘極性位 — 這個位用於選擇SPI時鐘是否反相。想要在SPI模塊間傳輸數據的話,SPI模塊必須使用相同的CPOL值。在主機模式下,改變這個位會導致進行中的傳輸被拋棄並強制SPI系統進入空閒狀態。
0 使用高有效時鐘。在空閒狀態下SCK是低電平。
1 使用低有效時鐘。在空閒狀態下SCK是高電平。
2
CPHA
SPI 時鐘相位位 — 這個位用於選擇SPI時鐘格式。在主機模式下,改變這個位會導致進行中的傳輸被拋棄並強制SPI系統進入空閒狀態。
0 在奇數邊沿進行數據採樣。
1 在偶數邊沿進行數據採樣。
1
SSOE
從機選定輸出信號使能 — SS輸出特性與這個位以及MODFEN位有關,詳見表3。在主機模式下,改變這個位會導致進行中的傳輸被拋棄並強制SPI系統進入空閒狀態。
0
LSBFE
使能LSB-First — 這個位不影響數據寄存器內的字節序。讀寫數據寄存器時總是在最高bit放MSB。在主機模式下,改變這個位會導致進行中的傳輸被拋棄並強制SPI系統進入空閒狀態。
0 最高有效位優先傳輸。
1 最低有效位優先傳輸。

表3. SS 輸入/輸出選擇

MODFEN SSOE 主機模式 從機模式
0 0 SS 不被SPI使用 SS 爲輸入
0 1 SS 不被SPI使用 SS 爲輸入
1 0 有MODF特性的SS 輸入 SS 爲輸入
1 1 SS 是從機選擇輸出 SS 爲輸入

SPI控制寄存器2(SPICR2)

SPI控制寄存器2
圖 4.SPI控制寄存器2(SPICR2)

讀:隨時
寫:隨時;寫保留的位沒有任何用。

表 4. SPICR2 字段描述

字段 描述
6
XFRW
傳輸寬度 — 這個位用於選擇傳輸數據的寬度。如果選擇了8位傳輸寬度,SPIDRL就是專門的數據寄存器,SPIDRH無用。如果選擇了16位傳輸寬度,SPIDRH和SPIDRL就形成了一個16位數據寄存器。參閱3.2.4 “SPI狀態寄存器(SPISR)”瞭解更多關於傳輸/接收數據處理以及中斷標誌位清零機制的信息。在主機模式下,改變這個位會導致進行中的傳輸被拋棄並強制SPI系統進入空閒狀態。
0 8位傳輸數據寬度(n=8)1
1 16位傳輸數據寬度(n=16)1
4
MODFEN
模式故障使能位 — 這個位會使能MODF故障探測。如果SPI處於主機模式並且MODFEN被清零了,那麼SS引腳就不受SPI模塊控制。在從機模式下,不管MODFEN的值是什麼,SS 都是輸入引腳。參閱表3獲得MODFEN對SS 的作用的綜述。在主機模式下,改變這個位會導致進行中的傳輸被拋棄並強制SPI系統進入空閒狀態。
0 SS 端口引腳不被SPI模塊使用。
1 帶MODF特性的SS 端口引腳。
3
BIDIROE
單線雙向模式下輸出使能 — 在單線雙向運行模式下(SPC0=1),這個位用於控制MOSI和MISO輸出緩存。在主機模式下,這個位控制MOSI端口的輸出緩存,在從機模式下,它控制MISO端口的輸出緩存。在主機模式下,SPC0從0變爲1會導致進行中的傳輸被拋棄並強制SPI系統進入空閒狀態。
0 禁用輸出緩存。
1 使能輸出緩存。
1
SPISWAI
Wait模式下SPI模塊停止 — 這個位用於在wait模式下節能
0 SPI時鐘在wait模式下正常運行。
1 在wait模式下停止SPI時鐘生成。
0
SPC0
串行引腳控制位0 — 這個位用於使能單線雙向引腳配置,詳見表5。在主機模式下,改變這個位會導致進行中的傳輸被拋棄並強制SPI系統進入空閒狀態。

1. n在後面用作選擇的傳輸寬度的佔位符

表 5. 單線雙向引腳配置
單線雙向引腳配置

SPI波特率寄存器(SPIBR)

SPI波特率寄存器(SPIBR)
圖 5.SPI波特率寄存器(SPIBR)

讀:隨時
寫:隨時;寫入保留的位沒有任何作用。

表 6.SPIBR字段描述

字段 描述
6-4
SPPR[2:0]
SPI波特率預選位 — 這幾位如表7中那樣決定了SPI波特率。在主機模式下,改變這個位會導致進行中的傳輸被拋棄並強制SPI系統進入空閒狀態。
2-0
SPR[2:0]
SPI波特率選擇位 — 這幾位如表7中那樣決定了SPI波特率。在主機模式下,改變這個位會導致進行中的傳輸被拋棄並強制SPI系統進入空閒狀態。

波特率分頻係數表達式如下:

然後如下計算出波特率:

注意:
請查閱這個數據手冊的電氣章節的SPI電氣規範來了解允許的最小波特率。

表 7.SPI波特率選擇示例(25MHz總線時鐘)
SPI波特率選擇示例(25MHz總線時鐘)

SPI狀態寄存器(SPISR)

SPI狀態寄存器(SPI)
圖 6.SPI狀態寄存器(SPISR)

讀:隨時
寫:沒有作用

表 8.SPISR字段描述

字段 描述
7
SPIF
SPIF 中斷標誌位 — 在數據被傳輸入SPI數據寄存器後這個位被置位。參閱表9瞭解如何清零SPIF標誌位。
0 傳輸未完成。
1 新數據已被拷貝進SPIDR。
5
SPTEF
SPI發送器空中斷標誌位 — 如果被置位,說明數據發送寄存器已經空了。參閱表9瞭解如何清零這個位並放置數據進數據發送寄存器。
0 SPI數據寄存器非空。
1 SPI數據寄存器空。
4
MODF
模式故障標誌位 — 當SPI被配置爲主機並且SPICR2寄存器的MODFEN位被置位即啓用了模式故障探測後,如果探測到SS引腳被拉低,這個位被置位。詳情請參閱3.2.2 “SPI控制寄存器2(SPICR2)”的MODFEN位描述。通過(當MODF=1時)讀取一次SPI狀態寄存器然後寫入SPI控制寄存器1,這個標誌位就會自動清零。
0 沒有發生模式故障。
1 發生了模式故障。

表 9.SPIF中斷標誌位清零序列
SPIF中斷標誌位清零序列

表 10.SPTEF中斷標誌位清零序列
SPTEF中斷標誌位清零序列

SPI數據寄存器(SPIDR = SPIDRH:SPIDRL)

SPI高位數據寄存器
圖 7.SPI高位數據寄存器

SPI低位數據寄存器
圖 8.SPI低位數據寄存器

讀:隨時;只有在SPIF被置位時讀的數據纔有效
寫:隨時

SPI數據寄存器同時作爲SPI數據的輸入和輸出寄存器。寫入這個寄存器會讓數據按序傳輸。對於配置爲主機的SPI,數據序列會在前一個傳輸完成後立刻開始傳輸。SPI發送器將SPISR寄存器內的SPTEF標誌位清零說明SPI數據寄存器已經準備好接受新數據了。當SPIF被置位了,說明SPIDR裏接收的數據有效。
如果SPIF爲0並且收到了數據,收到的數據就會從接受移位寄存器傳輸到SPIDR中,然後置位SPIF。
如果SPIF爲1時收到了第二個數據值,新收到的數據會作爲有效值先存在接收移位寄存器內直到開始下一次傳輸。SPIDR內的數據不會變化。
如果SPIF爲1,新數據還在接收移位寄存器內,而在第三次傳輸開始之前取出了數據,則接收移位寄存器內的數據就會傳輸進SPIDR中,SPIF會保留置位(見圖9)。
如果SPIF爲1,新數據還在接收移位寄存器內,而在第三次傳輸之後才取出數據,則接收移位寄存器內的數據已經無效了,不會被傳入SPIDR中(見圖10)。

及時取出數據的情況
圖 9.及時取出數據的情況

未及時取出數據的情況
圖 10.未及時取出數據的情況

功能描述

SPI模塊實現了MCU與外設設備間的雙工同步串行通信。軟件可以通過輪詢標誌位或者異步中斷通知的方式來與SPI模塊交互。

通過置位SPI控制寄存器1中的SPI使能位(SPE)來使能SPI系統。當SPE被置位了,四個相關引腳就賦予SPI功能來使用了:

  • 從機選定(SS)
  • 串行時鐘(SCK)
  • 主出/從入(MOSI)
  • 主入/從出(MISO)

SPI系統的核心是SPI數據寄存器。主機以及從機中的n位數據寄存器通過MOSI和MISO引腳鏈接起來形成了一個分佈式2n位寄存器。當執行了一個數據傳輸操作,這個2n位寄存器根據主機的S時鐘串行地移位n位,這樣數據就在主機和從機間進行了交換。寫入主機SPI數據寄存器的數據會輸出到從機,而從主機SPI數據寄存器中讀出的數據是來自從機的。

當SPTEF=1時讀取SPISR然後寫入SPIDR就把數據放入了數據發送寄存器。當傳輸完成並且SPIF爲0時,收到的數據會移入數據接收寄存器。這個數據寄存器在讀取的時候表現爲SPI數據接收寄存器而在寫入時表現爲SPI數據發送寄存器。讀數據緩存與寫數據發送寄存器使用共享的SPI數據寄存器地址。

SPI控制寄存器1(SPICR1)中的時鐘相位控制位(CPHA)和時鐘極性控制位(CPOL)指定SPI系統使用四種可能的格式中的哪一個。CPOL位簡單地指定時鐘是否反相。CPHA位則通過指定在奇數SCK邊沿還是偶數SCK邊沿採樣來適應兩種不同的基礎協議(見4.3“傳輸格式”)。

可以配置SPI爲主機或者從機。當SPI控制寄存器1中的MSTR位被置位,就選擇了主機模式,否則爲從機模式。

注意:
當接收移位寄存器內存在掛起的字節時,如果改變CPOL或者MSTR位會導致掛起的字節丟失,要避免這種情況發生。

主機模式

當MSTR位被置位,則SPI運行在主機模式。只有一個主機SPI模塊可以發起傳輸。傳輸是由寫入主SPI數據寄存器開始的。如果移位寄存器空了,數據就會立刻傳輸到移位寄存器。數據會在串行時鐘的控制下從MOSI引腳移位輸出。

  • 串行時鐘
    SPI波特率寄存器中的SPR2、SPR1和SPR0波特率選擇位聯合SPPR2、SPPR1和SPPR0波特率預選位一起控制着波特率生成器並決定傳輸的速率。SCK引腳是SPI的時鐘輸出。通過SCK引腳,主機的波特率生成器控制着從機外設的移位寄存器。
  • MOSI、MISO引腳
    在主機模式下,串行數據數據輸出引腳(MOSI)和串行數據輸入引腳(MISO)的功能是由SPC0和BIDIROE控制位決定的。
  • SS 引腳
    如果MODFEN和SSOE被置位了,SS 引腳就被配置爲從機選定輸出。SS 輸出信號會在每次傳輸期間變低而在空閒狀態下變高。
    如果MODFEN被置位而SSOE爲0,SS 引腳就被配置爲輸入以探測模式故障錯誤。如果SS 輸入信號被拉低,說明發生了模式故障,有另一個主機試圖驅動MOSI和SCK線。這種情況下,SPI會通過清零MSTR位並禁用從機輸出緩存MISO(或在單向雙向模式下的SISO)立刻切換到從機模式。所以最後所有的輸出都被禁用,SCK、MOSI和MISO變爲了輸入。如果在傳輸過程中發生了模式故障時,傳輸就會被拋棄,SPI被強制進入空閒狀態。
    這次模式故障錯誤還會置位SPI狀態寄存器(SPISR)中的模式故障標誌位(MODF)。如果當MODF標誌位被置位時SPI中斷使能位(SPIE)爲1,那麼就會發出SPI中斷序列請求。
    當主機模式下寫入了SPI數據寄存器,會有半個SCK週期的延遲。延遲之後主機內的SCK就啓動了。剩下的傳輸過程有輕微的不同,取決於SPI控制寄存器內的SPI時鐘相位位CPHA確定的時鐘格式(見4.3“傳輸格式”)。
注意:
在主機模式下改變CPOL、CPHA、SSOE、LSBFE、XFRW、MODFEN、SPC0、BIDIROE(當SPC0=1)、SPPR2-SPPR0 和 SPR2-SPR0位會導致進行中的傳輸被拋棄並強迫SPI進入空閒狀態。異地的從機無法探測到這個狀況,因此主機必須確保異地從機回到空閒狀態。

從機模式

當SPI控制寄存器內的MSTR位爲0時,SPI就運行在從機模式下。

  • 串行時鐘
    在從機模式下,SCK是來自主機的SPI時鐘輸入。
  • MISO、MOSI引腳
    在從機模式下,串行數據數據輸出引腳(MISO)和串行數據輸入引腳(MOSI)的功能是由SPI控制寄存器2中的SPC0和BIDIROE控制位決定的。
  • SS 引腳
    SS 引腳是從機選定輸入。在數據傳輸開始前,從機SPI的SS 引腳必須爲低電平而且要一直保持到傳輸完成。如果 SS 變爲高電平,SPI就強制進入空閒狀態。
    SS 輸入信號還控制着串行數據輸出引腳,如果SS爲高電平(未被選擇),串行數據輸出引腳就是高阻抗的,反之,由SPI數據寄存器的第一個位來驅動串行數據輸出引腳。同樣的,如果從機未被選擇(SS 爲高電平),那SCK輸入信號就會被忽略,SPI移位寄存器內不會發生內部移位。
    SPI也有單線雙向的功能,一些SPI外設只能夠以從機模式接收SPI數據。對於這些簡單的設備,沒有串行數據輸出引腳。
注意:
當使用了有單線雙向功能的外設,注意不要同時啓用兩個串行輸出驅動同一系統從屬的串行數據輸出線的接收器。

只要不超過一個從機設備驅動系統從機的串行數據輸出線,就可以使多個從機同時收到相同的主機的傳輸來的數據,儘管主機不會收到所有從機的返回信息。

如果SPI控制寄存器1中的CPHA位爲0,SCK上的奇數次邊沿會導致串行數據輸入引腳上的數據被鎖存。偶數次邊沿導致之前從串行數據輸入引腳上鎖存的數據在SPI移位寄存器內進行移位,移位方向取決於LSBFE位。

如果CPHA位爲1,SCK上的偶數次邊沿會導致串行數據輸入引腳上的數據被鎖存。奇數次邊沿導致之前從串行數據輸入引腳上鎖存的數據在SPI移位寄存器內進行移位,移位方向取決於LSBFE位。

當CPHA位爲1,第一個邊沿被用於把第一個數據位輸出到串行數據輸出引腳。當CPHA爲0並且SS 輸入信號爲低電平(即選定了從機),SPI數據中的首個位用於驅動串行數據輸出引腳。在第n次移位後,認爲傳輸完成,收到的數據被傳送進SPI數據寄存器。爲了通知傳輸完成,SPI狀態寄存器內的SPIF標誌位被置位。

注意:
在從機模式下改變CPOL、CPHA、SSOE、LSBFE、MODFEN、SPC0、BIDIROE(當SPC0=1)會導致進行中的傳輸失敗,必須避免。

傳輸格式

在SPI傳輸期間,數據是被同時傳送(串行移位出)和接收(串行移位進)的。串行時鐘(SCK)驅動兩條串行數據線上的信息的移位和採樣的同步。從機選定線允許選擇單個從機SPI設備;未被選定的從機設備會忽略SPI總線活動。你可以選擇使用從機選定線來實現多主機總線爭奪機制。

主/從傳輸框圖
圖 11.主/從傳輸框圖

時鐘相位和極性控制

應用軟件可以使用SPI控制寄存器1中的兩個位來選擇四種串行時鐘相位和極性的組合之一。

CPOL時鐘相位控制位指定高有效或低有效時鐘,對於傳輸格式沒有重要影響。

CPHA時鐘相位控制位指定兩種基本傳輸格式之一。

主機和對應從機的時鐘相位和極性控制應該完全一致。在某些情況下,相位和極性會根據通信對象而改變,這樣一個主機就可以與不同傳輸格式的外設從機進行通信了。

CPHA=0傳輸格式

SCK線的首個邊沿用於鎖存從機的首個數據位給主機以及鎖存主機的首個數據位給從機。對於一些外設,從機一被選定就可以從從機的數據輸出引腳得到從機數據的首個數據位。這種格式下,首個SCK邊沿需要在SS 變低後延遲半個週期。

半個SCK週期後,SCK線上出現第二個邊沿。當出現這第二個邊沿時,之前從串行數據輸入引腳上鎖存的值被移位入SPI移位寄存器,移位方向取決於LSBFE位。

在這第二個邊沿後,SPI主機數據的下一個位被傳送到主機的串行輸出引腳即從機的串行輸入引腳。這個過程會重複2n次SCK線的邊沿,每個奇數次邊沿鎖存數據,偶數次邊沿移位數據。

數據接收是雙緩衝的。在傳輸中,數據被串行地移位進SPI移位寄存器;在最後一個位傳輸完成後,數據被傳輸進並行SPI數據寄存器。

在2n次SCK邊沿後:

  • 之前在主機SPI數據寄存器中的數據現在應該在從機的數據寄存器中,反之亦然。
  • SPI狀態寄存器中的SPIF標誌位被置位,表明傳輸過程已經完成。

圖12是當CPHA=0時SPI傳輸的一張時序圖。同時給出了當CPOL=0和1時的SCK波形。圖表既是主機的時序圖也是從機的,因爲主機和從機的SCK、MISO和MOSI引腳是直接連在一起的。MISO信號線是從機的輸出,MOSI信號線是主機的輸出。主機的SS引腳必須是高電平或者重配置爲與SPI無關的通用目的輸出。

SPI時鐘格式0(CPHA=0),8位數據傳輸寬度
圖 12.SPI時鐘格式0(CPHA=0),8位數據傳輸寬度(XFRW = 0)

SPI時鐘格式0(CPHA=0),16位數據傳輸寬度
圖 13.SPI時鐘格式0(CPHA=0),16位數據傳輸寬度(XFRW = 1)

在從機模式下,如果在相繼的傳輸間沒有將 SS 線拉高,那麼之前的數據就不會傳輸進SPI數據寄存器,這樣只會傳輸最後一個收到的數據。如果在相繼的傳輸間SS 線持續拉高了至少最小空閒時間(半個SCK週期),那數據就能正常傳輸給SPI數據寄存器。

在主機模式下,只要使能了從機選定輸出,SS 線在相繼的傳輸間總是會被持續拉高了至少最小空閒時間。

CPHA=1傳輸格式

一些外設要求要先有一個SCK邊沿使得首個數據位在數據輸出引腳上有效,然後在第二個邊沿將數據鎖存進系統。在這種格式下,首個SCK邊沿是通過在n週期傳輸的開始設置CPHA位來發起的。

首個SCK邊沿會在半個SCK時鐘週期同步延遲後立即出現。這首個邊沿會命令從機傳輸它的首個數據位到主機的串行數據輸入引腳上。

半個SCK週期後,SCK引腳上出現第二個邊沿。這是主機和從機的鎖存邊沿。

當第三個邊沿出現時,之前從串行數據輸入引腳上鎖存的值被移位入SPI移位寄存器,移位方向取決於LSBFE位。這個邊沿之後,主機會把其數據的下一個數據位輸出到從機的串行輸入引腳上。

這個過程會在SCK線上重複2n次邊沿,每個偶數次邊沿鎖存數據,奇數次邊沿移位數據。

數據接收是雙緩衝的。在傳輸中,數據被串行地移位進SPI移位寄存器;在最後一個位傳輸完成後,數據被傳輸進並行SPI數據寄存器。

在2n次SCK邊沿後:

  • 之前在主機SPI數據寄存器中的數據現在應該在從機的數據寄存器中,反之亦然。
  • SPISR中的SPIF標誌位被置位,表明傳輸過程已經完成。

圖14展示了當CPHA=1時兩個時鐘的變化。圖表既是主機的時序圖也是從機的,因爲主機和從機的SCK、MISO和MOSI引腳是直接連在一起的。MISO信號線是從機的輸出,MOSI信號線是主機的輸出。SS是給從機的從機選定輸入。主機的SS 引腳必須是高電平或者重配置爲與SPI無關的通用目的輸出。

SPI時鐘格式1(CPHA=1),8位數據傳輸寬度
圖 14.SPI時鐘格式1(CPHA=1),8位數據傳輸寬度(XFRW = 0)

圖 14.SPI時鐘格式1(CPHA=1),16位數據傳輸寬度
圖 15.SPI時鐘格式1(CPHA=1),16位數據傳輸寬度(XFRW = 1)

在相繼的傳輸間,SS 線可以保持低電平(可以鎖定爲低電平)。這個格式有時在那種只有一個固定主機和一個固定從機驅動MISO數據線的系統中更受歡迎。

  • 主機模式下的背靠背傳輸
    在主機模式下,如果一個傳輸已經完成並且新的數據進入了SPI數據寄存器,這個數據就會立刻發送出去,不用附加最小空閒時間。

SPI中斷請求標誌位(SPIF)對主機和從機模式是一致的。SPIF會在最後一個SCK邊沿之後半個SCK週期被置位。

SPI波特率生成

波特率的生成包含一系列分頻步驟。SPI波特率寄存器中的6個位(SPPR2、SPPR1、SPPR0、SPR2、SPR1和SPR0)決定了SPI模塊時鐘的分頻係數,分頻係數直接決定了SPI的波特率。

SPI時鐘率由波特率預選位(SPPR2-SPPR0)和波特率選擇位(SPR2-SPR0)的值確定。SPI模塊時鐘分頻係數的公式如下:

比如:當所有位都是0(默認),SPI模塊時鐘直接除以2。當選擇位(SPR2-SPR0)是001,預選位(SPPR2-SPPR0)是000,模塊時鐘分頻係數變爲4。當選擇位爲010,模塊時鐘分頻係數變爲8。

比如:當預選位爲001,由選擇位確定的分頻係數乘了2倍。當預分頻位爲010,分頻係數乘了3。表 7給出了在25MHz總線時鐘下所有的可能性。這兩個係數使得時鐘能夠不按2的冪數來分頻,實現了其他波特率,比如除以6,除以10等。

只有SPI在主機模式下並且發生了串行傳輸時纔會激活波特率生成器。在其他情況下,分頻器會被禁用以降低 IDD 電流。

注意:
參閱這個數據手冊的電氣章節的SPI電氣規範來得知允許的最小波特率。

特殊特性

大SS輸出

SS 輸出會自動地在傳輸期間驅動SS引腳到低電平以選定外部設備並在空閒時驅動其爲高電平以取消選定外部設備。如用到SS,則連接SS輸出引腳到外部設備的SS輸入引腳上。

SS輸出只在SPI在主機模式下正常運作時有用,通過如表3中所述置位SSOE和MODFEN位。

當啓用了SS輸出,模式故障特性就被禁用了。

注意:
當在多主機系統中使用SS輸出特性時要特別小心,因爲模式故障特性無法用於探測主機間的系統錯誤。

單線雙向模式(MOMI或SISO)

當置位了SPI控制寄存器2中的SPC0位時就選擇了單線雙向模式(見表11)。在這種模式下,SPI只使用一條串行數據引腳與外部設備連接。MSTR位決定了使用哪一條引腳。對於主機模式,MOSI引腳成爲了串行數據I/O(MOMI)引腳;對於從機模式,MISO引腳成爲了串行數據I/O(SISO)引腳。SPI系統在主機模式下不使用MISO引腳,在從機模式下不使用MOSI引腳。

表 11.普通模式與單線雙向模式

每個串行I/O引腳的方向取決於BIDIROE位。如果引腳被配置爲輸出,來自移位寄存器的串行數據就會驅動引腳。這個引腳同時也是移位寄存器的串行輸入。

  • SCK是主機模式的輸出以及從機模式的輸入。
  • SS是主機模式的輸出或輸入,但卻總是從機模式的輸入。
  • 單線雙向模式不會影響SCK和SS的功能。
注意:
在單線雙向主機模式下,當啓用了模式故障,MISO和MOSI引腳都可能被SPI佔用,儘管在這個模式下通常使用MOSI來傳輸而不使用MISO。如果發生了模式故障,SPI會自動地切換到從機模式。這樣,MISO就被SPI使用,而MOSI就不用了。如果MISO引腳用於其他目的,一定要考慮這個。

錯誤狀況

SPI有一種錯誤狀況:

  • 模式故障錯誤

模式故障錯誤

當SPI被配置爲主機,如果SS輸入引腳被拉低,表明發生了系統錯誤,有不止1個主機同時想驅動MOSI和SCK線。一般情況下是不允許發生這種事情的,如果MODFEN位爲1,SPI狀態寄存器中的MODF位會被自動置位。

在SPI是主機模式而MODFEN位爲0的特殊情況下,SS 引腳不由SPI使用。在這種特殊情況下,模式故障功能停用,MODF會保持爲0。在SPI系統是從機的情況下,SS引腳是專用的輸入引腳。從機模式下不會發生模式故障錯誤。

如果發生了模式故障錯誤,SPI會切換到從機模式,除非從機輸出緩存被禁用。這樣SCK、MISO和MOSI引腳會強迫爲高阻抗輸入以避免與另一個輸出設備發生衝突。在進行中的傳輸會被拋棄,SPI強制進入空閒狀態。

如果配置爲主機模式的SPI系統在單線雙向模式下發生模式故障錯誤,MOMI(單線雙向模式下的MOSI)的輸出使能如果是1的話會被清零。配置爲從機模式的SPI系統在單線雙向模式下不會發生模式故障錯誤。

模式故障標誌位可以通過讀取SPI狀態寄存器(MODF爲1)然後寫入SPI控制寄存器1來自動地清零。如果模式故障標誌位被清零,SPI就會再次變成普通的主機或從機。

注意:
如果在發生模式故障錯誤的時候接收移位寄存器中有掛起的數據字節,那這個字節會丟失。

低能耗模式選項

Run模式下的SPI

在run模式下,如果SPI控制寄存器中的SPI系統使能(SPE)位爲0,則SPI系統處於一種低能耗、禁用狀態。SPI寄存器仍然可以訪問,但是模塊的時鐘是禁用的。

Wait模式下的SPI

Wait模式下SPI的運行取決於SPI控制寄存器2中的SPISWAIT位。

  • 如果SPISWAI爲0,SPI當CPU在wait模式下正常運行
  • 如果SPISWAI爲1,SPI時鐘生成會暫停,SPI模塊當CPU在wait模式下進入節能狀態。
    • 如果置位了SPISWAI並且SPI被配置爲主機,任何進行中的傳輸和接收都會在進入wait模式的時候停止。當退出wait模式時恢復傳輸和接收。
    • 如果置位了SPISWAI並且SPI被配置爲從機,如果來自主機的SCK繼續運作,進行中的傳輸和接收都會繼續。這會保持從機與主機和SCK的同步。
      如果主機在從機處於wait模式時傳輸了多個字節,從機將繼續發送與在等待模式開始時一樣的字節。除非從機正在發送的是從主機接收到的最後一個字節,它將繼續發送每個之前的主機字節。
注意:
如果當從機在wait或者stop模式下還想要從主機接收數據的話,要特別小心。儘管移位寄存器會繼續工作,SPI的其它部分都關閉了(即不會產生SPIF中斷直到退出stop或wait模式)。而且,來自移位寄存器中的字節不會被拷貝進SPIDR寄存器直到從機SPI已退出wait或stop模式。在從機模式下,在接收移位寄存器中掛起的收到的字節會在進入wait或stop模式時丟失。當且僅當在傳輸中進入或退出wait模式,會生成一份SPIF標誌位和SPIDR的拷貝。如果從機在空閒模式下進入wait模式並在空閒模式下退出wait模式,SPIF和SPIDR拷貝都不會發生。

Stop模式下的SPI

Stop模式依賴於系統。當模塊時鐘被禁用(保持高電平或低電平),SPI進入停止模式。如果當CPU進入stop模式時,SPI處於主機模式下並且正在交互數據,傳輸會被凍結直到CPU退出stop模式。在恢復後,去或來自外部SPI的數據能被正確地交換。在從機模式下,SPI將與主機保持同步。

stop模式不依賴於SPISWAI位。

重置

寄存器和信號引腳的重置值在“內存映射與寄存器定義”中詳細給出。

  • 如果從機在重置後還沒有數據寫入SPIDR就發生了數據傳輸,它將傳輸無用數據,或者重置前最後一次從主機收到的數據。
  • 在重置後從SPIDR讀取的數據總是0。

中斷

SPI只在被使能後(SPICR1中的SPE位爲1)組織中斷請求。以下是關於SPI是怎麼生成一個請求以及MCU是怎麼獲得這請求的描述。中斷向量偏移和中斷優先級依賴於芯片。

中斷標誌位MODF、SPIF和SPTEF以 邏輯或 來生成中斷請求。

MODF

當主機探測到SS 引腳上的錯誤時,發生了MODF。主機SPI需要配置才能啓用MODF特性(見表3)。在MODF置位後,當前傳輸被拋棄,下面的位會改變。

  • MSTR = 0,SPICR1中的主機位重置。

MODF中斷反映於狀態寄存器的MODF標誌位。清零這個標誌位也將清除中斷。這個中斷將在MODF標誌位爲1時保持激活。MODF的自動清零序列描述在3.2.4 “SPI狀態寄存器(SPISR)”中。

SPIF

SPIF發生於新數據被接收並拷貝進SPI數據寄存器時。在SPIF置位後,它不會被清零直到被處理。SPIF的自動清零序列描述在3.2.4 “SPI狀態寄存器(SPISR)”中。

SPTEF

SPIEF發生於SPI數據寄存器準備好接收新數據時。在SPIEF置位後,它不會被清零直到被處理。SPIEF的自動清零序列描述在3.2.4 “SPI狀態寄存器(SPISR)”中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章