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

用Labview 和USB 接口實(shí)現(xiàn)的電容測(cè)量器
脈搏測(cè)量器
如何自己動(dòng)手制作一個(gè)自動(dòng)連續(xù)的肺活量測(cè)量器?
由INA117構(gòu)成的測(cè)量器件電源電流電路
雨量檢測(cè)器_雷達(dá)雨量測(cè)量器介紹

嵌入式測(cè)量器件使用簡(jiǎn)單的串行接口簡(jiǎn)介

評(píng)論