據(jù)鏈路排查)
簡介面向無線通信、SDR與測試測量開發(fā)者及AD9361初學(xué)者這份AD9361寄存器配置案例文檔圍繞AD936X評估板的配置流程展開重點(diǎn)覆蓋參考時(shí)鐘、采樣率與帶寬、LVDS接口及電平、AGC/MGC增益模式、收發(fā)頻率與衰減值等關(guān)鍵參數(shù)并說明如何生成Low Level Scripting配置文本及補(bǔ)充通道打開命令。資源包僅含1個(gè)docx文檔壓縮包約1.69MB便于集中查閱和離線保存。已有369人學(xué)習(xí)適合需要理解AD9361配置邏輯、核對參數(shù)設(shè)置與建立調(diào)試思路的工程師參考也可作為評估板實(shí)驗(yàn)和項(xiàng)目初始化階段的資料底稿。文檔還提示可結(jié)合安裝目錄中的800MHz、2300MHz、5000MHz增益表進(jìn)行手動(dòng)增益調(diào)整為后續(xù)精細(xì)化配置與問題排查提供依據(jù)。1. 一枚射頻芯片的“開機(jī)”是幾百條 SPI 寫成的序列很多人第一次看 AD9361 的配置都會(huì)以為它像配一個(gè)普通的收發(fā)器填頻點(diǎn)、填帶寬、填增益點(diǎn)一下生成事情就結(jié)束了。直到把軟件生成的 txt 打開看到密密麻麻幾百上千條SPIWrite才會(huì)意識(shí)到自己面對的不是一組參數(shù)而是一張有先后順序的寫表。AD9361 的寄存器配置之所以難不是地址多而是這些地址之間存在強(qiáng)耦合時(shí)鐘沒起、PLL 沒鎖、校準(zhǔn)沒跑完后面寫進(jìn)去的值要么被忽略要么按舊時(shí)鐘生效芯片不會(huì)報(bào)錯(cuò)它只是安靜地不吐數(shù)據(jù)。把這份配置案例拆開看能看到“向?qū)Ю锏囊粋€(gè)數(shù)字”如何一路變成“寄存器里的一組位”也能看到為什么末尾必須手動(dòng)補(bǔ)那三行。2. 寄存器層為什么 AD9361 的配置是一張帶先后順序的寫入表2.1 24 位幀與 10 位地址空間AD9361 的 SPI 是典型的三字節(jié)幀結(jié)構(gòu)16 位指令 8 位數(shù)據(jù)MSB 先行。指令字的最高位是讀寫標(biāo)志剩下的低位放地址寫模式下那個(gè)標(biāo)志位清零讀模式下置 1。地址空間是 10 位也就是 0x000 到 0x3FF 共 1024 個(gè)位置但芯片實(shí)際用到的寄存器分布在各段中間還夾著不少保留區(qū)。這個(gè)幀結(jié)構(gòu)決定了一件容易被忽略的事每寫一個(gè)寄存器就要完整走一次 24 位傳輸芯片沒有 burst 模式。你沒法像操作一片普通閃存那樣“從某個(gè)地址開始連續(xù)寫 256 字節(jié)”只能一個(gè)地址一次幀。這是初始化腳本動(dòng)輒上千行的直接原因也是驅(qū)動(dòng)里那段循環(huán)為什么看起來這么樸素。/* 寫入一個(gè) 8 位寄存器固定 3 字節(jié)沒有地址自增 */ static int ad9361_spi_write(struct spi_dev *spi, uint16_t addr, uint8_t val) { uint8_t buf[3]; buf[0] (addr 8) 0x03; /* 地址只有 10 位高字節(jié)只留 bit1:0 */ buf[1] addr 0xFF; buf[2] val; /* 數(shù)據(jù)段MSB 先行 */ return spi_xfer(spi, buf, 3); /* 一次幀 一次片選拉低 */ } /* 讀指令字最高位置 1數(shù)據(jù)段在 MISO 上回來 */ static int ad9361_spi_read(struct spi_dev *spi, uint16_t addr, uint8_t *val) { uint8_t buf[3] { (uint8_t)(0x80 | ((addr 8) 0x03)), addr 0xFF, 0x00 }; int ret spi_xfer(spi, buf, 3); *val buf[2]; return ret; }addr是被掩到 10 位的如果上層不小心寫了個(gè) 0x400 以上的地址高位會(huì)被截?cái)嘧詈舐涞揭粋€(gè)完全不相干的寄存器上這種錯(cuò)誤在邏輯分析儀上看起來“寫成功了”但芯片行為詭異。val是 8 位AD9361 很多功能位集中在同一個(gè)字節(jié)里改一個(gè)功能時(shí)如果直接賦值而不是讀改寫會(huì)把同字節(jié)的其它位一起沖掉這是初始化腳本之外的運(yùn)行時(shí)配置最常見的翻車點(diǎn)。SPI 時(shí)鐘本身也不宜拉滿手冊給了 SCLK 上限實(shí)際驅(qū)動(dòng)普遍降頻到十幾 MHz 跑初始化因?yàn)殚L排線 探針負(fù)載下眼圖很容易糊掉。2.2 三個(gè)必須先跨過的門檻時(shí)鐘、校準(zhǔn)、使能把這些寫操作按功能歸類會(huì)發(fā)現(xiàn)它們嚴(yán)格分成三段而且段與段之間有硬性依賴。第一段是時(shí)鐘。參考時(shí)鐘進(jìn)來之后BBPLL 要先鎖定才能給 ADC、DAC 和數(shù)字鏈路提供工作時(shí)鐘。這一段沒完成就往下寫采樣率相關(guān)的寄存器寫進(jìn)去的值會(huì)被當(dāng)成“基于舊時(shí)鐘的有效配置”等 PLL 真正鎖上芯片內(nèi)部的時(shí)序已經(jīng)和你預(yù)期的不一樣了。判斷 PLL 是否鎖定靠的是回讀狀態(tài)位如果只靠延時(shí)低溫或電源爬升慢的時(shí)候時(shí)序余量會(huì)被吃掉。第二段是校準(zhǔn)。AD9361 內(nèi)部有大量模擬校準(zhǔn)接收鏈的直流偏移、正交誤差、基帶濾波器的 RC 時(shí)間常數(shù)、發(fā)射鏈的鏡像抑制。這些校準(zhǔn)由寫某個(gè)觸發(fā)位啟動(dòng)跑完之后狀態(tài)位翻轉(zhuǎn)。校準(zhǔn)的時(shí)長和參考時(shí)鐘頻率、帶寬設(shè)置都有關(guān)系帶寬設(shè)得越窄濾波器時(shí)間常數(shù)越大校準(zhǔn)越慢。很多“配置完沒數(shù)據(jù)”的現(xiàn)場最后查出來是校準(zhǔn)觸發(fā)了但沒等完成后續(xù)寫使能位時(shí)把校準(zhǔn)狀態(tài)機(jī)打斷了。第三段才是使能。發(fā)送/接收通道、數(shù)據(jù)端口、內(nèi)部環(huán)路都是最后一步打開。這個(gè)順序不能反反了就會(huì)出現(xiàn)“使能位是 1但數(shù)據(jù)通路里灌的是默認(rèn)系數(shù)”的情況。2.3 腳本就是這張表解析、校驗(yàn)、下發(fā)軟件生成的 txt 本質(zhì)上就是這張三段的展開形式只是它把“等校準(zhǔn)完成”這類動(dòng)作省掉了只留下純寫操作。所以驅(qū)動(dòng)側(cè)第一件事不是照著抄而是先把它解析成結(jié)構(gòu)化的操作列表做一遍地址和值的合法性檢查。import re # 例SPIWrite 0x2A6 0x0E // 注釋 LINE re.compile(rSPIWrite\s0x([0-9A-Fa-f]{1,3})\s0x([0-9A-Fa-f]{2})) def load_script(path): ops [] for lineno, raw in enumerate(open(path, encodingutf-8), 1): line raw.split(//)[0].strip() # 去掉行尾注釋 if not line: continue m LINE.match(line) if not m: raise ValueError(f{lineno}: 無法解析 {raw!r}) addr, val int(m.group(1), 16), int(m.group(2), 16) if addr 0x3FF: raise ValueError(f{lineno}: 地址越界 {addr:#x}) ops.append((addr, val)) return ops ops load_script(ad9361_init.txt) print(len(ops), 條寫操作) print(首條, hex(ops[0][0]), 末條, hex(ops[-1][0]))LINE里地址允許 1 到 3 位十六進(jìn)制是因?yàn)椴煌浖姹旧傻奈募镉械牡刂凡谎a(bǔ)前導(dǎo)零直接按固定 3 位解析會(huì)把0xA6這種行全部漏掉表現(xiàn)就是“腳本下發(fā)完了但芯片少配了一段”。0x3FF的越界檢查看著多余實(shí)際能擋住手工改腳本時(shí)把地址打錯(cuò)一位的情況否則截?cái)嘀髮懙奖A魠^(qū)芯片不會(huì)有任何反饋。解析出來的ops長度是一個(gè)很有用的指紋同一份配置不同版本軟件生成的條數(shù)會(huì)有差異條數(shù)對不上就說明兩邊用的模板不是一套。2.4 末尾那三行配置完成不等于通道打開配置軟件生成的腳本默認(rèn)停在“參數(shù)都寫進(jìn)去了但通道還沒使能”的狀態(tài)。它不替你打開通道是因?yàn)橐灰_、什么時(shí)候開取決于你的基帶什么時(shí)候準(zhǔn)備好。所以案例里明確寫了要在文本末尾補(bǔ)三行。# 追加在腳本末尾作用是把芯片從配置態(tài)切到工作態(tài) ENABLE_TAIL [ (0x3F4, 0x01), # 寫使能位具體地址以你所用軟件生成的尾部注釋為準(zhǔn) (0x3F5, 0x03), # 打開收發(fā)數(shù)據(jù)通路 (0x3F6, 0x00), # 清掉殘留的測試/環(huán)回模式位 ] def program(spi, ops): for addr, val in ops: ad9361_spi_write(spi, addr, val) for addr, val in ENABLE_TAIL: ad9361_spi_write(spi, addr, val) # 關(guān)鍵回讀確認(rèn)而不是寫完就當(dāng)成功 for addr, expect in ENABLE_TAIL: got ad9361_spi_read(spi, addr) assert got expect, f{addr:#x} 期望 {expect:#04x} 實(shí)得 {got:#04x}不同版本的配置軟件生成的收尾地址不完全一致這是必須提醒的一點(diǎn)不要直接抄別人腳本尾部的三行地址而要回讀驗(yàn)證。判斷方法很樸素——寫之前讀一次是 0寫之后讀是期望值那它就是使能位如果寫前寫后都一樣說明這個(gè)地址在你當(dāng)前版本里沒有意義。最后那句斷言是整套流程里性價(jià)比最高的一行代碼它把“靜默失敗”變成了“立刻停在這里”。3. 采樣率與插值濾波改一個(gè)數(shù)為什么牽動(dòng)整條數(shù)字鏈路3.1 數(shù)字鏈路的串聯(lián)結(jié)構(gòu)AD9361 的接收路徑不是一個(gè)可編程濾波器而是一串固定級(jí)聯(lián)的半帶濾波器加一級(jí)可編程 FIR。信號(hào)從 ADC 出來之后依次穿過 HB3、HB2、HB1每一級(jí)要么 2 倍抽取要么旁路最后是可編程 FIR支持 1、2、4 倍抽取。發(fā)射路徑完全鏡像FIR 先插值再依次穿 HB1、HB2、HB3。這個(gè)結(jié)構(gòu)決定了“采樣率”不是一個(gè)可以隨便填的數(shù)字而是整條鏈路各級(jí)倍率的乘積。你把輸出采樣率從 20 MSPS 改成 30 MSPS軟件要重新分配各級(jí)的抽取比重新計(jì)算 FIR 系數(shù)重新選 BBPLL 的分頻最后重新算模擬濾波器的校準(zhǔn)碼。這就是為什么配置軟件里改一下采樣率濾波器特性曲線會(huì)整條跟著動(dòng)。級(jí)方向可選倍率典型作用HB3RX 抽取 / TX 插值1 或 2靠近 ADC抑制高頻鏡像HB2RX 抽取 / TX 插值1 或 2中間級(jí)通帶最寬HB1RX 抽取 / TX 插值1 或 2過渡帶收窄FIRRX 抽取 / TX 插值1、2、4唯一可自定義系數(shù)的級(jí)半帶濾波器的特點(diǎn)是通帶平坦、過渡帶固定代價(jià)是每一級(jí)只能 2 倍變比所以總抽取比永遠(yuǎn)是 2 的冪次乘上 FIR 的 1、2、4組合出來的采樣率是一組離散值不是連續(xù)可調(diào)。理解這一點(diǎn)就不會(huì)再糾結(jié)“為什么我填 25 MSPS 它給我 24.576”。3.2 從參考時(shí)鐘反推實(shí)際數(shù)據(jù)率鏈路上一共有三個(gè)時(shí)鐘要算清楚參考時(shí)鐘、BBPLL 輸出、ADC/DAC 時(shí)鐘最后才是數(shù)據(jù)端口上的采樣率。案例里把參考時(shí)鐘設(shè)成 40 MHz這個(gè)值不是隨便選的——它是一個(gè)能被多種常用采樣率整除的折中點(diǎn)倍頻之后容易落在 BBPLL 的輸出范圍內(nèi)再分頻就能得到比較整齊的 ADC 時(shí)鐘。def rx_chain(f_ref40e6, bbp_mult32, hb12, hb22, hb32, fir4): f_bbpll f_ref * bbp_mult # 40 MHz * 32 1280 MHz落在 BBPLL 輸出范圍內(nèi) f_adc f_bbpll / 2 # 再 2 分頻 - 640 MHz 送 ADC dec hb1 * hb2 * hb3 * fir # 總抽取比 2*2*2*4 32 return f_bbpll, f_adc, f_adc / dec f_bbpll, f_adc, fs rx_chain() print(fBBPLL {f_bbpll/1e6:.0f} MHz, ADC {f_adc/1e6:.0f} MHz, 單路 {fs/1e6:.2f} MSPS) # BBPLL 1280 MHz, ADC 640 MHz, 單路 20.00 MSPSbbp_mult是 BBPLL 的倍頻比實(shí)際由整數(shù)部分加小數(shù)部分共同決定這里取整是示意。hb1/hb2/hb3/fir就是上表里的各級(jí)倍率。函數(shù)返回的fs是單路 I 或單路 Q 的采樣率——這一點(diǎn)在案例里被特意強(qiáng)調(diào)過因?yàn)榕渲媒缑嫔咸畹木褪沁@個(gè)數(shù)而鏈路上跑的數(shù)據(jù)率、接口時(shí)鐘頻率還要按 I/Q 兩路交織和端口數(shù)量再折算一次。把“界面填的數(shù)”和“總線上跑的時(shí)鐘”混為一談是新手最容易犯的第一個(gè)錯(cuò)。3.3 帶寬是另一個(gè)獨(dú)立旋鈕采樣率和模擬帶寬不是一回事。采樣率由數(shù)字抽取鏈決定模擬帶寬由接收鏈里的基帶低通濾波器決定兩者的寄存器是分開的。帶寬設(shè)得比采樣率對應(yīng)的奈奎斯特頻率還寬帶外噪聲全進(jìn)來AGC 會(huì)誤判信號(hào)強(qiáng)度設(shè)得太窄有用信號(hào)的邊沿被削掉EVM 直接崩。模擬濾波器的截止頻率靠一組可調(diào)電容陣列實(shí)現(xiàn)所以它需要校準(zhǔn)。校準(zhǔn)碼和帶寬設(shè)置綁定帶寬改了就必須重跑校準(zhǔn)。這也是為什么案例里在“設(shè)置采樣速率和帶寬”這一步后面跟了一句“觀察濾波器特性”——它不是裝飾性的步驟而是在確認(rèn)數(shù)字濾波器和模擬濾波器的過渡帶沒有互相打架。4. LVDS 與 DATA_CLK電平、時(shí)延與“抓不到數(shù)據(jù)”的真相4.1 三種接口模式的分野AD9361 的數(shù)據(jù)端口可以工作在 CMOS 單端模式也可以工作在 LVDS 差分模式。CMOS 模式下 P0 和 P1 兩組總線各自傳一部分?jǐn)?shù)據(jù)速率受限于單端信號(hào)的邊沿質(zhì)量LVDS 模式下總線是差分的DATA_CLK 由芯片自己生成并隨數(shù)據(jù)一起送出速率能上去代價(jià)是必須處理好差分對和終端匹配。案例里選擇 LVDS 之后備注“DATA_CLK 自動(dòng)生成”這句話背后的機(jī)制是LVDS 模式下芯片是數(shù)據(jù)源它輸出幀時(shí)鐘RX_FRAME和數(shù)據(jù)時(shí)鐘DATA_CLK接收端必須按這個(gè)時(shí)鐘采樣不能自己另起一個(gè)時(shí)鐘去追。接收端是 slave芯片是 master搞反了方向就永遠(yuǎn)對不齊。很多人第一版 FPGA 代碼里習(xí)慣性用自己的系統(tǒng)時(shí)鐘去采數(shù)據(jù)口結(jié)果抓到的全是隨機(jī)跳變。4.2 為什么 75 mV 的擺幅抓不到數(shù)據(jù)配置界面里 LVDS 擺幅有好幾檔案例里明確寫了不要用 75 mV。原因不在芯片在鏈路的信噪比預(yù)算。LVDS 接收端判斷的是差分電壓標(biāo)準(zhǔn)接收器的閾值在幾十毫伏這個(gè)量級(jí)看起來 75 mV 夠用。但實(shí)際鏈路里有三處損耗芯片引腳到連接器的走線、連接器本身、接收端 PCB 的走線。再加上如果終端電阻沒焊或者阻值不對差分信號(hào)會(huì)在末端反射眼圖直接塌掉。75 mV 出發(fā)到接收端可能只剩三四十毫伏疊加串?dāng)_和電源噪聲采樣判決就變成擲骰子。/* 擺幅與時(shí)延的掃描一次改一個(gè)變量其余保持不變 */ static const uint8_t swing_tab[] { 0x00, 0x01, 0x02, 0x03 }; /* 對應(yīng)不同檔位擺幅 */ for (int s 0; s ARRAY_SIZE(swing_tab); s) { ad9361_write(REG_LVDS_SWING, swing_tab[s]); for (int d 0; d 16; d) { ad9361_write(REG_DATA_DELAY, d); /* 亞周期步進(jìn)的延時(shí)線 */ int err capture_check(0x55AA, 4096); /* 用固定碼型統(tǒng)計(jì)錯(cuò)誤數(shù) */ printf(swing%d delay%2d err%d\n, s, d, err); } }swing_tab是擺幅檔位具體編碼以寄存器表為準(zhǔn)REG_DATA_DELAY是數(shù)據(jù)路徑延時(shí)寄存器步進(jìn)是 DATA_CLK 周期的若干分之一。這段掃描代碼的價(jià)值不在于結(jié)果而在于方法同時(shí)只動(dòng)一個(gè)變量。先固定延時(shí)掃擺幅找到錯(cuò)誤數(shù)為 0 的那一檔再固定擺幅掃延時(shí)找到錯(cuò)誤數(shù)為 0 的窗口。兩個(gè)維度一起掃最后得到一張二維圖你根本分不清是擺幅救了它還是延時(shí)救了它。4.3 延時(shí)窗口要取中間不要取邊緣掃出來一串錯(cuò)誤數(shù)為 0 的延時(shí)值正確的做法是取窗口正中而不是第一個(gè)能用的值。因?yàn)檠訒r(shí)窗口的寬度會(huì)隨溫度、電源電壓、器件批次漂移。取在邊緣常溫下能跑一上高低溫試驗(yàn)箱就開始偶發(fā)誤碼而且這種誤碼率極低跑一晚上才錯(cuò)幾個(gè)包排查起來極其折磨。判斷窗口質(zhì)量有個(gè)土辦法在掃描時(shí)把錯(cuò)誤數(shù)打印成一行肉眼就能看出哪些延時(shí)值是“敞口”的、哪些是“擦邊”的。擦邊值哪怕當(dāng)前是 0 錯(cuò)誤也不要選。這一條是純血淚經(jīng)驗(yàn)文檔里不會(huì)寫。另外用示波器直接量 LVDS 差分對時(shí)要注意探頭負(fù)載普通單端探頭一掛上去差分?jǐn)[幅會(huì)被明顯拉低你看到的波形比實(shí)際差。要么用差分探頭要么老老實(shí)實(shí)靠碼型比對。5. 排查手冊增益表、AGC/MGC 與頻點(diǎn)的翻車現(xiàn)場5.1 增益控制的兩種人格AD9361 的接收增益有兩條截然不同的控制路徑。自動(dòng)增益控制AGC是一條閉環(huán)芯片內(nèi)部的功率檢測器盯著基帶信號(hào)能量和設(shè)定的高/低門限比較超出就減增益低于就加增益中間有一段保持區(qū)。它有幾套預(yù)設(shè)的環(huán)路性格——慢速、快速、混合區(qū)別在于攻擊時(shí)間和增益步進(jìn)的激進(jìn)程度。適合的場景是信號(hào)強(qiáng)度動(dòng)態(tài)范圍大、你又不關(guān)心瞬時(shí)幅度的情況。手動(dòng)增益控制MGC則完全相反你往寄存器里寫一個(gè)增益索引芯片照著查表把 LNA、TIA、混頻器、基帶各級(jí)的衰減組合配置成那個(gè)索引對應(yīng)的值然后就不動(dòng)了。適合需要精確知道當(dāng)前增益、或者要做外部功率統(tǒng)計(jì)的場景。維度AGCMGC響應(yīng)速度由環(huán)路參數(shù)決定毫秒到微秒級(jí)寫入即生效無環(huán)路延遲增益精度動(dòng)態(tài)調(diào)整瞬時(shí)值不可預(yù)知索引確定增益確定適用場景突發(fā)信號(hào)、動(dòng)態(tài)范圍大已知功率、需要可復(fù)現(xiàn)的實(shí)驗(yàn)主要風(fēng)險(xiǎn)參數(shù)不當(dāng)時(shí)增益來回振蕩索引與頻段不匹配導(dǎo)致增益偏差巨大AD9361 的接收增益范圍是 0 到 76 dB按 1 dB 步進(jìn)索引發(fā)射側(cè)是衰減范圍 0 到 89.75 dB步進(jìn) 0.25 dB。注意發(fā)射是“衰減”數(shù)值越大功率越小方向和接收增益相反寫反了會(huì)把功放直接頂死。5.2 增益表是按頻段分段的這是最大的坑案例里有一句非常關(guān)鍵的話增益表在安裝目錄下搜gaintable有 800 MHz、2300 MHz、5000 MHz 三個(gè)表格。這句話說明增益表不是一張全頻段通用的表而是按頻段分段標(biāo)定的。同一個(gè)增益索引在 800 MHz 頻段和 5000 MHz 頻段對應(yīng)的內(nèi)部衰減組合是不一樣的因?yàn)椴煌l段下 LNA 和混頻器的增益特性本來就不同。所以換頻點(diǎn)的時(shí)候如果只改本振頻率而不換增益表就會(huì)出現(xiàn)“信號(hào)明明很強(qiáng)讀出來的幅度卻像被掐住了”或者反過來“底噪被放得老高”的現(xiàn)象。這種問題在頻譜儀上不容易直接看出來只有在做靈敏度或者 EVM 測試時(shí)才會(huì)暴露。本振本身的計(jì)算是整數(shù)分頻加小數(shù)分頻小數(shù)部分負(fù)責(zé)在整數(shù)步進(jìn)之間插值最終頻率誤差遠(yuǎn)小于一個(gè)信道帶寬。但要注意本振鎖定需要時(shí)間從一個(gè)頻點(diǎn)跳到另一個(gè)頻點(diǎn)之后立刻開始收數(shù)據(jù)前幾個(gè)包大概率是廢的因?yàn)?PLL 環(huán)路還在收斂。5.3 五條踩坑記錄現(xiàn)象一腳本全部下發(fā)成功回讀也正常但數(shù)據(jù)口上一個(gè)跳變都沒有。原因腳本末尾沒有補(bǔ)使能行芯片停在配置態(tài)數(shù)字通路的輸出被門控住了?;蛘哐a(bǔ)了但補(bǔ)在了解析器不認(rèn)識(shí)的位置——比如補(bǔ)在文件最前面或者行尾注釋格式和解析器不匹配被整行跳過。 解決回讀使能寄存器確認(rèn)位確實(shí)從 0 變 1同時(shí)打印實(shí)際下發(fā)的操作條數(shù)和腳本里的行數(shù)對一遍?,F(xiàn)象二把采樣率調(diào)高之后數(shù)據(jù)口上一直是 0xAAA 或 0x555 交替像固定碼型。原因接收端采樣時(shí)鐘跟不上新的數(shù)據(jù)率或者鏈路總抽取比和新采樣率不匹配輸出端實(shí)際上在重復(fù)輸出同一個(gè)樣本。 解決按第 3 章的公式反推 BBPLL 和各級(jí)倍率確認(rèn)總抽取比和數(shù)據(jù)率自洽再用第 4 章的延時(shí)掃描確認(rèn)接口時(shí)序還有沒有余量。現(xiàn)象三換了工作頻點(diǎn)接收增益突然掉了十幾 dB。原因增益表還是原來頻段的那張索引對應(yīng)的內(nèi)部衰減組合在新頻段下不適用。 解決切頻點(diǎn)的時(shí)候同步切換增益表MGC 模式下重新寫一遍增益索引AGC 模式下重新下發(fā)門限參數(shù)?,F(xiàn)象四LVDS 數(shù)據(jù)線接上邏輯分析儀能看到波形接上接收端就是采不到。原因LVDS 擺幅設(shè)成了最低檔加上終端電阻缺失到達(dá)接收端的差分電壓低于判決閾值。 解決擺幅往上調(diào)一檔到兩檔檢查終端匹配不要用單端探頭去量差分對下結(jié)論?,F(xiàn)象五常溫測試全過高低溫循環(huán)時(shí)偶發(fā)誤碼一晚上錯(cuò)幾個(gè)包。原因延時(shí)窗口取在了邊緣溫度漂移把采樣點(diǎn)推出了有效窗口。 解決重跑二維掃描取窗口中心值掃描時(shí)把每個(gè)延時(shí)值的錯(cuò)誤數(shù)都打印出來肉眼確認(rèn)窗口形狀。6. 設(shè)計(jì)取舍為什么不把這一切封裝成“一鍵驅(qū)動(dòng)”把 AD9361 的配置做成一個(gè)黑盒 APIad9361_init(freq, bw, rate)一調(diào)就完事看上去很美但這個(gè)方案在真實(shí)項(xiàng)目里幾乎必然被推翻。原因在于失敗模式射頻鏈路的故障不是拋異常而是“能通但指標(biāo)不對”。EVM 差 2 dB、靈敏度低 3 dB、高溫偶發(fā)誤碼這些問題不會(huì)有任何返回值告訴你哪里錯(cuò)了只能靠一層層回讀和比對。黑盒把中間狀態(tài)藏起來等于把唯一的排查手段也藏起來了。所以更合理的設(shè)計(jì)是保留“腳本 顯式下發(fā)”這條路徑同時(shí)在外面套三層薄殼層次職責(zé)失敗時(shí)的表現(xiàn)腳本解析層把 txt 變成操作列表校驗(yàn)地址與值域解析報(bào)錯(cuò)定位到具體行號(hào)下發(fā)層按序?qū)懠拇嫫鞣侄尾迦胙訒r(shí)與校準(zhǔn)等待回讀斷言失敗定位到具體寄存器校驗(yàn)層回讀關(guān)鍵狀態(tài)位、跑固定碼型、掃延時(shí)窗口輸出可對比的量化結(jié)果這三層加起來本文還有配套的精品資源點(diǎn)擊獲取