SEI(Serial Encoder Interface)串行編碼器接口,是先楫半導(dǎo)體創(chuàng)新性設(shè)計(jì)的一個(gè)針對(duì)串行絕對(duì)值編碼器通信的外設(shè)。SEI支持同步通信模式與異步通信模式,既能做主機(jī)——從編碼器獲取數(shù)據(jù),又能做從機(jī)——將位置信息以主機(jī)需要的串行協(xié)議發(fā)出。在電機(jī)類應(yīng)用中大大的降低了編碼器相關(guān)開發(fā)任務(wù)的難度,同時(shí)以硬件編解碼的方式降低了CPU負(fù)載率,讓CPU有更多算力處理其他任務(wù)。
先楫半導(dǎo)體SDK1.10.0提供了諸多SEI應(yīng)用的實(shí)例,包括Biss-c、Endat、Hiperface、Nikon、SSI、Tamagawa等串行協(xié)議的主站、從站配置源碼,開發(fā)者在sample實(shí)例的基礎(chǔ)上,簡(jiǎn)單的進(jìn)行修改即可應(yīng)用到項(xiàng)目中。
本文以Biss-c和Endat協(xié)議為例,對(duì)SEI在同步通信中用法進(jìn)行講解,使讀者對(duì)SEI的用法有進(jìn)一步的認(rèn)識(shí)與了解。
本文中,命令指協(xié)議中主站向從站發(fā)送的命令,從站需要根據(jù)命令內(nèi)容進(jìn)行回復(fù)或執(zhí)行某些操作;指令指SEI引擎執(zhí)行的動(dòng)作。
1、SEI關(guān)鍵概念
1.1 數(shù)據(jù)寄存器
數(shù)據(jù)寄存器是SEI收發(fā)數(shù)據(jù)的數(shù)據(jù)存放單元。在通信的接收過程中,接收到的數(shù)據(jù)會(huì)被存放于數(shù)據(jù)寄存器中;在通信的發(fā)送過程中,需要向外發(fā)送的數(shù)據(jù)同樣存放在數(shù)據(jù)寄存器中。
SEI共有17組數(shù)據(jù)寄存器,每個(gè)寄存器寬度為32bit。當(dāng)SEI工作在同步模式時(shí),數(shù)據(jù)線上連續(xù)出現(xiàn)的數(shù)據(jù)會(huì)根據(jù)clock信號(hào)進(jìn)行采樣,并將采樣后的數(shù)據(jù)按照SEI配置依次保存到數(shù)據(jù)寄存器中,不超過32bit的圈數(shù)/位置數(shù)據(jù)可以使用1個(gè)數(shù)據(jù)寄存器進(jìn)行保存,超過32bit的數(shù)據(jù)使用2個(gè)數(shù)據(jù)寄存器進(jìn)行保存——不過單圈精度超過32位以及圈數(shù)超過32位的編碼器比較少見,32bit寄存器可滿足絕大部分使用場(chǎng)景。
數(shù)據(jù)寄存器0用于忽略接收到的數(shù)據(jù)——某些通信協(xié)議的數(shù)據(jù)字段,如果開發(fā)者不關(guān)心,可以使用數(shù)據(jù)數(shù)據(jù)寄存器0進(jìn)行接收;其概念與Linux系統(tǒng)下黑洞文件類似。
數(shù)據(jù)寄存器2~數(shù)據(jù)寄存器17為通用數(shù)據(jù)寄存器??梢怨ぷ髟?種模式下:
數(shù)據(jù)模式:僅用于存儲(chǔ)數(shù)據(jù)。
檢查模式:可設(shè)定期待值,例如用戶期待接收到0x17,當(dāng)接收到的寫入該數(shù)據(jù)寄存器的值不為0x17時(shí),可產(chǎn)生傳輸錯(cuò)誤提示。
CRC模式:用于收發(fā)數(shù)據(jù)過程中實(shí)時(shí)計(jì)算CRC值,可通過設(shè)置CRC多項(xiàng)式與CRC初始值來設(shè)計(jì)CRC算法,當(dāng)接收數(shù)據(jù)的CRC計(jì)算結(jié)果與實(shí)時(shí)計(jì)算結(jié)果不符時(shí),可產(chǎn)生錯(cuò)誤傳輸提示。
1.2 命令寄存器
用于收發(fā)串行編碼器協(xié)議中的命令數(shù)據(jù)。例如ENDAT協(xié)議中Mode Command字段為命令,其含義如下圖:

