簡單串行接口(SSI)是一種二進制協議,用于與模擬嵌入式測量設備(78M6610+LMU、78M6610+PSU和MAX78630+PPM)通信。
概述
簡單串行接口(SSI)是一種二進制串行協議,用于ADI公司嵌入式測量設備(EMD)上的UART通信。本應用筆記通過詳細說明可用命令和相應的源代碼示例來介紹該協議的特性和結構。該協議的主要特點是:
簡單性:該協議可以在主機處理器上實現,而不會占用過多的系統資源。
健壯性:每個數據包都包含一個標頭、字節計數、有效負載和校驗和。如果命令的標頭、字節計數和校驗和不正確,則收件人可以拒絕數據包。
效率:數據以二進制編碼而不是字符編碼值交換,命令不需要回顯到主機。此外,可以在單個數據包中發送多個命令,以進一步減少通信開銷。
支持多點系統:目標設備尋址能力支持在單個串行總線上連接多個目標設備。
SSI 是一種基于數據包的協議,可實現主從或命令-響應通信。SSI 中使用兩種類型的數據包:主數據包,由主機設備發出;和從數據包,由從屬 EMD 發出,以響應來自主機或主站的命令。
下載相應的源代碼。
串行接口選擇
主站通過三個串行接口訪問模擬 EMD:UART、SPI 和 I2C。SSI 使用 UART 接口,必須相應地配置 EMD 才能使用 SSI。這是通過器件相應引腳上的上拉或下拉電阻完成的。有關配置器件串行接口的說明,請參閱器件數據手冊。
設備地址
EMD 的器件地址 (SSID) 通過 DevAddr 寄存器和器件的一個或兩個引腳的組合進行設置,具體取決于器件的封裝。有關設置器件SSID的說明,請參閱器件數據手冊。
主數據包
主數據包始終包含以下內容:
單字節標頭,0xAA
單字節數據包長度指示器,它是數據包中所有字節的計數,包括其自身
有效負載,可以包含多個命令
校驗和,它是數據包中所有前面字節的模 256 和的二進制補碼,從標頭字節開始,包括有效負載的最后一個字節
從上面的描述中,有一些特征與所有有效的主數據包有關:
主數據包的長度始終為 4 個或更多字節。
主數據包的長度不能超過 255 字節。
字段字節計數為一個字節。
數據包的最大長度受從設備的命令緩沖區限制。請參閱從器件的數據手冊,了解該器件的最大命令長度。
圖 1 說明了主數據包的結構。
圖1.SSI 主數據包結構。
從數據包
從數據包的結構因從設備從主設備接收的命令而異。最短的從數據包是單字節響應,表示對收到的命令進行肯定或否定確認。在 SSI 中實現的所有單字節數據包如表 1 所示。
法典 | 定義 |
0xAD | 沒有數據的正確認是接收和執行的有效命令,但不需要數據響應。 |
0xB0 | 否定確認 |
0xBC | 錯誤命令是從設備不支持的已接收命令。 |
0xBD | 校驗和錯誤是在主數據包中檢測到的校驗和錯誤。 |
0xBF | 緩沖區溢出表示主數據包太長。 |
包含數據的從數據包遵循與主數據包相同的一般結構,包括標頭字節、字節計數、有效負載和校驗和,如圖 2 所示。
多字節從數據包的標頭字節可以是0xAA(用數據確認)或0xAE(自動報告數據包)。自動報告數據包由 78M6610+PSU 等設備生成,這些設備可以定期自動傳輸測量數據。由于自動報告數據和命令響應數據有不同的標頭,因此主機可以在從站發送自動報告數據時發送命令和接收響應。
圖2.多字節從數據包。
主命令
SSI主站和從站之間的大多數通信都涉及請求從設備中寄存器的內容并寫入這些寄存器。典型的命令序列包括向從站發送目標寄存器地址,并發出讀或寫命令以從目標地址開始讀取或寫入一個或多個寄存器。其他命令允許在單個總線上具有多個從設備的系統中選擇或取消選擇單個從設備。實現自動報告的設備還可以接受命令來更改自動報告數據包的內容。
當前版本的 SSI 中支持的所有主命令如表 2 所示。請注意,所有模擬 EMD 可能無法響應所有命令。請參閱器件的數據手冊,以確定哪些命令可以在特定器件中執行。
命令 | 參數 | 描述 |
0xA0 | 上 | |
0xA1 | 1 字節,地址 [7:0] | 設置目標地址位 [7:0]。 |
0xA2 | 1 字節,地址 [15:8] | 設置目標地址位 [15:8]。 |
0xA3 | 2 字節,地址 [7:0],[15:8] | 設置目標地址位 [15:0]。 |
0xD0 | 數據 | 寫入字節,從目標地址開始,由字節計數的剩余部分設置。 |
0xD1-0xDF | 數據 | 從目標地址開始寫入 1–15 個字節。 |
0xE0 | 1 字節,字節數 | 從目標地址開始讀取字節,需要指示要讀取的字節數的參數。 |
0xE1-0xEF | 上 | 從目標地址開始讀取 1–15 個字節,不需要參數,使用低半字節。 |
0xAE | 上 | 安裝新的自動報告命令。 |
以下命令用于選擇和取消選擇目標設備 | ||
0xC0 | 上 | 取消選擇當前選定的從屬設備 |
0xC1-0xCE | 上 | 選擇目標設備,不需要參數,使用低半字節。 |
0xCF | 1 字節,設備的 SSID | 選擇目標設備,需要指示從設備SSID的參數 |
超時
當設備空閑(即等待來自主站或目標站的數據包)時,接收緩沖區指針將重置并指向第一個緩沖區位置。收到第一個字節時,設備會檢查它是 SSI 標頭還是應答 (0xAA)。如果是這樣,則重置超時計時器,并且每個后續接收字節也會重置計時器。如果在超時間隔內未收到任何字節,并且數據包被視為不完整,則設備將返回空閑狀態,而不發送任何內容。此時,主服務器可以重新發送最后一個命令或發送新命令。
當數據包損壞或未選擇目標時,可能會發生超時。主設備和從設備都必須實現超時。如果在接收數據包期間以當前波特率在大約 50 字節時間內未收到字節,則會發生超時。在重新發送命令之前,主服務器應至少等待此時間。
SSI 源代碼和示例
開發以下示例是為了幫助理解 SSI 協議,并為構建自定義應用程序奠定基礎。提供的源代碼不執行任何特定的應用程序;但是,它確實提供了與模擬EMD接口所需的基本功能。提供的源代碼文件及其說明列于表 3 中。
文件 | 描述 |
maxim_ssi.c | SSI 讀取、寫入等的函數定義 |
maxim_ssi.h | 函數原型和 SSI 命令#defines |
maxim_em_device.h | 定義應用中使用的嵌入式測量設備的頭文件 |
78M6610_LMU.h | 嵌入式測量設備頭文件 |
78M6610_PSU.h | 嵌入式測量設備頭文件 |
MAX78630_PPM.h | 嵌入式測量設備頭文件 |
華華 | 客戶的硬件特定功能定義(ssi_tx_byte、ssi_rx_byte) |
呵呵 | 客戶的硬件特定功能原型 |
maxim_ssi.c和maxim_ssi.h
頭文件 maxim_ssi.h 提供 SSI 函數原型,并定義主命令、從屬響應和最大數據包長度。
maxim_ssi.c 提供以下功能:
無符號字符ssi_get_checksum(無符號字符 CNT,無符號字符×數據) 函數 ssi_get_checksum()
計算 SSI 數據包的相應校驗和。
int ssi_send_packet(無符號字符byte_cnt,無符號字符 x 有效負載) 函數 ssi_send_packet()
需要有效負載字節計數和指向有效負載的指針作為其參數。如果數據包字節計數(有效負載字節計數 + 3)大于從設備頭文件中定義的MAX_PACKET_LEN,則 ssi_send_packet() 將返回 -1 以指示故障。如果沒有,該函數通過將標頭、數據包字節計數添加到有效負載的前面來完成數據包構建,然后調用 ssi_get_checksum() 將校驗和添加到數據包的末尾。然后,該函數將數據包一次發送到 ssi_tx_byte()。
maxim_ssi.c 提供的所有剩余功能都調用 ssi_send_packet() 并提供嵌入式測量應用所需的基本功能。但是,最終用戶可以自由構建自定義數據包并從其應用程序調用 ssi_send_packet()。如果他們選擇這樣做,請務必記住,該函數僅期望有效負載中的字節數作為其參數和指向該有效負載的指針。標頭、實際數據包字節計數和校驗和由函數添加。
int ssi_deselect_device(void) 函數 ssi_deselect_device() 構建適當的 SSI 有效負載,用于在串行總線上發送 DE_SELECT_TRGT (0xC0)
master 命令,然后調用函數 ssi_send_packet()。該函數返回從設備響應或 -1 以指示故障。
在任何應用程序的開頭調用此函數,以確保在繼續之前未選擇任何設備。圖 3 顯示了調用 ssi_deselect_device 函數的預期主數據包和從屬響應。
int ssi_select_device(unsigned char ssid) 函數 ssi_select_device()
需要一個字節作為其參數,即要選擇從設備的 SSID。然后,該函數構建適當的 SSI 有效負載,用于在串行總線上發送 SELECT_TRGT(0xCF 或 0xC1–0xCE)主命令,然后調用函數 ssi_send_packet()。該函數返回從設備響應或 -1 以指示故障。圖 4 和圖 5 顯示了調用 ssi_select_device() 函數的預期主數據包和從屬響應。
int ssi_set_rw_adrs(emd_register_t adrs) 函數 ssi_set_rw_adrs()
需要枚舉類型的emd_register_t作為其參數。此數據類型表示嵌入式測量設備寄存器的字地址。參數可以是關聯從設備頭文件中定義的寄存器的名稱,也可以是單詞地址的整數表示形式。
該函數構建適當的 SSI 有效負載以發送 RW_ADRS (0xA3) 主命令,然后調用函數 ssi_send_packet()。該函數返回從設備響應或 -1 以指示故障。圖 6 顯示了調用 ssi_set_rw_adrs() 函數的預期主數據包和從屬響應。
int ssi_clear_adrs(void) 函數ssi_clear_adrs構建適當的 SSI 有效負載以發送 CLEAR_ADRS (0xA0)
master 命令,然后調用函數 ssi_send_packet()。該函數要么返回從設備響應,要么返回 -1 以指示故障。圖 7 顯示了調用 ssi_clear_adrs 函數的預期主數據包和從屬響應。
無符號字符 x ssi_read_3bytes(emd_register_t ADRS) 函數 ssi_read_3bytes()
期望將寄存器的字地址作為參數讀取。該函數構建適當的 SSI 有效負載來設置目標地址并從該地址讀取三個字節,然后調用函數 ssi_send_packet()。該函數返回指向從屬設備的響應的指針。圖 8 顯示了調用 ssi_read_3bytes() 函數的預期主數據包和從屬響應。
int ssi_write_3bytes(emd_register_t ADRS, unsigned char x data) 函數 ssi_write_3bytes()
期望寫入寄存器的字地址和指向要寫入的數據的指針作為其參數。該函數構建適當的 SSI 有效負載以設置目標地址并將三個字節寫入該地址,然后調用函數 ssi_send_packet()。該函數返回從設備響應或 -1 以指示故障。圖 9 顯示了調用 ssi_write_3bytes() 函數的預期主數據包和從屬響應。
無符號字符 x ssi_read_Nbytes(emd_register_t ADRS, 無符號字符 n_bytes) 函數 ssi_read_Nbytes()
期望讀取第一個寄存器的字地址和請求的字節數。該函數構建適當的 SSI 有效負載來設置目標地址并從該地址讀取 N 個字節,然后調用函數 ssi_send_packet()。該函數返回指向從屬設備的響應的指針。圖 10 顯示了調用函數 ssi_read_Nbytes() 的預期主數據包和從屬響應。
int ssi_write_Nbytes(emd_register_t ADRS, 無符號字符 x 數據, 無符號字符 n_bytes) 函數 ssi_write_Nbytes()
期望寫入寄存器的起始地址、指向要寫入的數據的指針以及要寫入的字節數作為其參數。該函數構建適當的 SSI 有效負載以設置目標地址并從給定地址開始寫入 N 個字節,然后調用函數 ssi_send_packet()。該函數返回從設備響應或 -1 以指示故障。圖 11 顯示了調用 ssi_write_Nbytes() 函數的預期主數據包和從屬響應。
maxim_em_device.h
頭文件 maxim_em_device.h 為那些可能在其應用程序中使用部分或全部器件的開發人員提供了一種定義應用中使用的模擬 EMD 的便捷方法。該文件僅具有可以注釋或取消注釋的#defines,具體取決于所使用的設備。
78M6610_LMU.h, 78M6610_PSU.h, MAX78630_PPM.h
頭文件 78M6610_LMU.h、78M6610_PSU.h 和 MAX78630_PPM.h 通過使用枚舉類型emd_register_t使用戶應用程序代碼可讀,為正在使用的嵌入式測量設備的寄存器提供別名。此外,還提供用于設備寄存器的位掩碼。
HW.C 和 HW.H
文件 hw.c 提供了函數 ssi_tx_byte() 和 ssi_rx_byte()。這是用戶實現其硬件特定函數調用的適當文件。可以使用的功能init_hardware()由用戶自行決定刪除;它僅為方便起見而提供。
結論
ADI公司EMD的簡單串行接口顧名思義:簡單。本應用筆記和隨附的源代碼旨在闡明協議,并在盡可能短的開發時間內啟動并運行應用。
審核編輯:郭婷
-
處理器
+關注
關注
68文章
19259瀏覽量
229653 -
嵌入式
+關注
關注
5082文章
19104瀏覽量
304825 -
串行接口
+關注
關注
3文章
327瀏覽量
42603
發布評論請先 登錄
相關推薦
評論