1. AU5615时钟芯片调试全记录
作为一名FPGA工程师,最近在项目中用到了国产AU5615时钟芯片。这款芯片功能强大但资料相对较少,调试过程中踩了不少坑。今天就把完整的调试过程记录下来,希望能帮到有需要的同行。
AU5615是一款高性能频率转换器,最大特点是支持12路差分或24路单端时钟输出。通过I2C/SPI接口可实时配置各通道参数,非常适合需要多路时钟的系统设计。我们项目使用的是UD LAN-407开发平台,搭载复旦微RFSOC(VU3P)和华为310P AI模块,AU5615负责为整个系统提供时钟网络。
2. 硬件准备与电路检查
2.1 电源与复位电路验证
在开始调试前,必须确保硬件连接正确。首先用万用表测量AU5615的供电电压:
- VDD核心电压:1.8V ±5%
- VDDIO接口电压:3.3V ±10%
- 复位信号:上电后应为高电平
特别注意:我们曾遇到复位信号被错误拉低的情况,导致芯片无法正常工作。建议用示波器抓取复位信号的上电时序,确保复位脉冲宽度符合规格书要求(典型值10ms)。
2.2 I2C接口配置
AU5615支持I2C和SPI两种配置接口,我们选择更常用的I2C模式。芯片的I2C地址由硬件引脚决定:
- 高4位固定为0110
- 低4位由SDO和CSB引脚电平决定:10
例如:
- SDO=0, CSB=0 → 地址0x60
- SDO=1, CSB=0 → 地址0x62
实际项目中,我们使用0x62作为设备地址。务必用万用表确认SDO和CSB引脚的实际连接状态,这点非常关键!
3. I2C通信调试
3.1 基础读写时序
AU5615的I2C时序标准,但有几个细节需要注意:
写时序要点:
- 启动信号后先发送设备地址(含写标志位)
- 收到ACK后发送寄存器地址
- 再次收到ACK后发送数据
- 停止信号前必须收到最后一个ACK
读时序要点:
- 先以写模式发送寄存器地址
- 重新发送启动信号和设备地址(含读标志位)
- 读取数据后主机发送NACK终止传输
调试技巧:如果收不到ACK响应,首先检查:
- 设备地址是否正确
- 上拉电阻是否合适(通常4.7kΩ)
- SCL/SDA线是否有短路/断路
3.2 FPGA端I2C控制器实现
我们在VU3P FPGA上实现了I2C主控制器,核心状态机如下:
verilog复制typedef enum {
IDLE,
START,
SEND_ADDR,
WAIT_ACK,
SEND_DATA,
STOP
} i2c_state_t;
// 状态机转移逻辑
always_ff @(posedge clk) begin
case(state)
IDLE: if(start) state <= START;
START: state <= SEND_ADDR;
SEND_ADDR: state <= WAIT_ACK;
WAIT_ACK: if(ack) state <= SEND_DATA;
SEND_DATA: if(byte_done) state <= STOP;
STOP: state <= IDLE;
endcase
end
实测发现,SCL频率设置在100-400kHz时最稳定。过高的频率会导致ACK响应超时。
4. 时钟配置详解
4.1 配置工具使用
AU5615配套的ClockBuilder Pro软件是配置关键。操作流程:
- 新建工程,选择AU5615器件
- 输入参考时钟频率(与原理图一致)
- 配置各输出通道:
- 输出类型(差分/单端)
- 频率值
- 驱动强度
- 生成配置文件
常见坑点:GPIO0/GPIO1的默认功能是地址配置引脚,如果在硬件中已用于地址设置,软件中必须禁用其GPIO功能,否则会导致配置冲突。
4.2 寄存器配置导出
完成软件配置后,按以下步骤导出:
- 保存为.json工程文件(备份用)
- 点击"Send to Chip"生成寄存器配置
- 导出为.csv文件(包含完整寄存器映射)
导出的.csv文件格式示例:
| Address | Data | Sleep(ms) |
|---|---|---|
| 0x0010 | 0xA5 | 0 |
| 0x0011 | 0x1F | 10 |
| 0x0012 | 0x00 | 5 |
特别注意Sleep列表示写入后的等待时间,必须严格遵循,否则可能导致配置失败。
5. FPGA配置代码实现
5.1 状态机设计
FPGA端的配置逻辑核心是一个状态机,主要完成:
- 读取.csv配置文件
- 按顺序写入各寄存器
- 精确实现要求的延时
关键代码段:
verilog复制// 配置状态机
always @(posedge clk) begin
case(state)
IDLE: begin
if(start) begin
addr <= csv_rom[ptr][31:16];
data <= csv_rom[ptr][15:0];
delay <= csv_rom[ptr][47:32];
state <= SEND;
end
end
SEND: begin
i2c_start <= 1;
if(i2c_done) begin
state <= DELAY;
ptr <= ptr + 1;
end
end
DELAY: begin
if(delay_cnt == delay)
state <= (ptr == CSV_LEN) ? DONE : IDLE;
end
endcase
end
5.2 调试技巧
-
使用VIO(Virtual Input/Output)核实时监控配置过程:
- 可读取当前配置的寄存器地址
- 显示I2C通信状态
- 动态调整配置参数
-
遇到配置失败时:
- 先检查电源和复位信号
- 用逻辑分析仪抓取I2C波形
- 从最简单的单寄存器读写测试开始
6. 常见问题与解决方案
6.1 典型故障排查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 无ACK响应 | 设备地址错误 | 检查SDO/CSB引脚电平 |
| 配置后无时钟输出 | PLL未锁定 | 增加配置后的等待时间(>100ms) |
| 时钟抖动大 | 电源噪声 | 加强电源滤波,检查地回路 |
| 部分通道无输出 | GPIO配置冲突 | 检查GPIO0/1的功能设置 |
6.2 实测经验分享
-
上电顺序很重要:建议先给AU5615上电,待其稳定后再释放复位信号。我们曾因复位信号异步导致配置失败。
-
对于关键时钟通道,建议在PCB设计时:
- 使用完整的参考地平面
- 保持对称的差分走线
- 远离高速数字信号线
-
配置软件的版本要匹配:我们最初使用v1.0软件导致部分寄存器配置错误,升级到v1.2后解决。
这次调试经历让我深刻体会到,时钟系统的稳定性直接影响整个项目的成败。AU5615虽然功能强大,但必须严格遵循配置流程。特别是在多板卡系统中,建议先用单板验证时钟配置,再扩展到整个系统。
