4. AD9361/AD9371寄存器与SPI控制

AD9361 与 AD9371 都是通过 SPI 从机接口接受配置的宽带射频收发器。上电后,芯片内部寄存器处于默认值,必须由基带处理器(FPGA 或 MCU)按顺序写入时钟、PLL、滤波器、增益、数据接口等参数,器件才能进入可用的收发状态。理解寄存器映射、SPI 时序和初始化状态机,是排查“SPI 能读能写但射频不工作”这类问题的前提。

寄存器映射:地址空间与访问粒度

AD9361 的寄存器空间按功能划分为若干区域:0x000–0x00F 为接口与产品 ID 配置区,0x010–0x01F 为时钟与 PLL 使能区,0x020–0x02F 为接收链路增益与校准区,0x030–0x03F 为发射链路区,0x040 以后为 BIST、AGC、RSSI 等辅助功能。AD9371 的地址空间更大,并区分“SPI 寄存器”和“ARM 处理器命令”两类访问:前者直接读写硬件寄存器,后者通过邮箱寄存器向片内 ARM 下发初始化脚本。

访问粒度上,AD9361 的寄存器为 8 位地址、8 位数据,部分寄存器需要按位域操作。例如 0x013 的 bit0 是 ENSM 使能位,bit1 是 RX 使能位,写错一位就可能让状态机停在 WAIT 状态。AD9371 则大量使用 16 位地址、8 位数据,并规定某些寄存器必须整字节写入,不能只改其中一位。因此配置前应先查数据手册的寄存器映射表,确认地址、位域、复位值和访问属性(只读、读写、自清除)。

SPI 读写时序:四线模式与位序

AD9361/AD9371 的 SPI 从机支持三线或四线模式。四线模式下,SPI_CSB 拉低后,主机在 SCLK 上升沿采样 MOSI 上的数据,从机在 SCLK 下降沿更新 MISO。一次完整访问由 16 位指令加 8 位数据组成:第 1 位是读写标志(1 为读,0 为写),第 2–3 位是字节数(00 表示 1 字节),第 4–15 位是 12 位地址,随后是 8 位数据。读操作时,从机在指令阶段结束后才驱动 MISO,因此主机需要忽略前 16 个时钟的 MISO 数据。

时序参数上,SCLK 最高频率通常为 20 MHz(AD9361)或 25 MHz(AD9371),CSB 建立时间 tCSS 约 10 ns,保持时间 tCSH 约 10 ns。若用 FPGA 实现,建议把 SCLK 分频到 5–10 MHz,留出足够的建立保持余量。位序固定为 MSB first,不能通过寄存器改为 LSB first。写操作结束后,CSB 必须拉高至少一个 SCLK 周期,否则从机可能把下一次访问误判为连续传输。

AD9361/AD9371 SPI 四线读写时序与初始化状态机 SPI 四线时序(写 1 字节) CSB SCLK MOSI R/W(1) + 字节数(2) + 12位地址 + 8位数据 MISO 高阻(写操作时从机不驱动) 初始化状态机(ENSM) SLEEP WAIT ALERT RX/TX FDD/TDD 写0x013 校准完成 使能RX/TX 配置双工 常见错误:SPI 读回 0x00 / 0xFF → 检查 CSB、SCLK 极性、电源与复位

初始化流程:从复位到收发

AD9361 的典型初始化分为四个阶段。第一阶段是复位与 ID 校验:拉低 RESETB 至少 1 μs,然后读寄存器 0x000–0x002,正常应返回 0x0A、0x0B、0x0C 等产品 ID。若读回 0x00 或 0xFF,说明 SPI 通信本身有问题,应先查 CSB 是否接反、SCLK 是否停振、VDD_INTERFACE 是否上电。

第二阶段是时钟与 PLL 配置:写 0x010 使能外部时钟,写 0x011 设置参考时钟分频,写 0x012 配置 PLL 环路带宽,然后轮询 0x017 的锁定状态位。锁定后,再配置 ADC 和 DAC 的采样率、FIR 滤波器抽头系数。第三阶段是射频链路校准:依次触发 RX DC 校准、RX 正交校准、TX 正交校准,每项校准需要等待 0x016 的校准完成标志。第四阶段是数据接口配置:设置 LVDS 或 CMOS 模式、数据端口使能、FDD/TDD 双工模式,最后写 0x013 的 ENSM 使能位,让状态机从 WAIT 进入 ALERT,再进入 RX/TX 状态。

AD9371 的初始化更依赖 ARM 处理器:主机先通过 SPI 写入一系列“ARM 命令”到邮箱寄存器,ARM 再根据命令执行内部初始化脚本。典型流程是:写 0x0000 复位 ARM,写 0x0001 加载初始化数据,写 0x0002 启动 ARM,然后轮询 0x0004 的 ARM 就绪标志。ARM 就绪后,主机才能通过 SPI 直接访问射频寄存器。

状态机与常见配置错误排查

ENSM 状态机是排查问题的核心线索。若读 0x013 返回 0x00,说明 ENSM 未使能,芯片停留在 SLEEP;若返回 0x01 但射频无输出,说明状态机停在 WAIT,通常是 PLL 未锁定或校准未完成。此时应依次检查:0x017 的 PLL 锁定位是否为 1、0x016 的校准完成位是否为 1、0x015 的时钟使能位是否为 1。

另一类常见错误是 SPI 写成功但读回值不变。这通常有三种原因:一是写入了只读寄存器,数据被硬件忽略;二是写入了需要整字节访问的寄存器,但主机只改了其中一位,导致其他位被意外清零;三是 SPI 时序中 CSB 拉高过早,最后一个数据位未被从机采样。排查时可以用示波器同时抓 CSB、SCLK、MOSI 三路信号,确认第 16 个 SCLK 上升沿时 MOSI 仍保持有效数据。

排查顺序建议:先确认 SPI 能正确读回产品 ID,再确认 PLL 锁定,然后确认校准完成,最后确认 ENSM 状态。不要跳过 ID 校验直接写射频参数,否则后续所有配置都可能建立在错误的通信基础上。

配置检查表示例

检查项寄存器/信号期望值异常处理
产品 ID0x000–0x0020x0A/0x0B/0x0C检查 CSB、SCLK、电源
PLL 锁定0x017 bit01检查参考时钟频率与分频
校准完成0x016 bit01重新触发校准,检查温度
ENSM 状态0x013 bit01确认前序配置全部完成
数据接口0x010 bit3按模式设置检查 LVDS/CMOS 电平

实际调试中,建议把上述检查表做成脚本,每次上电后自动读回关键寄存器并打印。这样即使更换板卡或修改配置,也能在几秒内定位到是通信层、时钟层还是射频层的问题,而不是盲目重写整个初始化序列。