可以看到,Mode Command字段內(nèi)的M0~M3決定了通信的內(nèi)容,根據(jù)該字段的不同,主機(jī)可以從編碼器中讀取位置數(shù)據(jù)、收發(fā)配置參數(shù)、復(fù)位等。
1.3 命令匹配表
命令寄存器接收到命令后,SEI引擎接收J(rèn)UMP跳轉(zhuǎn)指令,會(huì)根據(jù)命令內(nèi)容在命令匹配表內(nèi)進(jìn)行檢索。找到符合命令的表項(xiàng)后,則跳轉(zhuǎn)至該命令匹配表指向的指令開始執(zhí)行。SEI共支持8張命令匹配表,SEI引擎會(huì)以順序方式對(duì)每張命令匹配表的命令進(jìn)行對(duì)比,如果命令匹配表0~命令匹配表6都匹配失敗,則無條件執(zhí)行命令匹配表7的預(yù)設(shè)指令(回復(fù)/不回復(fù))。命令匹配表一般在做從機(jī)時(shí)使用。
1.4 指令
SEI引擎共支持8種指令,分為停止、等待、接收、發(fā)送、跳轉(zhuǎn)5大類指令,根據(jù)是否有超時(shí)保護(hù)拓展為8種指令。例如接收指令可分為時(shí)限內(nèi)接收與無限時(shí)接收,時(shí)限內(nèi)接收在規(guī)定的時(shí)間內(nèi)未收到數(shù)據(jù)會(huì)進(jìn)行報(bào)錯(cuò)處理,無限時(shí)接收則會(huì)永遠(yuǎn)等待下去。其它時(shí)限內(nèi)發(fā)送與無限時(shí)發(fā)送等概念,請(qǐng)讀者自行理解。
SEI共支持預(yù)設(shè)128條指令。
1.5 狀態(tài)機(jī)
SEI狀態(tài)機(jī)包括4個(gè)狀態(tài),狀態(tài)的切換只能以0-->1-->2-->3-->0的順序進(jìn)行,每種狀態(tài)的切換條件可由開發(fā)者自行定義,例如設(shè)置執(zhí)行完第10條指令后狀態(tài)機(jī)從狀態(tài)0切換到狀態(tài)1。狀態(tài)切換可向外發(fā)送事件信號(hào),開發(fā)者可將該信號(hào)拉到其它外設(shè)進(jìn)行觸發(fā),實(shí)現(xiàn)硬件同步;或簡(jiǎn)單的產(chǎn)生一次中斷或DMA事件,使用中斷或DMA進(jìn)行一定的數(shù)據(jù)處理工作。
理解SEI工作的關(guān)鍵就在于以上5個(gè)概念的掌握。其它更多的技術(shù)細(xì)節(jié)需要讀者自行查閱UM手冊(cè)進(jìn)行理解。
2、BISSC指令表解析
下面對(duì)SEI工作的流程進(jìn)行直觀的舉例描述,時(shí)序如下圖所示,代碼參考samples\drivers\sei\master\bissc\src\sei.c:


