BISS-C協(xié)議讀取絕對式編碼器:從狀態(tài)機到CRC校驗調試指南)
簡介面向FPGA開發(fā)者與工業(yè)編碼器應用工程師的BISS-C協(xié)議編碼器Verilog實現(xiàn)源碼包解決了在高端運動控制與位置反饋系統(tǒng)中讀取雷尼紹BISS-C協(xié)議編碼器的問題。方案通過parameter參數(shù)化支持18/26/32/36bit位寬靈活切換最高10MHz時鐘頻率并采用CRC并行計算技術將校驗耗時壓縮至單時鐘周期同時模塊化設計可支撐四路編碼器并行讀取每路約9.8MHz對實時性和多軸場景尤為友好。包體共10個文件包括3個Verilog源文件核心解碼模塊、多通道模塊及testbench、1個VCD仿真波形、1個仿真運行腳本以及README說明文檔等30KB壓縮包輕量易移植。方案不依賴IP核附帶全局異步復位與動態(tài)時序約束處理便于導入不同F(xiàn)PGA平臺。已有192人學習下載適合希望快速落地BISS-C協(xié)議或研究CRC并行加速與狀態(tài)機超時檢測的工程師參考。1. FPGA讀絕對式編碼器為什么先碰BISS-C協(xié)議做運動控制和伺服驅動的人遲早要跟絕對式編碼器打交道。BISS-C協(xié)議在國產伺服和高端設備里出現(xiàn)頻率越來越高它比EnDat和Hiperface開放、比SSI帶寬高一根MA時鐘線加一根SLO數(shù)據(jù)線就能把位置、狀態(tài)、CRC一次性讀回來。我拆過的這套FPGA實現(xiàn)BISS-C協(xié)議編碼器源碼包解決的就是“FPGA做主站、怎么穩(wěn)定讀編碼器”這件事不是簡單搭個移位寄存器而是把時序狀態(tài)機、CRC校驗、多圈處理都做進去了。適合想繞過數(shù)據(jù)手冊直接看工程實現(xiàn)的人也適合正在為編碼器讀取出錯發(fā)愁的一線調試工程師。下面按我從仿真到上板的路徑來說清楚。2. BISS-C協(xié)議幀結構從數(shù)據(jù)手冊到寄存器級理解2.1 BISS-C的物理層與時序參數(shù)BISS-C物理層是主從同步串行接口主站負責產生MA時鐘從站編碼器在SLO數(shù)據(jù)線上同步回傳數(shù)據(jù)。注意它跟SPI有點相似但MA時鐘不是持續(xù)自由的而是在一次讀取周期里按幀突發(fā)。源碼包里把MA時鐘頻率做成可配置我通常設在2MHz到5MHz之間。這個參數(shù)直接影響整幀讀取時間也影響編碼器從站的上電響應能力。傳輸方向只有兩根線MA從主站到編碼器SLO從編碼器回主站。MA時鐘上升沿和下降沿各有用途標準里常用上升沿鎖存SLO數(shù)據(jù)但不少編碼器在下降沿之后數(shù)據(jù)才真正穩(wěn)定這個細節(jié)是后面調試踩坑的重災區(qū)。物理層還要注意RS-422差分還是單端源碼里默認按差分輸入輸出處理管腳約束時就要對應到FPGA的差分輸入緩沖器。幀與幀之間MA時鐘要保持高電平空閑。如果主站連續(xù)發(fā)時鐘編碼器會認為是一幀超長數(shù)據(jù)狀態(tài)機直接亂掉。源碼的狀態(tài)機里專門有一段超時檢測超過設定時鐘周期數(shù)還沒收到有效響應就強制回到IDLE否則整機聯(lián)調時編碼器線松動一次后續(xù)所有讀取全廢。2.2 一幀數(shù)據(jù)里藏了哪些字段BISS-C一幀從編碼器回傳的數(shù)據(jù)結構可以分成幾段我拆源碼時習慣先把每一段的位寬和使用場景列清楚。下表是BISS-C標準幀的典型字段分布具體位寬由編碼器廠商和源碼參數(shù)決定。字段段位寬作用說明Ack1位編碼器對主站起始請求的應答Start1位數(shù)據(jù)開始標志通常為低電平Control1位控制位區(qū)分位置數(shù)據(jù)還是附加數(shù)據(jù)Data多比特單圈位置數(shù)據(jù)位寬可配置如17位或25位Error1位編碼器內部錯誤標志CRC6位對Data和Error字段的CRC校驗Timeout1位數(shù)據(jù)結束段主站感知傳輸結束注意一幀里并不只有位置數(shù)據(jù)。Control位決定這幀是普通位置幀還是帶診斷信息的擴展幀源碼包里把Control位引出來供上層邏輯判斷。CRC是6位多項式校驗覆蓋范圍從Data最高位到Error位不包括Ack和Start。很多第一次接觸BISS-C的人會把CRC算到整個幀最后校驗永遠不過這是協(xié)議理解上的第一個坎。2.3 協(xié)議狀態(tài)機與CRC校驗范圍源碼的核心是一個有限狀態(tài)機狀態(tài)跳轉跟著MA時鐘和SLO反饋走。我從代碼里理出的狀態(tài)序列是IDLE、ACK、START、DATA、ERROR、CRC、COMPLETE。IDLE狀態(tài)下MA時鐘保持高電平置位讀請求后狀態(tài)機拉低MA啟動傳輸編碼器在第一個周期內回Ack。數(shù)據(jù)位在DATA狀態(tài)逐一進入移位寄存器同時CRC計算模塊并行處理進入的比特。CRC校驗范圍要卡準。BISS-C標準用的CRC多項式是x^6x^11初值通常為0處理的是從Data字段最高位到Error字段最后一位的比特流。源碼里單獨做了一個CRC子模塊由狀態(tài)機控制使能Data段開始時就啟動CRC段來臨時把接收到的CRC值與本地計算值做比較。比較結果不進數(shù)據(jù)通路只生成crc_error標志這樣讀取邏輯不會因為CRC報錯就中斷整機運行。實現(xiàn)時還有一點容易被忽視CRC移位方向。標準里是按高位先發(fā)還是低位先發(fā)編碼器廠商之間并不統(tǒng)一。源碼在參數(shù)表里提供crc_lsb_first選項默認配合大多數(shù)國產編碼器選LSB first。如果發(fā)現(xiàn)CRC總報錯先去看編碼器手冊里單圈位數(shù)據(jù)的發(fā)送順序而不是馬上懷疑代碼邏輯。3. 源碼包功能拆解工程結構、IP核與頂層模塊劃分3.1 源碼目錄與文件職責拆源碼包第一步是看目錄和文件劃分。這套工程的常見結構是sources、tb、constraints三級目錄。sources里放RTL代碼和可選IP核tb里放仿真testbenchconstraints放管腳約束和時序約束。源碼包拿到手先把目錄樹拉出來確認哪些是核心RTL哪些是工程生成文件避免把緩存文件當代碼看。核心RTL文件職責可以按下表劃分。實際文件命名以包內為準我拆過的版本里會有一個頂層模塊和若干子模塊文件/模塊職責bissc_top頂層封裝對外接口統(tǒng)一內部實例化下面的子模塊bissc_clk_genMA時鐘發(fā)生器參數(shù)控制時鐘頻率和空閑電平bissc_rxSLO數(shù)據(jù)接收完成移位和位寬拼接bissc_crc6位CRC計算和校驗帶使能和復位bissc_state主狀態(tài)機協(xié)調發(fā)送MA時鐘和接收數(shù)據(jù)bissc_reg讀寫寄存器接口對接Avalon或AXI-LiteAXI-Lite對接在工程里是可選的。如果你的系統(tǒng)是純邏輯讀取不經過CPU那bissc_reg可以去掉頂層直接輸出position和error標志位。如果要做參數(shù)化配置比如運行中切換MA頻率或單雙圈模式保留寄存器接口更方便。3.2 時鐘域與復位策略FPGA工程里系統(tǒng)時鐘和MA時鐘是兩個域。系統(tǒng)時鐘通常50MHz或100MHzMA時鐘由分頻產生??鐣r鐘域處理不好位置數(shù)據(jù)會偶發(fā)跳變。源碼里MA時鐘生成沒有用計數(shù)器直接翻轉而是先做同步使能再用使能沿去驅動狀態(tài)機保證MA的每個周期對應固定的系統(tǒng)時鐘周期數(shù)。復位策略也不能馬虎。標準做法是整個BISS-C鏈路使用異步復位、同步釋放復位信號由頂層統(tǒng)一控制。復位有效時要同時清掉狀態(tài)機、移位寄存器、CRC模塊不能只復位主狀態(tài)機否則重新讀取時從站還是舊狀態(tài)。源碼里每個子模塊都帶rst_n端口頂層用同一個復位網絡代碼里可以看到復位釋放邏輯單獨處理。我還會留意全局復位和局部復位。工程里如果有軟復位寄存器和硬復位引腳兩個復位信號要做一個或門軟復位也要能清狀態(tài)機。不然在線升級或斷線重連后只能整板掉電才能恢復。源碼包里這部分邏輯做在頂層仿真時不容易暴露上板聯(lián)調才會發(fā)現(xiàn)。3.3 主要模塊接口說明頂層接口設計直接決定接入難度。我按下表列出最常見的一組端口信號方向以FPGA主站視角為準端口名方向說明clkin系統(tǒng)時鐘如50MHzrst_nin全局復位低有效ma_clkout差分MA時鐘輸出ma_clk_nout差分負端單端模式懸空slo_datainSLO數(shù)據(jù)輸入slo_data_nin差分負端單端模式不接read_reqin外部發(fā)起讀取請求脈沖positionout解析后的位置數(shù)據(jù)validout位置數(shù)據(jù)有效標志crc_erroroutCRC校驗錯誤標志busyout狀態(tài)機忙碌指示差分負端在單端編碼器下可以不接但MA必須區(qū)分正負。源碼里用OBUFDS差分輸出緩沖器原語單端接入時直接把負端約束到地。實現(xiàn)時建議把SLO輸入加一個IBUFDS再進邏輯避免信號質量差導致采樣誤判。頂層模塊的Verilog端口聲明通常長這樣我貼一段精簡過的接口代碼module bissc_top #( parameter SINGLE_TURN_BITS 17, parameter MA_CLK_DIV 20 )( input wire clk, input wire rst_n, input wire read_req, output wire ma_clk, output wire ma_clk_n, input wire slo_data, input wire slo_data_n, output wire [31:0] position, output wire valid, output wire crc_error, output wire busy ); wire [SINGLE_TURN_BITS-1:0] raw_position; bissc_state u_state ( .clk (clk), .rst_n (rst_n), .read_req (read_req), .ma_clk (ma_clk), .ma_clk_n (ma_clk_n), .slo_data (slo_data), .slo_data_n (slo_data_n), .valid (valid), .raw_position (raw_position) ); bissc_crc #( .DATA_WIDTH(SINGLE_TURN_BITS) ) u_crc ( .clk (clk), .rst_n (rst_n), .data_in (raw_position), .enable (valid), .error (crc_error) ); assign position {15d0, raw_position}; endmodule邏輯說明頂層模塊把MA時鐘生成、狀態(tài)機、CRC校驗分開實例化。SINGLE_TURN_BITS控制單圈數(shù)據(jù)位寬MA_CLK_DIV控制分頻系數(shù)。read_req是發(fā)起一次完整讀取的觸發(fā)脈沖valid拉高時表示position已經更新同時CRC結果也出來了。position拼接成32位方便接CPU總線。注意這里把CRC校驗放在valid之后實際工程里valid或crc_error是同時變的要讓上層邏輯同一拍采樣這兩個信號避免讀位置時校驗結果還是上一幀。參數(shù)說明SINGLE_TURN_BITS默認17對應常見的17位單圈編碼器如果是25位就改成25。MA_CLK_DIV是系統(tǒng)時鐘分頻系數(shù)50MHz系統(tǒng)時鐘配20就是2.5MHz MA如果編碼器支持10MHz這個參數(shù)可以壓到5。分頻系數(shù)不能太小因為狀態(tài)機在MA每個周期的處理邏輯也要時間分頻系數(shù)低于4時大概率時序緊張。4. 在FPGA上跑通BISS-C讀取仿真、管腳約束與板上調試4.1 搭建仿真Testbench的步驟源碼包里的tb目錄通常帶一個簡化編碼器模型不依賴真實硬件就能把狀態(tài)機和采樣邏輯跑通。這個模型會按BISS-C協(xié)議把位置數(shù)據(jù)、CRC和錯誤位拼接成串行比特流再按MA時鐘回推給主站。第一次跑仿真時務必先看波形里的MA時鐘頻率確認分頻系數(shù)生效接著再看ACK段和Data段是否按預期對齊。tb里核心邏輯是模擬編碼器從站的串行反饋我一般會寫一個簡化版的行為模型當作參考代碼大致思路是這樣的module bissc_slave_model #( parameter DATA_WIDTH 17 )( input wire ma_clk, input wire read_start, output reg slo_data ); reg [DATA_WIDTH-1:0] position_data; reg [5:0] crc_value; reg sending; reg [5:0] bit_cnt; always (posedge ma_clk or negedge read_start) begin if (!read_start) begin sending 1b1; bit_cnt 6d0; position_data 17h1A2B3; end else if (sending) begin bit_cnt bit_cnt 1b1; case (bit_cnt) 6d0: slo_data 1b0; // Ack 6d1: slo_data 1b0; // Start 6d2: slo_data 1b0; // Control default: begin if (bit_cnt 3 DATA_WIDTH) slo_data position_data[DATA_WIDTH-1 - (bit_cnt-3)]; else slo_data crc_value[5 - (bit_cnt - 3 - DATA_WIDTH)]; end endcase end end endmodule邏輯說明這個模型在read_start信號有效后把Ack、Start、Control依次拉低然后按高位到低位的順序把position_data打出去最后輸出CRC。它沒包含Error位實際使用時可以在Control之后插入一個可變Error位再把CRC寬度對應調整。仿真時用這個模型可以驗證主站是否采到正確位置、CRC是否匹配也能用來檢查狀態(tài)機是否能正確處理單幀結束。參數(shù)說明DATA_WIDTH要跟主站的SINGLE_TURN_BITS保持一致不一致時CRC必然報錯。read_start在真實編碼器里是由MA時鐘起始沿觸發(fā)的這里用獨立信號是為了讓模型知道一幀開始避免在仿真初始時刻誤發(fā)數(shù)據(jù)。position_data作為測試源隨便填但要注意別填超過DATA_WIDTH范圍的值否則移位時會丟高位。4.2 管腳約束與電氣特性注意管腳約束是上板后最容易出問題的地方。BISS-C的MA時鐘是差分對SLO數(shù)據(jù)如果也是差分就必須用FPGA的差分IO組不能隨便選兩個普通IO當差分對。差分正端和負端要約束在同一個差分組內否則綜合工具會報錯或者生成的時序特別差。我在約束文件里會用set_property PACKAGE_PIN指定正負端同時用set_property DIFF_TERM TRUE打開片上差分端接。電氣特性上編碼器端的線纜長度會直接影響最高MA頻率。線長超過1米時2.5MHz的MA一般沒問題超過5MHz之后上升沿變緩SLO數(shù)據(jù)采樣點就會漂。源碼包里的MA_CLK_DIV留了很大的調整空間但硬件上最好在編碼器供電端加濾波電容信號線走差分對避免因為電機動力線耦合噪聲導致偶發(fā)CRC錯誤。約束文件里時序約束要關注MA輸出到SLO輸入的路徑。SLO是編碼器隨MA時鐘回傳的數(shù)據(jù)從MA輸出沿到SLO有效沿之間存在編碼器響應時間這個時間通常為幾百納秒。FPGA綜合工具不能自動知道這條外部路徑要在約束里用set_max_delay或虛擬時鐘把這個外部延遲約束進去。我建議把MA時鐘設成generated clockSLO數(shù)據(jù)按該時鐘域做input delay約束否則布局布線后采樣時序沒保證。4.3 用ILA抓實際時序上板調試時ILA是最直接的驗證工具。先在頂層把ma_clk、slo_data、busy、valid、crc_error全部引到ILA探針里采樣深度建議設成4096采樣頻率用系統(tǒng)時鐘。觸發(fā)條件設為read_req上升沿這樣能看到完整一幀從發(fā)起請求到valid拉高的過程。抓到的波形先看MA時鐘發(fā)包個數(shù)再數(shù)SLO有效位數(shù)。如果MA時鐘數(shù)量固定但SLO數(shù)據(jù)全為高或全為低通常是SLO輸入管腳約束不對或者差分正負接反。如果MA時鐘數(shù)量多了說明狀態(tài)機沒有在CRC結束后及時停止時鐘編碼器把多余時鐘當作下一幀起始波形里會看到連續(xù)兩幀粘連。ILA只在調試階段使用量產工程里要把ILA核去掉或置為不例化不然邏輯資源和時序性能會被拖累。我之前調試一片板子時忘了屏蔽ILA結果顯示時序收斂沒問題但運行時CRC偶爾報錯后來定位到是ILA核插入導致MA時鐘路徑變長。從那以后我把探針做成宏開關仿真和調試開啟正式綜合時強制關閉。5. BISS-C調試避坑時序翻車、CRC錯位與熱插拔問題5.1 現(xiàn)象MA時鐘頻率過高導致編碼器無響應現(xiàn)象把MA_CLK_DIV設為4系統(tǒng)時鐘50MHzMA跑到12.5MHz編碼器完全沒反應SLO一直高電平狀態(tài)機卡在ACK階段valid永遠不拉高。原因編碼器從站對MA時鐘有最大頻率限制常規(guī)編碼器支持到5MHz或10MHz12.5MHz超出協(xié)議要求從站內部邏輯跟不上直接不應答。解決查編碼器手冊的通信頻率范圍把MA_CLK_DIV調回合法范圍。調試階段從低速開始先用5分頻跑通再逐步調高。如果必須跑高頻就要考慮縮短線纜長度、降低負載電容。MA時鐘不是越快越好它只影響讀取刷新率伺服控制周期一般幾百微秒2.5MHz完全夠用。5.2 現(xiàn)象SLO數(shù)據(jù)在第二拍才穩(wěn)定采樣點選錯現(xiàn)象仿真時數(shù)據(jù)正確上板后position偶發(fā)跳變ILA抓波形發(fā)現(xiàn)SLO數(shù)據(jù)在MA上升沿之后還有抖動采樣點打在了數(shù)據(jù)穩(wěn)定之前。原因編碼器并非在MA上升沿瞬間更新SLO數(shù)據(jù)線上存在從站輸出延遲。MA時鐘路徑與SLO回傳路徑的累計延遲不一定能被FPGA內部時鐘對齊單純用上升沿采樣是碰運氣。解決在狀態(tài)機里把SLO采樣點改為MA下降沿之后半個系統(tǒng)時鐘周期或者直接生成本地延遲采樣使能讓采樣點避開數(shù)據(jù)變化沿。具體做法是計數(shù)MA周期在周期中間位置產生采樣脈沖。這個邏輯源碼包里可以參數(shù)化控制我一般默認開延遲采樣只有對延遲極小的編碼器才切回上升沿直接采樣。注意延遲采樣不能跨時鐘域要在系統(tǒng)時鐘域內生成同步使能。5.3 現(xiàn)象CRC校驗總報錯數(shù)據(jù)移位一位現(xiàn)象valid正常拉高position值看起來有規(guī)律變化但數(shù)值整體偏小或每位都像左移了一位crc_error一直為高。原因CRC校驗范圍或位序配置不對。常見是編碼器數(shù)據(jù)幀里多了一位Error字段而源碼里把Error位當成了Data的一部分或者CRC計算時把Ack和Start也納入了范圍導致校驗結果對不上。解決先逐項核對Data字段位寬和CRC覆蓋寬度。用ILA抓一幀完整SLO序列人工把里面的Ack、Start、Control、Data、Error、CRC字段標出來再跟源碼的狀態(tài)機位寬對照。CRC位序也在這里看如果編碼器手冊寫明數(shù)據(jù)高位先發(fā)就把crc_lsb_first設為0。還有一個細節(jié)CRC計算需要把Error位包含進去即使Error位固定為0也不能跳過否則CRC計算結果會整體偏移。5.4 現(xiàn)象上電后第一次讀卡死狀態(tài)機不復位現(xiàn)象系統(tǒng)上電后第一次發(fā)read_reqbusy信號拉高后一直不拉低valid和crc_error都不變化但斷電重新上電后第一次讀取正常再觸發(fā)一次卡死。原因狀態(tài)機在上電或復位釋放瞬間收到未定義的SLO電平把狀態(tài)誤判成別的狀態(tài)而狀態(tài)機沒有看門狗超時機制卡在某個錯誤狀態(tài)不返回IDLE。另一種可能是在線調試時復位信號比系統(tǒng)時鐘先釋放狀態(tài)機寄存器處于亞穩(wěn)態(tài)。解決源碼里需要有一個超時計數(shù)器始發(fā)讀取后如果超過預設周期數(shù)沒有收到完整幀就把狀態(tài)機強制復位回IDLE。我是直接把超時計數(shù)并到MA時鐘產生模塊里數(shù)滿2048個MA周期沒完成就自動拉resync信號清掉內部狀態(tài)。另外把復位信號的同步釋放邏輯單獨做了兩級同步器確保復位釋放時跟著系統(tǒng)時鐘沿不產生毛刺。加完這兩個措施后熱拔插編碼器再接回去也能自動恢復讀取。6. 讓這套源碼更通用參數(shù)化設計、多圈處理與后續(xù)擴展6.1 參數(shù)化總線寬度與CRC多項式源碼包里最值得改的是把位寬做成參數(shù)。單圈位寬、MA分頻系數(shù)、CRC多項式系數(shù)、采樣延遲周期全部參數(shù)化后同一套RTL可以適配多款編碼器不用每次復制工程再手改邏輯。我通常會在頂層增加一個參數(shù)組parameter SINGLE_TURN_BITS 17, parameter MULTI_TURN_BITS 0, parameter MA_CLK_DIV 20, parameter CRC_POLY 6b000011, parameter CRC_INIT 6d0, parameter SAMPLE_DELAY 1邏輯說明MULTI_TURN_BITS為0時表示只有單圈輸出拼接時把多圈段去掉。CRC_POLY和CRC_INIT直接傳到CRC子模塊換編碼器時只需查手冊改這兩個值。SAMPLE_DELAY控制采樣點相對MA時鐘沿的延遲周期數(shù)改成參數(shù)后不用動狀態(tài)機。這些參數(shù)在綜合時都是常量不會額外消耗寄存器。參數(shù)化的意義在于維護成本。一個項目里同時用了17位和21位編碼器只需要例化兩次頂層模塊分別配不同參數(shù)不需要維護兩套代碼。后續(xù)如果換上帶多圈功能的編碼器只需把MULTI_TURN_BITS設為12之類輸出位寬自動擴展。6.2 多圈計數(shù)與掉電保存的處理技巧BISS-C本身是把多圈位數(shù)直接從編碼器讀出來的FPGA端只負責把多圈段拼進位置數(shù)據(jù)。如果編碼器不帶電池備份多圈主站側的計數(shù)掉電后會丟失。源碼包通常不包含掉電保存邏輯但工程里一般會留出接口。我常用的做法是外接SPI Flash或者鐵電存儲器在每幀數(shù)據(jù)valid有效時把多圈計數(shù)值和單圈原始值一起寫入備份區(qū)寫入頻率不能是每一幀都寫Flash壽命會很快耗盡。實際做法是快速連續(xù)變化時只緩存到RAM斷電瞬間檢測掉電信號再緊急寫入一次。掉電檢測需要用模擬比較器監(jiān)測24V或5V供電FPGA里可以留一個電平輸入給中斷處理。如果編碼器本身支持多圈并且內置電池那FPGA端就不需要備份直接讀出來的就是完整位置。判斷依據(jù)是編碼器手冊里的“多圈類型”字段是電池備份還是純機械多圈。機械多圈掉電后讀數(shù)仍在但需要上電后做一次絕對位置零點校準。6.3 一條經驗強制走一遍完整回環(huán)測試最后的建議是把這套源碼當作一個整體測試對象而不是只測讀取功能。我最常做的是在FPGA內部做回環(huán)把頂層模塊的position和valid信號引出到另一個仿真子模塊模擬CPU讀寫總線讓數(shù)據(jù)在內部轉一圈再寫回編碼器模型對比是否完全一致?;丨h(huán)測試能同時覆蓋狀態(tài)機、CRC信號和valid時序比單看ILA波形更能發(fā)現(xiàn)問題。我曾經在改參數(shù)時漏掉了CRC_POLY的位寬回環(huán)測試跑到一半crc_error拉高位置數(shù)據(jù)跟預期差了幾個值順著回環(huán)鏈路才定位到是CRC子模塊的輸入位寬沒有跟隨頂層參數(shù)變化。從那以后我每次改參數(shù)都強制走一遍完整回環(huán)測試仿真通過才允許上板這套流程已經幫我攔下了不少低級錯誤。如果只是做一次性讀取驗證也可以把讀到的位置值通過串口或以太網發(fā)出來但串口帶寬低高速運動時數(shù)據(jù)更新率不夠。回環(huán)測試和ILA配合是最穩(wěn)的組合既能看到協(xié)議層細節(jié)又能驗證數(shù)據(jù)正確性。希望這套調試流程能幫你在BISS-C項目上少走點彎路。本文還有配套的精品資源點擊獲取