發(fā)實(shí)戰(zhàn):從硬件到協(xié)議棧全解析)
HPM5E00和EtherCAT從站這兩件事湊在一起基本就是工業(yè)以太網(wǎng)嵌入式開(kāi)發(fā)的當(dāng)前熱點(diǎn)。HPM5E00這顆集成了EtherCAT從站控制器ESC的高性能RISC-V MCU最近在不少伺服驅(qū)動(dòng)、遠(yuǎn)程IO和協(xié)議轉(zhuǎn)換項(xiàng)目里頻繁出現(xiàn)我手里也剛好有個(gè)項(xiàng)目是用它來(lái)替代“LAN9252 MCU”的舊方案。這篇博文就把我從拿到芯片、看原理圖、畫(huà)板、移植協(xié)議棧到用主站工具把數(shù)據(jù)跑通的整個(gè)實(shí)戰(zhàn)過(guò)程記錄下來(lái)重點(diǎn)放在硬件解析、軟件調(diào)試和那些文檔里不會(huì)寫(xiě)的坑上。想做EtherCAT從站開(kāi)發(fā)或者正在評(píng)估HPM5E00的工程師可以參考這條路徑。1. 項(xiàng)目整體設(shè)計(jì)與方案選型1.1 為什么是HPM5E00而不是“MCU 獨(dú)立ESC”傳統(tǒng)EtherCAT從站方案通常是“MCU LAN9252”或“MCU ET1100”的組合。LAN9252負(fù)責(zé)處理EtherCAT數(shù)據(jù)幀MCU通過(guò)SPI或并行總線(xiàn)與ESC交換數(shù)據(jù)。這個(gè)方案很成熟但問(wèn)題也很明顯兩片核心芯片PCB面積翻倍BOM成本上漲SPI通信還有瓶頸數(shù)據(jù)吞吐和實(shí)時(shí)性受限。HPM5E00的方案把ESC集成進(jìn)MCU內(nèi)部芯片直接對(duì)外提供MII/RMII接口接PHY內(nèi)部通過(guò)高速總線(xiàn)訪(fǎng)問(wèn)ESC寄存器根本不存在外部通信瓶頸。同時(shí)這顆芯片主頻做到了600MHz級(jí)別的雙核RISC-V片內(nèi)SRAM到2MB級(jí)別跑EtherCAT從站協(xié)議棧的同時(shí)還能兼顧電機(jī)控制、邏輯運(yùn)算、算法處理等高負(fù)載任務(wù)。這意味著一個(gè)從站設(shè)備可以只靠一顆主控芯片完成通信、控制、IO擴(kuò)展等全部工作硬件復(fù)雜度下降一個(gè)量級(jí)。我用一個(gè)項(xiàng)目做了粗略對(duì)比原方案MCUSTM32F4加LAN9252最小系統(tǒng)PCB面積大概55mm x 40mm換HPM5E00后同樣功能區(qū)域壓縮到35mm x 35mm以?xún)?nèi)元件數(shù)量減少約30%電源軌和濾波電路也少了一路。對(duì)于要做成本控制或小型化設(shè)備的產(chǎn)品來(lái)說(shuō)節(jié)省非??捎^。1.2 整機(jī)架構(gòu)從硬件到軟件的層次劃分這個(gè)項(xiàng)目要做一個(gè)支持EtherCAT通信的16路數(shù)字量輸入/輸出從站模塊。整體架構(gòu)分為三層硬件層HPM5E00最小系統(tǒng)、外部PHY、網(wǎng)絡(luò)變壓器、RJ45接口、輸入/輸出隔離電路、電源樹(shù)。協(xié)議棧層先楫提供的EtherCAT從站協(xié)議棧代碼或者用SSC工具生成的代碼負(fù)責(zé)ESC寄存器配置、PDO映射、狀態(tài)機(jī)處理、郵箱通信。應(yīng)用層IO讀寫(xiě)、診斷、參數(shù)存儲(chǔ)以及和EtherCAT過(guò)程數(shù)據(jù)之間的橋接邏輯。這樣分層的好處是通信協(xié)議和應(yīng)用邏輯互不干擾。前期調(diào)試只需要關(guān)注協(xié)議棧是否能被主站識(shí)別、狀態(tài)機(jī)是否能切到OP后期應(yīng)用修改也只影響應(yīng)用層代碼不必去動(dòng)EtherCAT底層。實(shí)際開(kāi)發(fā)中我強(qiáng)烈建議保持這個(gè)邊界不然協(xié)議棧出問(wèn)題的時(shí)候應(yīng)用代碼一起卷進(jìn)來(lái)排查難度會(huì)大很多。2. 硬件關(guān)鍵設(shè)計(jì)解析2.1 EtherCAT網(wǎng)絡(luò)側(cè)電路PHY芯片、變壓器與接口EtherCAT從站物理層是標(biāo)準(zhǔn)100BASE-TX以太網(wǎng)數(shù)據(jù)流方向是“主站 - 從站IN口 - 從站內(nèi)部ESC - 從站OUT口 - 下一從站”。所以網(wǎng)絡(luò)側(cè)硬件包括PHY、網(wǎng)絡(luò)變壓器、RJ45連接器和必要的防護(hù)器件。HPM5E00片內(nèi)ESC對(duì)外接口一般是MII或RMII項(xiàng)目里我使用了RMII模式好處是PHY到MCU的信號(hào)線(xiàn)從16根減到7根左右PCB布線(xiàn)壓力小很多。PHY選型上優(yōu)先考慮瑞昱的YT8512H、微芯的KSZ8081、TI的DP83822這些在EtherCAT從站里都有大量成熟應(yīng)用資料好找。我做這個(gè)項(xiàng)目選了YT8512H原因很簡(jiǎn)單內(nèi)置25MHz晶體驅(qū)動(dòng)電路外圍更簡(jiǎn)潔而且掉電時(shí)能保持鏈路狀態(tài)對(duì)從站短復(fù)位場(chǎng)景比較友好。PHY時(shí)鐘的設(shè)計(jì)要特別留意。EtherCAT對(duì)時(shí)鐘同步有要求PHY的25MHz參考時(shí)鐘一定不能省也不建議從MCU的PWM腳去模擬生成時(shí)鐘會(huì)造成抖動(dòng)超標(biāo)。穩(wěn)妥做法是用獨(dú)立25MHz無(wú)源晶振掛在PHY旁邊RMII的50MHz參考時(shí)鐘由PHY提供給MCU從硬件上保證時(shí)序干凈。網(wǎng)絡(luò)變壓器用的是HX1188NL這是百兆以太網(wǎng)里最常見(jiàn)的型號(hào)之一。變壓器次級(jí)中心抽頭通過(guò)0.1uF電容接地用來(lái)提供共模偏置初級(jí)的終端電阻按數(shù)據(jù)手冊(cè)放在變壓器和PHY之間這個(gè)位置不能亂改。RJ45選用帶屏蔽帶LED的型號(hào)LED引腳直接接PHY的Link/Act指示方便現(xiàn)場(chǎng)判斷物理鏈路是否正常。2.2 最小系統(tǒng)與電源樹(shù)設(shè)計(jì)HPM5E00本身是雙核高主頻MCU供電要求比普通單片機(jī)高一些。項(xiàng)目里采用5V輸入通過(guò)DC-DC降到3.3V給PHY和IO邏輯供電再用一顆LDO把3.3V轉(zhuǎn)成1.8V給MCU核心供電。DC-DC選型上注意開(kāi)關(guān)頻率避開(kāi)PHY的敏感頻段我用的是2.2MHz同步降壓芯片實(shí)測(cè)對(duì)網(wǎng)絡(luò)信號(hào)沒(méi)有明顯干擾。啟動(dòng)方式上HPM5E00支持從QSPI NOR Flash啟動(dòng)板載一顆8MB Flash用于存放固件。調(diào)試接口保留了JTAG和串口調(diào)試串口映射到一個(gè)UART波特率115200主要用來(lái)打印協(xié)議棧狀態(tài)和錯(cuò)誤信息。這個(gè)串口在后期的現(xiàn)場(chǎng)調(diào)試中非常救命千萬(wàn)不要省。另外我在設(shè)計(jì)里加了一顆I2C接口的EEPROMAT24C32容量32Kbit用來(lái)存EtherCAT從站信息SII數(shù)據(jù)。主站上電掃描的時(shí)候會(huì)通過(guò)ESC讀取這顆EEPROM獲得Vendor ID、Product Code、PDO映射等配置信息。如果EEPROM為空或內(nèi)容錯(cuò)誤主站會(huì)把這個(gè)從站識(shí)別成“unknown device”后續(xù)通信根本無(wú)法建立。所以EEPROM在原理圖上看著不起眼實(shí)際作用卻非常關(guān)鍵。2.3 PCB布線(xiàn)要點(diǎn)與EMC實(shí)戰(zhàn)經(jīng)驗(yàn)EtherCAT是百兆以太網(wǎng)差分對(duì)布線(xiàn)有硬性要求。RMII模式下PHY到MCU的數(shù)據(jù)線(xiàn)雖然數(shù)量不多但TX_EN、TXD0/1、RXD0/1、CLK等信號(hào)線(xiàn)要求等長(zhǎng)盡量不要打過(guò)孔換層阻抗控制在50歐姆單端。PHY到網(wǎng)絡(luò)變壓器的差分走線(xiàn)按100歐姆差分阻抗控制線(xiàn)寬線(xiàn)距可以參考疊層計(jì)算值常規(guī)4層板在表底層用6mil線(xiàn)寬、8mil間距就能接近100歐姆。變壓器到RJ45之間的走線(xiàn)同樣保持差分而且這段線(xiàn)要短不能跨越地平面裂縫。RJ45外殼通過(guò)RC接地可承受的共模噪聲路徑從機(jī)殼地回到大地避免干擾進(jìn)入PHY。EMC方面有一個(gè)經(jīng)驗(yàn)EtherCAT從站對(duì)靜電放電ESD和浪涌比較敏感因?yàn)楣I(yè)現(xiàn)場(chǎng)線(xiàn)纜很長(zhǎng)容易耦合干擾。RJ45的TX/RX差分線(xiàn)上串聯(lián)共模電感并在靠近連接器位置放置TVS管型號(hào)選擇結(jié)電容低的如PESD1FLEX避免影響信號(hào)質(zhì)量。實(shí)測(cè)加了共模電感后輻射騷擾測(cè)試余量提高了約6dB這個(gè)成本花得很值。3. 軟件協(xié)議棧移植與核心原理3.1 EtherCAT從站通信機(jī)制幀結(jié)構(gòu)、狀態(tài)機(jī)與PDO寫(xiě)軟件之前先把EtherCAT從站相關(guān)的幾個(gè)關(guān)鍵概念理清楚。EtherCAT主站發(fā)送標(biāo)準(zhǔn)以太網(wǎng)幀幀里嵌入了若干EtherCAT數(shù)據(jù)報(bào)一個(gè)數(shù)據(jù)報(bào)可以尋址到從站的某個(gè)寄存器區(qū)域或FMMUFieldbus Memory Management Unit映射的邏輯地址。從站收到幀后在硬件層面處理數(shù)據(jù)報(bào)然后從OUT口轉(zhuǎn)發(fā)給下一個(gè)從站。這種“處理即轉(zhuǎn)發(fā)”的機(jī)制讓EtherCAT的循環(huán)周期能做到幾十微秒級(jí)別。從站狀態(tài)機(jī)由主站通過(guò)寫(xiě)ESC的AL Control寄存器地址0x0120來(lái)觸發(fā)從站需要依次經(jīng)過(guò)INIT、PREOP、SAFEOP、OP四個(gè)狀態(tài)。INIT階段只能做郵箱通信PREOP階段郵箱可用可以讀寫(xiě)對(duì)象字典SAFEOP階段輸入數(shù)據(jù)開(kāi)始刷新但輸出仍被禁止OP階段輸入輸出全部使能。軟件調(diào)試時(shí)大部分時(shí)間都花在“卡在PREOP或者SAFEOP進(jìn)不了OP”這類(lèi)問(wèn)題上后面問(wèn)題排查會(huì)細(xì)說(shuō)。PDO過(guò)程數(shù)據(jù)對(duì)象映射是另一個(gè)核心概念。從站ESC內(nèi)存里有一塊同步管理器SM區(qū)域用于緩存輸入/輸出數(shù)據(jù)。主站通過(guò)FMMU將實(shí)際設(shè)備的對(duì)象字典地址映射到邏輯地址范圍這樣每個(gè)循環(huán)周期主站寫(xiě)輸出數(shù)據(jù)報(bào)ESC自動(dòng)把對(duì)應(yīng)數(shù)據(jù)寫(xiě)入SM應(yīng)用層只需要讀寫(xiě)SM緩沖區(qū)就能完成數(shù)據(jù)交互。所以協(xié)議棧移植時(shí)PDO映射、SM配置和FMMU初始化必須和ESI文件里的描述完全一致不然主站那邊數(shù)據(jù)根本對(duì)不上。3.2 基于HPM SDK和SSC生成從站代碼先楫的HPM SDK里已經(jīng)有EtherCAT從站示例代碼結(jié)構(gòu)包括ESC驅(qū)動(dòng)、PHY初始化和一個(gè)簡(jiǎn)單的應(yīng)用demo。如果你的硬件設(shè)計(jì)和官方評(píng)估板差異不大可以直接拿示例改。但項(xiàng)目里我新增了IO映射、自定義對(duì)象字典所以我用倍福的SSC工具Slave Stack Code重新生成了協(xié)議棧源碼。SSC工具操作流程是新建工程選擇從站芯片類(lèi)型這里選ESC類(lèi)型時(shí)要匹配HPM5E00的ESC如果選項(xiàng)里沒(méi)有就選“external ESC”模式因?yàn)镠PM5E00的ESC訪(fǎng)問(wèn)是外部存儲(chǔ)器接口的方式代碼里通過(guò)寄存器映射來(lái)兼容配置PDO的輸入/輸出映射表配置郵箱協(xié)議CoE和對(duì)象字典最后生成C代碼。生成的代碼會(huì)包含主循環(huán)、AL狀態(tài)機(jī)處理、CoE服務(wù)、PDO交換等模塊。我把HPM5E00的ESC訪(fǎng)問(wèn)函數(shù)替換成官方SDK提供的底層接口比如esc_read、esc_write這類(lèi)的封裝再把應(yīng)用層IO讀寫(xiě)掛在協(xié)議棧的同步中斷或主循環(huán)輪詢(xún)里。這樣一個(gè)基本的從站軟件框架就搭起來(lái)了。3.3 應(yīng)用層任務(wù)與PDO數(shù)據(jù)交互的實(shí)現(xiàn)細(xì)節(jié)項(xiàng)目里的IO模塊是16路輸入、16路輸出我把輸入映射到RxPDO從站輸入方向即主站讀輸出映射到TxPDO從站輸出方向即主站寫(xiě)。協(xié)議棧里對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)類(lèi)似這樣typedef struct { uint16_t input_bits; // 16路輸入狀態(tài) uint8_t status; // 診斷狀態(tài) } SlaveInputs; // 從站到主站 typedef struct { uint16_t output_bits; // 16路輸出控制 uint8_t command; // 備用控制字節(jié) } SlaveOutputs; // 主站到從站SSC生成的代碼里輸入數(shù)據(jù)在OP狀態(tài)下會(huì)被自動(dòng)寫(xiě)入對(duì)應(yīng)的SM地址輸出數(shù)據(jù)則從SM地址讀取后交給應(yīng)用層。我只需要在sii的PDO映射表里配置好這兩個(gè)結(jié)構(gòu)體的字節(jié)順序保證主站側(cè)看到的偏移和從站一致即可。應(yīng)用層主循環(huán)我放在while(1)里周期大概是1ms。每個(gè)周期讀一次PHY的狀態(tài)和ESC的AL事件然后執(zhí)行IO掃描。輸入引腳直接讀GPIO并刷新到輸入結(jié)構(gòu)體輸出結(jié)構(gòu)體里的位狀態(tài)則寫(xiě)GPIO。這里有個(gè)細(xì)節(jié)EtherCAT標(biāo)準(zhǔn)里從站應(yīng)該盡量在SM同步事件里刷新輸出而不是靠應(yīng)用層輪詢(xún)。但考慮到IO應(yīng)用對(duì)同步要求沒(méi)那么苛刻輪詢(xún)也可以接受。如果是做伺服或運(yùn)動(dòng)控制類(lèi)從站就必須改成ESC中斷或者DC同步事件驅(qū)動(dòng)把數(shù)據(jù)刷新延遲降到最低。4. 實(shí)驗(yàn)臺(tái)聯(lián)調(diào)實(shí)戰(zhàn)4.1 搭建EtherCAT主站環(huán)境TwinCAT與ESL網(wǎng)卡調(diào)試從站必須有主站。實(shí)驗(yàn)室里我用的是倍福TwinCAT 3裝在一臺(tái)Windows 10工控機(jī)上。TwinCAT安裝本身不復(fù)雜但網(wǎng)卡兼容性是個(gè)大坑。常見(jiàn)Intel 82574L、I210/I211控制器的網(wǎng)卡兼容性比較好Realtek網(wǎng)卡也可以試試但需要把網(wǎng)卡驅(qū)動(dòng)替換成TwinCAT的實(shí)時(shí)網(wǎng)卡驅(qū)動(dòng)。操作路徑是TwinCAT XAE Shell -SYSTEM-Real-Time-Compatible Adapters找到目標(biāo)網(wǎng)卡點(diǎn)擊“Install”安裝兼容驅(qū)動(dòng)。網(wǎng)卡裝好后把控制器的網(wǎng)口和從站IN口用網(wǎng)線(xiàn)直連。由于EtherCAT協(xié)議和普通以太網(wǎng)不兼容TwinCAT會(huì)把這個(gè)網(wǎng)卡鎖定為實(shí)時(shí)網(wǎng)卡IP配置會(huì)丟。這不是故障屬于正常現(xiàn)象開(kāi)發(fā)機(jī)上建議多備一個(gè)無(wú)線(xiàn)網(wǎng)卡用于聯(lián)網(wǎng)查閱資料。第一次上電時(shí)我在TwinCAT里執(zhí)行“掃描設(shè)備”操作。掃描時(shí)主站會(huì)向總線(xiàn)上廣播尋找命令理論上所有處于INIT狀態(tài)的EtherCAT從站都會(huì)響應(yīng)。如果從站的EEPROM數(shù)據(jù)正常掃描結(jié)果里會(huì)顯示硬件型號(hào)如果EEPROM為空設(shè)備名會(huì)帶個(gè)問(wèn)號(hào)。這一步能很直觀地驗(yàn)證硬件鏈路和ESC基本功能是否正常。4.2 從站EEPROM燒寫(xiě)與ESI文件導(dǎo)入我遇到過(guò)EEPROM為空導(dǎo)致掃描不到設(shè)備的問(wèn)題。EtherCAT從站的SII數(shù)據(jù)存放了Vendor ID、Product Code、PDO映射和SM配置等信息主站解析這塊數(shù)據(jù)時(shí)如果讀到全FF會(huì)認(rèn)為設(shè)備有故障直接忽略。正確的燒寫(xiě)流程是先用SSC工具生成從站EEPROM鏡像通常是一個(gè).bin或.csv文件再用先楫的調(diào)試工具或者自己的IAP程序把鏡像寫(xiě)入AT24C32。注意EEPROM的I2C地址要跟硬件設(shè)計(jì)一致AT24C32的A2/A1/A0引腳接地時(shí)地址是0x50如果焊接時(shí)懸空導(dǎo)致地址漂移從站可能自檢不到EEPROM。EEPROM寫(xiě)完后再掃描設(shè)備就能正確識(shí)別了。這時(shí)記得把SSC生成的ESI文件.xml拷貝到TwinCAT的安裝目錄TwincAT\3.1\Config\Io\EtherCAT下并重啟TwinCAT。這樣TwinCAT掃描到從站時(shí)會(huì)根據(jù)Vendor ID和Product Code自動(dòng)匹配ESI文件后續(xù)PDO映射和對(duì)象字典才能正確顯示。4.3 狀態(tài)機(jī)切換與PDO通信驗(yàn)證從INIT到OP的每一步EEPROM和驅(qū)動(dòng)都正常之后開(kāi)始調(diào)狀態(tài)機(jī)。TwinCAT的在線(xiàn)視圖里可以把從站狀態(tài)切到INIT、PREOP、SAFEOP、OP。我建議一級(jí)一級(jí)往上推不要圖省事直接跳到OP卡在哪一級(jí)就說(shuō)明哪一級(jí)對(duì)應(yīng)的問(wèn)題。從站掃描后默認(rèn)在INIT能識(shí)別EEPROM說(shuō)明硬件鏈路OK。切PREOP主要驗(yàn)證郵箱通信。PREOP階段主站會(huì)嘗試讀取對(duì)象字典或SDO如果從站郵箱中斷、SM郵箱通道配置不對(duì)會(huì)在這里失敗。切SAFEOP驗(yàn)證輸入數(shù)據(jù)刷新。我在TwinCAT里給輸入變量添加了Watch窗口同時(shí)短接從站某幾個(gè)輸入引腳觀察數(shù)值是否變化。切OP驗(yàn)證輸出數(shù)據(jù)。OP前主站會(huì)檢查從站的PDO映射、SM配置是否匹配不匹配時(shí)會(huì)報(bào)錯(cuò)并拒絕切換。實(shí)際調(diào)試中我遇到從站卡在PREOP切不到SAFEOP的情況??磸恼镜腁L Status寄存器后發(fā)現(xiàn)錯(cuò)誤碼指向“Invalid Output Configuration”。逐項(xiàng)排查SM設(shè)置最后發(fā)現(xiàn)是SSC生成代碼里SM2輸出郵箱的起始地址和PDO輸出SM的起始地址沖突了偏移相差了8個(gè)字節(jié)。修正映射表中的SM地址后狀態(tài)切換就正常了。這種地址沖突問(wèn)題很少出現(xiàn)在文檔里但做從站的人大概率會(huì)碰上一次建議拿到SSC代碼后先人工核對(duì)SM0到SM3的起始地址和長(zhǎng)度是否完整覆蓋郵箱和PDO區(qū)域。4.4 DC同步與SYNC信號(hào)測(cè)量項(xiàng)目對(duì)IO模塊的同步要求不高但為了驗(yàn)證HPM5E00做從站的實(shí)時(shí)性能底線(xiàn)我也把DCDistributed Clock同步打開(kāi)測(cè)了一輪。DC的作用是讓所有從站共享同一個(gè)系統(tǒng)時(shí)間從站在每個(gè)同步周期產(chǎn)生SYNC中斷用于觸發(fā)數(shù)據(jù)采樣或控制輸出。在TwinCAT中啟用DC后從站的SYNC0脈沖間隔可以設(shè)定為1ms、125us甚至更小。我用示波器探針測(cè)量HPM5E00的SYNC0引腳需要提前在GPIO配置里把這個(gè)功能引出來(lái)觀察脈沖間隔和抖動(dòng)。實(shí)測(cè)在125us周期下SYNC0脈沖抖動(dòng)的峰峰值約60ns這個(gè)結(jié)果對(duì)于通用MCU來(lái)說(shuō)相當(dāng)不錯(cuò)。如果是做伺服驅(qū)動(dòng)器這個(gè)同步精度已經(jīng)足夠支撐常見(jiàn)的力矩控制和位置控制環(huán)路。測(cè)DC時(shí)有個(gè)技巧不要只看SYNC0的絕對(duì)間隔要結(jié)合主站周期和從站時(shí)鐘漂移來(lái)看。EtherCAT標(biāo)準(zhǔn)要求從站DC時(shí)鐘可以動(dòng)態(tài)補(bǔ)償漂移如果在長(zhǎng)時(shí)間運(yùn)行中SYNC0間隔持續(xù)增大或減小說(shuō)明DC漂移補(bǔ)償沒(méi)有生效重點(diǎn)檢查ESC的SYNC0輸出配置和中斷優(yōu)先級(jí)設(shè)置。5. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄5.1 硬件類(lèi)問(wèn)題從站掃描不到或Link燈不亮做EtherCAT從站調(diào)試第一步永遠(yuǎn)是看物理鏈路。主站掃描不到從站或者從站Link燈不亮90%是PHY側(cè)的問(wèn)題。我的排查順序如下確認(rèn)PHY供電。YT8512H的DVDD和AVDD都是3.3V如果有引腳虛焊PHY可能上電了但沒(méi)有穩(wěn)定工作。確認(rèn)25MHz晶振起振。示波器量PHY的XI引腳波形應(yīng)為25MHz正弦或方波幅度不低于0.8Vpp。不起振時(shí)檢查晶振的負(fù)載電容和PHY的反饋電阻配置。確認(rèn)RMII時(shí)鐘。PHY到MCU的RMII參考時(shí)鐘一般為50MHz如果這個(gè)時(shí)鐘缺失ESC和PHY根本無(wú)法同步Link燈可能亮但數(shù)據(jù)收發(fā)全錯(cuò)。確認(rèn)網(wǎng)絡(luò)變壓器及終端電阻。用萬(wàn)用表量PHY差分輸出端和變壓器初級(jí)側(cè)的短路/開(kāi)路情況正常時(shí)差分對(duì)之間的直流電阻接近終端電阻值通常50歐姆對(duì)50歐姆。確認(rèn)RJ45接線(xiàn)。EtherCAT使用標(biāo)準(zhǔn)網(wǎng)線(xiàn)但有些自定義線(xiàn)序會(huì)直接導(dǎo)致Link失敗。建議先用成品網(wǎng)線(xiàn)測(cè)試排除自己做線(xiàn)纜的問(wèn)題。5.2 協(xié)議棧類(lèi)問(wèn)題狀態(tài)機(jī)卡住、PDO數(shù)據(jù)不刷新從軟件角度最典型的問(wèn)題是狀態(tài)機(jī)卡在SAFEOP??⊿AFEOP的原因通常是主站側(cè)配置檢查失敗包括PDO映射長(zhǎng)度和從站實(shí)際映射不一致。比如主站從ESI文件里解析到輸出PDO長(zhǎng)度為2字節(jié)但SSC代碼里實(shí)際定義的輸出結(jié)構(gòu)體是4字節(jié)這會(huì)導(dǎo)致SM長(zhǎng)度校驗(yàn)失敗。FMMU數(shù)量不足。從站需要為一個(gè)輸出PDO分配一個(gè)FMMU如果SSC工具生成的FMMU數(shù)量少于PDO數(shù)量主站下發(fā)FMMU配置時(shí)會(huì)失敗。SM的“Interrupt Enable”位沒(méi)有置位。有些協(xié)議棧版本默認(rèn)不使能SM中斷導(dǎo)致PDO數(shù)據(jù)接收后應(yīng)用層不知道有新數(shù)據(jù)輸出看起來(lái)像“不刷新”實(shí)際上數(shù)據(jù)已經(jīng)在SM緩沖區(qū)里了。排查時(shí)可以通過(guò)ESC寄存器直接看AL Status Code比如0x001C地址下的AL Status Code會(huì)給出具體的錯(cuò)誤類(lèi)型。配合主站側(cè)TwinCAT的“Error Info”提示基本能鎖定是映射、FMMU還是SM的問(wèn)題。5.3 數(shù)據(jù)刷新抖動(dòng)的處理心得如果PDO能通信但數(shù)據(jù)刷新時(shí)間抖動(dòng)很大除了前面提到的DC同步還有一個(gè)容易忽略的點(diǎn)ESC中斷和應(yīng)用任務(wù)優(yōu)先級(jí)。在HPM5E00上EtherCAT的SM同步事件可以映射到某個(gè)中斷控制器中斷服務(wù)函數(shù)里只做數(shù)據(jù)搬移和置標(biāo)志位具體業(yè)務(wù)邏輯放在任務(wù)里處理。應(yīng)用任務(wù)里不要做阻塞操作比如延時(shí)、串口同步發(fā)送、或者大量的浮點(diǎn)運(yùn)算這些都會(huì)拉長(zhǎng)主循環(huán)周期造成數(shù)據(jù)刷新波動(dòng)。此外PDO數(shù)據(jù)的讀寫(xiě)盡量使用memcpy按結(jié)構(gòu)體整體拷貝避免逐字節(jié)賦值。逐字節(jié)訪(fǎng)問(wèn)SM緩沖區(qū)時(shí)如果剛好有新的EtherCAT數(shù)據(jù)報(bào)到達(dá)讀到的數(shù)據(jù)可能是“撕裂”的。整體memcpy雖然也不能100%保證原子性但出錯(cuò)概率會(huì)低很多。更嚴(yán)謹(jǐn)?shù)淖龇ㄊ抢肊SC的SM區(qū)域“雙緩沖”特性在SM同步中斷里交替讀取兩塊緩沖區(qū)。5.4 開(kāi)發(fā)過(guò)程中值得堅(jiān)持的幾個(gè)習(xí)慣整個(gè)項(xiàng)目走下來(lái)我覺(jué)得有幾個(gè)習(xí)慣幫了大忙值得大家參考硬件板卡回來(lái)先不急著接主站先燒一個(gè)最簡(jiǎn)單的點(diǎn)燈程序確認(rèn)MCU的時(shí)鐘、Flash、中斷、GPIO都能正常工作再逐步引入PHY和EtherCAT協(xié)議棧。這樣出問(wèn)題時(shí)至少有理由判斷是“新增的部分”還是“原有部分”出了問(wèn)題。串口日志一定要留。協(xié)議棧跑起來(lái)之后我在每個(gè)狀態(tài)機(jī)遷移入口和錯(cuò)誤分支都加了日志打印。后面現(xiàn)場(chǎng)調(diào)試時(shí)哪怕人家沒(méi)有邏輯分析儀也能靠串口輸出判斷當(dāng)前狀態(tài)這對(duì)快速定位問(wèn)題至關(guān)重要。保存好EEPROM的燒寫(xiě)記錄和ESI文件的版本號(hào)。因?yàn)镋therCAT從站的PDO映射一旦變更EEPROM里的SII數(shù)據(jù)也要同步更新否則主站舊配置和新從站實(shí)際配置不匹配通信就直接斷掉。版本管理做得好的團(tuán)隊(duì)能少踩很多坑。結(jié)尾的一點(diǎn)實(shí)操感想項(xiàng)目收尾后我復(fù)盤(pán)了一下HPM5E00做EtherCAT從站最大的價(jià)值不是省了那幾十塊錢(qián)BOM而是讓從站設(shè)備真正可以做到“單芯片全功能”。以前MCU加LAN9252的方案里MCU很多時(shí)候只負(fù)責(zé)和ESC搬運(yùn)數(shù)據(jù)真正做控制的性能反而被SPI瓶頸卡住現(xiàn)在HPM5E00內(nèi)部總線(xiàn)直接訪(fǎng)問(wèn)ESC數(shù)據(jù)搬運(yùn)幾乎不占CPU時(shí)間雙核架構(gòu)還能把一個(gè)核專(zhuān)門(mén)跑通信另一個(gè)核跑算法這對(duì)提升伺服、運(yùn)動(dòng)控制類(lèi)產(chǎn)品的性能上限很有幫助。如果你也在用HPM5E00或者類(lèi)似的集成ESC芯片做從站有一點(diǎn)特別值得注意拿到開(kāi)發(fā)板后先不要急著在TwinCAT上點(diǎn)“OP”而是先花半天時(shí)間把ESC的寄存器映射表、SM配置、EEPROM的SII結(jié)構(gòu)徹底讀懂再用SSC工具生成代碼。一旦底層這些機(jī)制都通了后面移植任何應(yīng)用功能都會(huì)順手很多。這個(gè)項(xiàng)目后續(xù)我還打算在此基礎(chǔ)上擴(kuò)展CANopen網(wǎng)關(guān)和更復(fù)雜的同步運(yùn)動(dòng)控制功能到時(shí)候再和大家繼續(xù)分享。