1)主機(jī)SEI引擎使能后,對(duì)外發(fā)送clock信號(hào),同時(shí)開始以指令0“等待”數(shù)據(jù)線上的ACK信號(hào),ACK信號(hào)由編碼器發(fā)出(編碼器收到clock信號(hào)后會(huì)發(fā)出ACK表示應(yīng)答),拉低數(shù)據(jù)總線電平,因此SEI收到ACK信號(hào)后會(huì)跳轉(zhuǎn)到指令1;
2)按照協(xié)議,ACK響應(yīng)后編碼器發(fā)送1 bit高電平,代表開始數(shù)據(jù)傳輸,指令1“等待”數(shù)據(jù)線上的START信號(hào),如SEI收到START信號(hào),將繼續(xù)接收CDS數(shù)據(jù),跳轉(zhuǎn)到指令2;
3)CDS和CDM是BISSC協(xié)議中用于主機(jī)與編碼器進(jìn)行一些控制指令交互的手段,主機(jī)每一幀數(shù)據(jù)傳送1 bit CDM數(shù)據(jù)給編碼器,編碼器每幀數(shù)據(jù)傳輸1 bit CDS數(shù)據(jù)給主機(jī)完成交互。例程使用的編碼器型號(hào),不存在控制數(shù)據(jù)交互功能,因此1 bit的CDS數(shù)據(jù)沒有意義,接收到數(shù)據(jù)后將其保存到數(shù)據(jù)寄存器0中,跳轉(zhuǎn)到指令3;
4)主機(jī)SEI引擎接收12bit多圈數(shù)據(jù)保存在DATA_2中,跳轉(zhuǎn)到指令4
5)主機(jī)SEI引擎接收12bit單圈數(shù)據(jù)保存在DATA_3中,跳轉(zhuǎn)到指令5
6)WARN和ERROR是BISSC協(xié)議中用于表示編碼器狀態(tài)的數(shù)據(jù)bit,當(dāng)故障時(shí)會(huì)通過這兩個(gè)數(shù)據(jù)bit通知主機(jī)數(shù)據(jù)無效,例程使用DATA_4保存后,跳轉(zhuǎn)到指令6
7)接下來6個(gè)bit的數(shù)據(jù)是用于數(shù)據(jù)完整性校驗(yàn)的CRC,CRC校驗(yàn)正確數(shù)據(jù)才有效,否則會(huì)觸發(fā)SEI TRX中斷,接收完6 bit CRC數(shù)據(jù)后會(huì)跳轉(zhuǎn)到指令7
8)當(dāng)數(shù)據(jù)發(fā)送完成后,Data 保持小于 10us 的低電平,這段時(shí)間被稱為 Timeout。該信號(hào)一直維持到 Data 被拉高,表明當(dāng)前幀通信結(jié)束,可以開始下一幀通信。在此期間,SEI主機(jī)不再向外發(fā)送clock信號(hào),并維持CLK數(shù)據(jù)線為高電平。當(dāng)編碼器準(zhǔn)備好下一幀數(shù)據(jù)傳輸,會(huì)釋放數(shù)據(jù)線將其拉高為高電平,即指令8配置的等待數(shù)據(jù)線為1
9)完成整個(gè)通信過程后,主機(jī)執(zhí)行HALT指令,準(zhǔn)備下一幀數(shù)據(jù)的傳輸,重新從指令0開始數(shù)據(jù)傳輸
可以看到,通過以上工作流程的描述,SEI就依靠硬件自動(dòng)完成了clock的發(fā)送,從編碼器讀回來了數(shù)據(jù)。CPU只要在數(shù)據(jù)寄存器中讀取位置值和圈數(shù)值即可。
3、ENDAT指令表解析
與SEI類似,下面對(duì)ENDAT協(xié)議進(jìn)行解析,時(shí)序如下圖所示,代碼參考samples\drivers\sei\master\endat\src\sei.c:

由以上時(shí)序圖可以看到,ENDAT協(xié)議,由以下幾個(gè)階段組成:
1)由主機(jī)發(fā)送2個(gè)周期的clock信號(hào)
2)由主機(jī)發(fā)送Mode command(參見1.2章節(jié)),Mode command共6 bit,后3 bit與前3 bit按位取反
3)由主機(jī)再發(fā)送2個(gè)周期的clock信號(hào)
4)主機(jī)持續(xù)輸出clock信號(hào),開始等編碼器給出start信號(hào),start信號(hào)即編碼器拉高數(shù)據(jù)線,
5)編碼器傳輸1 bit Error數(shù)據(jù)
6)編碼器傳輸n bit位置數(shù)據(jù)(n取決于編碼器規(guī)格)
7)編碼器傳輸5 bit CRC數(shù)據(jù)
8)一段時(shí)間的timeout,其概念與BISSC相似,區(qū)別在于編碼器會(huì)拉低數(shù)據(jù)線表示timeout結(jié)束,即可以開始下一幀數(shù)據(jù)傳輸。
參照以上對(duì)ENDAT編碼器協(xié)議的解讀,理解下圖所示例程的指令表設(shè)計(jì),應(yīng)該是毫無難度了。

4、同步通信其它技術(shù)點(diǎn)解析
4.1 采樣點(diǎn)
細(xì)心的讀者會(huì)注意到,SDK中BISSC與ENDAT兩個(gè)master例程,采樣點(diǎn)的設(shè)置不同,下面介紹一下采樣點(diǎn)的設(shè)置。
BISSC例程如下,接收采樣點(diǎn)為ck0 point,發(fā)送點(diǎn)為ck1 point:

ck0是指一個(gè)clock周期的第一個(gè)邊沿,ck1是指一個(gè)clock周期的第二個(gè)邊沿。結(jié)合BISSC協(xié)議的規(guī)定,idle狀態(tài)下clock為高電平,那么第一個(gè)邊沿就是下降沿,第二個(gè)邊沿就是上升沿。
即意味著,SEI引擎會(huì)在下降沿采樣接收信號(hào)線上的數(shù)據(jù),在上升沿發(fā)送要發(fā)出的數(shù)據(jù)。BISSC協(xié)議主機(jī)不發(fā)送數(shù)據(jù),只關(guān)注接收即可。
如下圖為BISSC標(biāo)準(zhǔn)協(xié)議,可以看到,數(shù)據(jù)確實(shí)在clock的下降沿采樣,上升沿?cái)?shù)據(jù)發(fā)生變化。

