註: 本文為中文翻譯,原文請見底下網址:
http://www.mikroe.com/eng/chapters/view/7/chapter-6-serial-communication-modules/
TOC Introduction Ch. 1 Ch. 2 Ch. 3 Ch 4. Ch. 5 Ch. 6 Ch. 7 Ch. 8 Ch. 9 App. A App. B App. C
Chapter 6: Serial Communication Modules
EUSART
增強型通用同步非同步收發器(EUSART)模組是一個序列 I/O 通訊周邊,又稱為序列通訊介面 (Serial Communications Interface, SCI)。它包含時脈產生器 (clock generators)、移位暫存器 (shift registers)和資料緩衝區 (data buffers) 等獨立於設備的必要設施以執行序列資料的傳送。如其名稱所示,除了使用時脈做同步之用外,這個模組也可以建立非同步的連線,這使得它在某些應用無可取代。
例如,在很難或不可能提供時脈和資料傳輸給特殊通道的情況下 (例如,無線電遙控或紅外線),EUSART 模組便扮演了一種方便的解決方案。
Fig. 6-1 Remote Control and Plane
整合在 PIC16F887 之內的 EUSART 系統具有下列特性:
● 全雙工 (Full duplex) 非同步發送與接收;
● 可程式化 8 或 9 位元字元長度 (Programmable 8- or 9-bit character length);
● 9 位元模式下的位址偵測 (Address detection in 9-bit mode);
● 輸入緩衝溢出錯誤檢查 (Input buffer overrun error detection); 及
● 同步模式下的半雙工 (Half-duplex) 通訊 (master or slave)。
EUSART 非同步模式
EUSART 發送與接收資料使用標準的不歸零格式 (non-return-to-zero format, NRZ)。如下圖所示,這種模式不使用時脈訊號,其傳送的資料格式非常的簡單:
Fig. 6-2 EUSART Asynchronous Mode
簡而言之,每個資料會以下列方式傳送:
● 在閒置狀態 (idle state) 下,資料線有高邏輯電位 (1);
● 每個資料傳輸以 START 位元開始,該位元永遠為 0;
● 每個資料是 8 或 9 位元寬 (最低有效位元先傳送, LSB bit first); 及
● 每個資料傳輸以 STOP 位元結束,該位元永遠為 1。
EUSART 非同步發射器
Fig. 6-3 EUSART Asynchronous Transmitter
為了啟動經由 EUSART 模組的資料傳輸功能,有必要對 EUSART 模組做一些設定以把它當作一個發射器使用。換句話說,必須定義下列位元的狀態:
● TXEN = 1 – EUSART 發射器的啟用方法是透過設定 TXSTA 暫存器的這個位元;
● SYNC = 0 – EUSART 設定成非同步模式的方法是透過清除 TXSTA 暫存器的這個位元;及
● SPEN = 1 – 藉由設定 RCSTA 暫存器的這個位元 (Serial Port Enabled),EUSART 會被啟用,而且 TX/CK 腳位會被自動設置成輸出。如果 TX/CK 腳位同時用來做類比功能,必須清除 ANSEL 暫存器對應的位元以停用類比功能。
EUSART 發射器的核心是 TSR 移位暫存器,使用者不能直接存取 TSR 暫存器。為了開始傳輸,必須透過設定 TXSTA 暫存器的 TXEN 位元以啟用發射器。要傳送的資料應該要寫到 TXREG 暫存器,這會引發下列一系列的事件:
● 位元組會被立即從 TXREG 暫存器傳送到 TSR 移位暫存器;
● TXREG 暫存器還是空的,PIR1 暫存器的 TXIF 旗號會豎著以表示這個狀態。如果 PIE1 暫存器的 TXIE 位元有設定的話,會產生一個中斷。此外,不管有無啟用中斷,TXIF 旗號都會被設定。還有,TXIF 旗號沒辦法用軟體清除,而是要透過寫入新資料到 TXREG 暫存器才能清除;
● 控制電子會以內部時脈有韻律的往 TX腳位 "推" 資料: START位元 (0) … data … STOP 位元 (1);
● 當最後一個位元離開 TSR 暫存器的時候,TXSTA 暫存器的 TRMT 位元會被自動設定; 及
● 如果 TXREG 暫存器在這其間收到新的字元資料,在前一個字元的 STOP 位元傳輸完畢後,整個程序會立即重覆。
傳送 9 位元資料的啟用方法是透過設定 TXSTA 暫存器的 TX9 位元。TXSTA 暫存器的 TX9D 位元是第 9 個資料位元,且為最高有效位元 (Most Significant data bit)。在傳輸 9 位元的資料時,在把 8 個最低有效位元寫到 TXREG 暫存器之前,必須先寫入 TX9D 資料位元。整個 9 個位元的資料會在 TXREG 寫入完畢時被立即傳送到 TSR 暫存器。
EUSART 非同步接收器
Fig. 6-4 EUSART Asynchronous Receiver
類似 EUSART 發射器的啟動方法,為了啟用接收器,必須定義下列位元:
● CREN = 1 - EUSART 接收器的啟用方法是透過設定 RCSTA 暫存器的這個位元;
● SYNC = 0 - EUSART 設定成非同步模式的方法是透過清除 TXSTA 暫存器的這個位元; 及
● SPEN = 1 - 藉由設定 RCSTA 暫存器的這個位元,EUSART 會被啟用,而且 RX/DT 腳位會被自動設置成輸入。如果 RX/DT 腳位同時用來做類比功能,必須清除 ANSEL 暫存器對應的位元以停用類比功能。
當必要的步驟完成後,而且偵測到 START 位元時,資料會透過 RX 腳位被傳送到 RSR 移位暫存器。當收到 STOP 位元後,會發生下列事情:
● 資料會自動被送到 RCREG 暫存器 (如果 RCREG 是空的);
● RCIF 旗號會被設定,而且如果 PIE1 暫存器的 RCIE 位元有啟用的話,就會產生中斷。類似發射器,RCIF 旗號只能用軟體清除,亦即讀出 REREG 暫存器的內容以清除 RCIF 旗號。請牢記在心,RCREG 是一個兩個字元的 FIFO 記憶體 (First In, First Out),這允許同時接受兩個字元;
● 如果 RCREG 暫存器已被佔用 (含有兩個 bytes) 而且移位暫存器也偵測到新的 STOP 位元,溢出位元 OERR 將會被設定起來。在這種情況下,一個新來的資料會遺漏掉,而且 OERR 位元必須透過軟體清除才行,方法是清除並重設 CREN 位元.
注意: 只要 OERR 位元一直被豎著,就不能夠接收新的資料;● 如果 STOP 位元是 0,RCSTA 暫存器偵測接收錯誤 (receive error) 的 FERR 位元會被設定; 及
● 要接收 9 位元的資料,必須設定 RCSTA 暫存器的 RX9 位元。
接收錯誤偵測 (Receive Error Detection)
微控制器可以自動偵測兩種錯誤。第一種稱為訊框錯誤 (Framing error),而且發生在當接收器無法在預期的時間偵測到 STOP 位元的時候。這類錯誤會透過 RCSTA 暫存器的 FERR 位元表示。如果這位元有被設定,代表最後收到的資料可能是不正確的。知道這幾件事是很重要的:
● Framing error 本身不會產生中斷;
● 如果 FERR 位元有被設定,表示最後收到的資料有錯誤;
● Framing error (FERR 位元為 1 時) 不會阻止接收新資料;
● FERR 位元的清除方法是透過讀取收到的資料 (讀出 RCREG 的內容),這代表在讀取資料前必須完成檢查工作; 及
● FERR 位元不能由軟體清除。如果有需要,可以透過清除 RCSTA 暫存器的 SPEN 位元來清除 FERR 位元。這會同步導致整個 EUSART 系統重置 (reset)。
另一種錯誤稱作溢出錯誤 (Overrun Error)。接收 FIFO 可以容納兩個字元,假如收到第三個字元就會產生溢出錯誤 (Overrun Error)。簡單地說,因為沒有空間可以給另一個位元組使用,錯誤是無可避免的!當發生這種情況時,RCSTA 暫存器的 OERR 位元便會被設定。結果是:
● 已經儲存在 FIFO 暫存器 (兩個 bytes) 的資料可以正常的讀取;
● 直到 OERR 位元被清除前,不會有額外的資料會被接收進來;及
● 這個位元不能夠直接存取。要清除這個位元,必須清除 RCSTA 暫存器的 CREN 位元或者透過清除 RCSTA 暫存器的 SPEN 位元以重置整個 EUSART 系統。
接收 9 位元的資料
除了接受標準 8 位元的資料,EUSART 系統還支援接收 9 位元的資料。在發送端,第 9 個位元會被 "附加" 到原來的位元組,在 STOP 位元之前。在接收端,當 RCSTA 暫存器的 RX9 位元被設定時,第 9 個位元會自動被寫到 RCSTA 暫存器的 RX9D 位元。當整個位元組接收完時,使用者應當注意如何讀取這個位元組 – RX9D資料位元必須在讀取 RCREG 暫存裏的 8 個最低有效位元之前先讀出來。不然的話,第 9 個資料位元會被自動清除掉。
地址偵測 (Address Detection)
當 RCSTA 暫存器的 ADDEN 位元被設定時,EUSART 模組只能接收 9 位元的資料,而所有 8 位元的資料都將被忽略。雖然這似乎是一個限制,但這種模式允許在多個微控制器之間使用序列通訊。運作的原則很簡單。主設備 (master device) 傳送9位元的資料,該 9 位元的資料代表某個微控制器。所有從屬微控制器 (slave microcontroller) 共享傳輸線,都會接收這份資料。當然,它們每個都必須設定 ADDEN 位元,因為這個位元啟用地址偵測 (Address dectection)。
在收到這個資料後,從屬微控制器檢查地址是否與它自己的匹配。在軟體內部檢查到匹配時,必須透過清除其 ADDEN 位元以停用地址偵測。主設備 (master device) 會繼續傳送 8 位元的資料。所有經過傳輸線的資料將只有 "認可的" EUSART 模組才會接收。在收到最後一個位元組後,從屬設備應當設定 ADDEN 位元以重新啟用地址偵測。
TXSTA 暫存器
RCSTA 暫存器
EUSART 鮑率產生器 (BRG)
如果你仔細觀察非同步 EUSART 接收器或傳送器方塊圖,你會發現,在兩種情況中,都是使用來自本地端的 BRG 計時器時脈訊號來做同步。同一個時脈也用於同步模式:
這個由兩個 8 位元暫存器組成的計時器構成一個 16 位元的暫存器。
Fig. 6-10 EUSART Baud Rate Generator (BRG)
寫到這兩個暫存器的數值決定鮑率 (baud rate)。此外,TXSTA 暫存器的 BRGH 位元和 BAUDCTL 暫存器的 BRGH16 位元也都影響時脈頻率 (clock frequency)。
用來決定 baud rate 的公式載於下表。
下表包含為了獲得標準的 baud rates 所應寫到 SPBRG 16 位元暫存器以及應指定給 SYNC, BRGH 和 BRGH16 位元的值。
用來決定 baud rate 的公式為:
Table 6-2 Determining Baud Rate
BAUDCTL 暫存器
簡而言之:
要經由非同步 EUSART 通訊傳送資料:
1. 應當透過 BRGH 位元 (TXSTA 暫存器) 和 BRGH16 位元 (BAUDCTL暫存器) 以及 SPBRGH 和 SPBRG 暫存器決定想要的 baud rate;
2. 應當清除 SYNC 位元 (TXSTA 暫存器),而且應當設定 SPEN 位元 (RCSTA 暫存器) 以啟用序列埠;
3. 在做 9 位元的資料傳輸時,應當設定 TXSTA 暫存器的 TX9 位元;
4. 資料傳輸的啟用方法是透過設定 TXSTA 暫存器的 TXEN 位元。PIR1 暫存器的 TXIF 會自動被設定;
5. 如果需要 TXEN 引發中斷,INTCON 暫存器的 GIE 和 PEIE 位元應當設定;
6. 在做 9 位元的資料傳輸時,第 9 個資料位元應當寫到 TXSTA 暫存器的 TX9D 位元; 及
7. 傳輸的開始是透過寫資料到 TXREG 暫存器。
要經由非同步 EUSART 通訊接收資料:
1. 應當透過 BRGH 位元 (TXSTA 暫存器) 和 BRGH16 位元 (BAUDCTL 暫存器) 以及 SPBRGH 和 SPBRG 暫存器決定想要的b aud rate;
2. 應當清除 SYNC 位元 (TXSTA 暫存器),而且應當設定 SPEN 位元 (RCSTA 暫存器) 以啟用序列埠;
3. 如果需要資料接收引發中斷,PIE1 暫存器的 RCIE 位元和 INTCON 暫存器的 GIE 和 PEIE 位元都應當設定;
4. 在做 9 位元的資料接收時,應當設定 RCSTA 暫存器的 RX9 位元;
5. 資料接收的啟用方法是透過設定 RCSTA 暫存器的 CREN 位元;
6. 必須讀取 RCSTA 暫存器以取得在傳輸期間可能已經發生的錯誤。在做 9 位元的資料接收時,第 9 個資料位元將被儲存在 RCSTA 這個暫存器; 及
7. 放在 RCREG 暫存器的 8 位元資料應當被讀出。
要設定地址偵測模式 (Address Detection Mode):
1. 應當透過 BRGH 位元 (TXSTA 暫存器) 和 BRG16 (BAUDCTL 暫存器) 和 SPBRGH 與 SPBRG 暫存器設定 Baud rate;
2. 應當清除 SYNC 位元 (TXSTA 暫存器),而且應當設定 SPEN 位元 (RCSTA 暫存器) 以啟用序列埠;
3. 如果需要資料接收引發中斷,PIE1 暫存器的 RCIE 位元和 INTCON 暫存器的 GIE 和 PEIE 位元都應當設定;
4. 應當設定 RCSTA 暫存器的 RX9 位元;
5. 應當設定 RCSTA 暫存器的 ADDEN 位元,這會啟用資料被當作地址 (address) 解釋;
6. 資料接收的啟用方法是透過設定 RCSTA 暫存器的 CREN 位元;
7. 在接收到 9 位元的資料後,緊接著 PIR1 的 RCIF 旗號將立即自動被設定。如果有啟用的話,會引發中斷;
8. 必須讀取 RCSTA 暫存器以取得在傳輸期間可能已經發生的錯誤。第 9 個資料位元 RX9D 會永遠被設定;
9. 放在 RCREG 暫存器的 8 位元資料應當被讀出。應當檢查這些位元的組合是否與預先定義的地址匹配,如果發生匹配,必須清除 RCSTA 暫存器的 ADDEN 位元,這會啟用進一步的資料接收。
主控同步串列埠模組 (Master Synchronous Serial Port Module)
MSSP 模組 (Master Synchronous Serial Port) 是微控制器內一個非常有用同時又最複雜的電路。它使得微控制器與其它周邊或者微控制器之間得以透過少數幾個輸入/輸出線路 (最多 2 或 3 根) 使用高速傳輸。因此,它通常用於連接微控制器到液晶顯示器 (LCD displays),A/D 轉換器,序列 EEPROM,移位暫存器 (shift registers) 等。這種類型的通訊主要的特性是它是同步的,而且適合用於單個主要裝置 (single master) 與一個或多個從屬裝置 (slaves) 的系統。一個 master 包含產生 baud rate 的必要電路,並且提供時脈給系統上的所有設備。Slaves 便得以不用考慮 (去除) 內部時脈的電路。MSSP 模組可以在兩種模式下運作:
● SPI 模式 (Serial Peripheral Interface)
● I²C模式 (Inter-Integrated Circuit)
如下圖所示,在需要建立序列通訊的場合,一個 MSSP 模組只扮演所需硬體的一半的角色,而另一半則位於與之交換資料的設備裏。雖然線路兩端的模組是一樣的,它們的模式本質上是不同的,這取決於它們是以 Master或 Slave 的角色運作。
如果要被程式化 (programmed) 的微控制器控制另一個設備或電路(周邊),它應該當作 master device。這樣的一個模組將在需要時產生時脈,亦即軟體需要接收與發送資料的時候。是否需要建立連線取決於 master。否則,如果要被程式化的微控制器是某個屬於複雜設備的周邊 (例如 PC),那邊它應該當作 slave device。這麼一來,它得永遠等待來自 master device 的資料傳送要求。
SPI 模式
SPI 模式允許同時發送與接收 8 位元的資料,使用 3 根輸入/輸出線路:
● SDO - Serial Data Out – 發送線路;
● SDI - Serial Data In – 接收線路; 及
● SCK - Serial Clock – 同步線路 (synchronization line)。
除了這三條線路,如果微控制與多個周邊設備交換資料,可能也得用到第 4 條線路 (SS),參考下圖。
SS - Slave Select – 額外的腳位,用於選擇指定的設備。它只在微控制器為 slave 模式的時候才作用,亦即當外部的 master device 需要與它交換資料的時候。
當在 SPI 模式下運作時,MSSP 模組總共使用 4 個暫存器:
● SSPSTAT 狀態暫存器;
● SSPCON 控制暫存器;
● SSPBUF 資料緩衝暫存器; 及
● SSPSR 移位暫存器 (不能直接存取)
前三個暫存器是可讀寫的,而且內容可以在任何時刻改變,而第 4 個暫存器不能直接存取,它用來把資料轉換成 "序列" 格式。
如下圖所示,SPI 模組的核心由兩個連接到接收、發送與同步腳位的暫存器組成。
Shift register (SSPSR) 直接連接到微控制器的腳位,用來做序列格式資料的傳輸。SSPRS 暫存器有輸入與輸出,並且負責從設備將資料移位進來或出去。換句話說,每當從輸入 (接收線路) 收到一個位元時,同時會往輸出 (發送線路) 移出一個位元。
SSPBUF 暫存器 (緩衝區) 是一塊暫存記憶體,用在接收的資料就緒前暫時保存寫到 SSPRS 暫存器的資料。在收滿 8 個位元的資料後,資料會被搬到 SSPBUF 暫存器。資料接收雙緩衝區 (SSPBUF) 允許得以開始接收下一個位元組,在讀取剛收到的資料前。在傳輸/接收資料的期間,任何寫入到 SSPBUF 的動作都會被忽略。由於是最常被存取的,從 programmer 的觀點看,SSPBUF 是最重要的暫存器。
也就是說,如果忽略模式的設定,經由 SPI 的資料傳輸其實指的是從這個暫存器讀取和寫入資料,而另一個 "技巧" 如移動暫存器的內容則是由硬體自動完成的。
簡單的說:
在起始 SPI前,必須指定許多選項:
● Master 模式 (SCK 腳位是時脈輸出);
● Slave 模式 (SCK 腳位是時脈輸入);
● 資料輸入的階段 (Data input phase) – 資料輸出時間的中間或結束 (SMP 位元);
● 時脈邊緣 (Clock Edge) (CKE 位元);
● Baud rate (只有 Master 模式才需要); 及
● Slave 選擇模式 (只有 Slave 模式才需要)。
步驟 1.
要傳送的資料應當寫到 SSPBUF 暫存器。在這之後,如果 SPI 模組以 master 模式運作,微控制器將緊接著執行下列 2, 3, 4 的步驟,如果 SPI 模組是以 Slave 模式運作,微控制器將不會執行這些步驟,一直到 SCK 腳位偵測到時脈訊號。
步驟 2.
資料被移到 SSPSR 暫存器,而 SSPBUF 暫存器的內容沒有被清除。
步驟 3.
與時脈訊號同步,資料被移位到輸出腳位 (MSB 位元優先),在此同時,暫存器會被來自輸入腳位的位元資料填滿。在 Master 模式下,微控制器自己會產生時脈,而 Slave 模式則使用外部時脈 (SCK 腳位)。
當收到 8 個位元的資料時,SSPSR 暫存器就滿了。它會透過設定 BF 和 SSPIF 位元來表示。收到的資料 (該位元組) 會自動從 SSPSR 暫存移到 SSPBUF 暫存器。由於經由序列通訊的資料傳輸是自動執行的,當資料在傳輸的時候,程式會正常的執行。在這種情況下,當一個 byte 傳輸完畢時,SSPIF 位元的功能是用來產生中斷。
最後,儲存在 SSPBUF 的資料準備就緒,而且可以隨時搬到其它暫存器。
I²C 模式
當微控制器必須與在同一個設備內的積體電路 (integrated circuit) 交換資料時,I²C mode (Inter IC Bus)就特別適合。它通常是另一個微控制器,或者特殊的、便宜的、屬於所謂 "智慧周邊元件 (smart peripheral components)" 的新一代積體電路 (記憶體、溫度感測器、即時時鐘 (real-time clocks) 等)。
類似 SPI 模式的序列傳輸,I²C 模式的資料傳輸也是同步的而且是雙向的 (bidirectional)。這一次資料傳輸只用到兩支腳位。它們是 SDA (Serial Data) 和 SCL (Serial Clock)腳位。使用者必須透過 TRISC 設置這兩支腳位為輸入或輸出。
可能沒辦法直接看到。不過,透過觀察特定的規則 (協定),I²C 模式最多可以讓 122 個不同的元件以相同方式連接在一起,而且只透過兩支很寶貴的 I/O腳位。簡單地說,一切是這樣運作的:用來同步雙方設備的時脈永遠由 master device(微控制器) 產生,而且其頻率直接影響 baud rate。有些設備允許最大 3, 4 MHz 的頻率 (所謂的高速 I²C Bus),不過大部份頻率限制在 100 KHz。最小的頻率則沒有什麼限制。
當 master 與 slave 元件透過時脈同步後,每個資料的交換永遠由 master 起始。一旦 MSSP 模組被啟用,它會等待 Start condition 的發生。首先,master device 經由 SDA 腳位送出 Start 位元 (邏輯 0),然後是挑選到的 slave device 的 7 位元的地址,最後送出需要對該設備寫入 (0) 或讀取 (1) 的位元。因此,跟著 start condition 之後,這 8 個位元會被移位的 SSPSR 暫存器。所有的 slave devices 共享同一條傳輸線,而且會同時收到第一個 byte,但它們之中只有一個地址會匹配。
Fig. 6-20 Master and Slave Configuration
一旦第一個 byte 被發送出去後(只有傳輸 8 個位元),master 會進入接收模式,並等待地址匹配的 slave device 的確認 (acknowledgment)。如果 slave device 發出確認資料 (1),資料傳輸就會繼續,直到master device (微控制器) 送出 STOP 位元。
這是兩個元件如何通訊的最簡單的解釋。如果需要,微控制器能夠控制更複雜的情況,當 1024 個不同的元件連接在一起並由幾個不同的 master device 共享的情況。這種裝置實際上很少見,也沒有需要深入討論。
下圖顯示 MSSP 模組在 I²C 模式下的方塊圖。
Fig. 6-22 MSSP Block Diagram in I²C Mode
MSSP 模組在作 I²C 通訊時用到 6 個暫存器 (如下列),其中有幾個顯示在上圖:
● SSPCON;
● SSPCON2;
● SSPSTAT;
● SSPBUF;
● SSPSR; 以及
● SSPADD
SSPSTAT 暫存器
SSPCON 暫存器
SSPCON2 暫存器
I²C 主控模式 (Master Mode)
最常見的情況是,微控制器當作 master 而周邊元件當作 slave。這就是為什麼這本書只涵蓋這種模式,而且只考慮 7 個位元的地址和一個微控制器 (一個 master device)。
為了啟用 MSSP 模組進入這種模式,必須做下列事情:
設定 baud rate(SSPADD 暫存器),關閉 slew rate 控制(透過設定 SSPSTAT 暫存器的 SMP 位元),並選擇 master 模式(SSPCON 暫存器)。在完成準備後,MSSP 模組便已啟用(SSPCON 暫存器:SSPEN 位元),使用者應該等待內部電子的訊號,即 PIR1 暫存器的 SSPIF 位元,這訊號代表一切就緒可以開始傳輸資料。
這個位元應當由軟體清除,在這之時,微控制器就準備好與周邊開始通訊。
I²C 主控模式的資料發送
每個在 SDA 腳位上的 clock condition 都是以邏輯 0 開始,發生於設定 SSPCON2 的 SEN 位元之後。即使啟用了,微控制器也必須等待一定的時間才能開始通訊。這就是所謂的 "Start condition",在這段期間會執行內部的準備與檢查工作。如果所有條件都滿足了,PIR1 暫存器的 SSPIF 位元會被設定起來,然後一旦載入資料到 SSPBUF 暫存器便立即開始資料的發送。
由於最大可以有 112 個積體電路共享同一條傳輸線,第 1 個資料位元組必須包含地址,這個地址只能與一台 salve device 匹配。每個元件都有它的地址,條列於適當的 datasheet 中。第 1 個資料位元組的第 8 個位元指定資料傳輸的方向,表示微控制器是要發送或接收資料。在目前的情況下,一切只關乎資料發送,因此第 8 個位元是邏輯 0(0)
當地址匹配時,微控制器必須等待確認資料位元 (acknowledge bit)。Slave device 透過清除 SSPCON2 暫存器的 ACKSTAT 位元以確認地址有匹配。如果地址有恰當匹配,後面所有的資料將以同樣的方式傳送。
資料傳輸的結束方法是透過設定 SSPCON2 暫存器的 SEN 位元。這個稱之為 STOP condition 的情況發生時,讓 SDA 腳位得以重新開始另一個時脈旅程: Start – Address – Acknowledge – Data – Acknowledge ….Data – Acknowledge – Stop!
I²C 主控模式的資料接收
資料接收的籌備工作與資料發送很像,只有一點不一樣,就是第一個位元組 (包含了地址) 的最後一個位元是邏輯 1。它指明 master 希望從指定 slave device 那邊接取資料。關於微控制器,會發生以下事件:
在內部的準備工作完成而且 START 位元也設定了之後,slave device 開始一次發送一個 byte。這些資料會被儲存在 SSPSR 暫存器裏。每個資料,在收滿 8 個位元的時候,會被放到 SSPBUF 暫存器,程式從 SSPBUF 暫存器讀取資料。透過讀取 SSPBUF 暫存器的內容,確認位元 (acknowledge bit) 會自動被設定,代表 master device 已準備好接收新的資料。
最後,類似資料發送,資料接收的結果是透過設定 STOP 位元:
Fig. 6-30 Data Reception in I²C Master Mode
Start - Address - Acknowledge - Data - Acknowledge .... Data - Acknowledge - Stop!
確認位元以這種脈衝的方式送到 slave device 手中。
鮑率產生器 (Baud Rate Generator)
為了做資料傳輸的同步,所有發生在 SDA 腳位上的事件必須與 master device 產生的時脈同步。這個時脈取決於微控制器的主要時脈,透過寫入數值到 SSPADD 暫存器而產生一個時脈,以及目前的 MSSP 模式。
I²C 模式的頻率取決於選用的石英晶體與 SPADD 暫存器。用來計算頻率的公式顯示於下圖:
有用的注意事項 ...
當微控制器與周邊元件通訊時,資料傳輸可能會因為某些原因而失敗。在這種情況下,建議檢查某些位元的狀態以釐清問題。實際上,這些位元的狀態是透過執行一個簡短的副程式,每當一個位元組發送和接收完成的時候 (只是為了以防萬一)。
WCOL (SPCON,7) – 當正在傳輸另一個資料的時候,如果你嘗試寫一個新的資料到 SSPBUF 暫存器,WCOL 位元會被設定起來,而且 SSPBUF 暫存器的內容仍然不會改變。寫入並沒有發生。在這之後,WCOL 位元必須在軟體裏清除。
BF (SSPSTAT,0) – 在發送模式下,當 CPU 寫入資料到 SSPBUF 暫存器時,這個位元會被設定,並且會保持設定的狀態直到位元組被 SSPSR 移位出去之後。在接收模式下,當資料或地址載入到 SSPBUF 暫存器的時候,這個位元會被設定,當 SSPBUF 的內容被讀出時這個位元會被清除。
SSPOV (SSPCON,6) – 在接收模式下,當新的資料經由序列通訊被 SSPSR 暫存器接收進來,而前一個收到的資料卻還沒從 SSPBUF 暫存器讀出時,這個位元會被設定起來。
SDA and SCL Pins – 當 SSP 模組啟用的時候,這些腳位變成開汲極輸出 (Open Drain outputs)。這表示這些腳位必須連接到電阻,另一方面,電阻則連接到正電壓源。
Fig. 6-32 Open Drain Output Resistors
簡單的說:
為了建立 I²C 模式的序列通訊,應該做下列事情:
設定模組與傳送地址:
● 用來決定 baud rate 的值應當寫到 SSPADD 暫存器;
● 應當透過設定 SSPSTAT 暫存器的 SMP 位元關閉 slew rate 控制;
● 為了選擇 Master 模式,應當將二進位值 1000 寫到 SSPCON1 暫存器的 SSPM3-SSPM0 位元;
● 應當設定 SSPCON2 的 SEN 位元 (START condition);
● 在 START condition 結束後,當模組就緒時 SSPIF 位元會被自動設定,應該把這個位元清除;
● 應當將 Slave 的地址寫到 SSPBUF 暫存器;及
● 資料發送出去時,當收到來自 slave device 的確認位元時,SSPIF 位元 (中斷) 會被自動設定。
資料發送:
● 要發送的資料應該寫到 SSPBUF 暫存器;
● 資料發送出去時,在收到來自 slave device 的確認位元後,SSPIF位元 (中斷) 會被自動設定;及
● 為了通知 slave device 已完成傳輸,必須透過設定 SSPCON 暫存器的 PEN 位元以啟動 STOP condition。
資料接收:
● 為了啟用接收,應該設定 SSPCON2 暫存器的 RSEN 位元;
● SSPIF 位元表示收到資料。當資料從 SSPBUF 暫存器被讀出時,應該設定 SSPCON2 暫存器的 ACKEN 位元以啟用發送確認位元的功能;及
● 為了通知 slave device 已完成傳輸,必須透過設定 SSPCON 暫存器的 PEN 位元以啟動 STOP condition。
0 意見:
張貼留言