ENDAT波形如下圖,可以看到發(fā)送Mode command時(shí),數(shù)據(jù)在下降沿發(fā)送;接收數(shù)據(jù)時(shí),數(shù)據(jù)在下降沿采樣:


所以ENDAT例程采樣點(diǎn)配置如上圖所示,clock信號(hào)線idle電平為高電平,那么接收采樣點(diǎn)為ck0 point,發(fā)送點(diǎn)也為ck0 point。
4.2 采樣點(diǎn)調(diào)整
當(dāng)編碼器線纜長(zhǎng)度比較長(zhǎng),電信號(hào)的傳輸時(shí)間會(huì)對(duì)信號(hào)的相位發(fā)生影響,當(dāng)影響無法忽略時(shí),需要對(duì)采樣點(diǎn)進(jìn)行調(diào)整。
如下圖ENDAT協(xié)議中所示,主機(jī)發(fā)出的clock在信號(hào)線上傳輸?shù)竭_(dá)編碼器,編碼器根據(jù)clock信號(hào)發(fā)送位置數(shù)據(jù),位置數(shù)據(jù)傳輸?shù)街鳈C(jī)時(shí),如果主機(jī)仍然在下降沿采樣,那么就會(huì)發(fā)生錯(cuò)誤。

先楫SDK例程開發(fā)時(shí)充分考慮以上情況的發(fā)生,在SEI最初的通信過程中,會(huì)測(cè)量主機(jī)主動(dòng)發(fā)出的clock信號(hào)下降沿與從機(jī)回復(fù)信號(hào)的start上升沿之間的時(shí)間差,來判斷電信號(hào)在線纜中傳輸造成的相位偏移影響,對(duì)采樣點(diǎn)進(jìn)行調(diào)整,如下圖代碼:

調(diào)整的邏輯較簡(jiǎn)單,請(qǐng)讀者自行分析,以便更好的理解整個(gè)通信過程。
5、小結(jié)
相信通過以上針對(duì)SEI的講解,及對(duì)BISSC、ENDAT例程代碼的分析,讀者對(duì)SEI有了更深的認(rèn)識(shí),希望開發(fā)者可以用好SEI模塊,加速項(xiàng)目開發(fā)與落地。
-
編碼器
+關(guān)注
關(guān)注
45文章
3956瀏覽量
142729 -
寄存器
+關(guān)注
關(guān)注
31文章
5609瀏覽量
130017 -
接口
+關(guān)注
關(guān)注
33文章
9525瀏覽量
157079 -
絕對(duì)值編碼器
+關(guān)注
關(guān)注
3文章
71瀏覽量
10632 -
先楫半導(dǎo)體
+關(guān)注
關(guān)注
12文章
285瀏覽量
3311
發(fā)布評(píng)論請(qǐng)先 登錄
SEI異步通訊—多摩川協(xié)議支持
用SPI模擬BISS-C協(xié)議,可以用定時(shí)器捕獲時(shí)鐘高電平持續(xù)時(shí)間判斷biss幀的開始嗎?
用SEI實(shí)現(xiàn)BiSS-C從機(jī)協(xié)議,發(fā)送TIMEOUT期間CDM如何接收?
一個(gè)到電機(jī)位置編碼器的EMC兼容接口設(shè)計(jì)
電磁兼容(EMC)標(biāo)準(zhǔn)的電機(jī)位置編碼器接口講解
請(qǐng)問tms320f28377d連接多個(gè)ENDAT絕對(duì)值編碼器是否需要4個(gè)硬件SPI接口才行?
C2000 MCU的BiSS-C絕對(duì)編碼器主接口參考設(shè)計(jì)
PRU-ICSS的另一個(gè)應(yīng)用概述
最近在使用TMS320F28379D用其CLB功能實(shí)現(xiàn)ENDAT2.2協(xié)議時(shí)與海德漢的編碼器進(jìn)行通訊。程序初始化一直不成功?
基于FPGA的BISS-C協(xié)議編碼器的解碼實(shí)現(xiàn)
詳解雙向/串行/同步(BiSS)位置編碼器的接口
解讀Modbus通訊協(xié)議
C2000位置管理器BISS-C庫用戶指南
經(jīng)驗(yàn)分享 | SEI同步通訊—BISS-C/ENDAT協(xié)議解讀
評(píng)論