基于树莓派PICO RP2040使用Arduino对Si5351进行编程和配置
代码如下:
#include <Adafruit_SI5351.h>
#include <Wire.h>
// 使用自定义 I2C 引脚配置
#define I2C_SDA 0 // 物理引脚6 (GP4)
#define I2C_SCL 1 // 物理引脚7 (GP5)
// 创建自定义 I2C 对象
TwoWire myWire(I2C_SDA, I2C_SCL);
Adafruit_SI5351 clockgen = Adafruit_SI5351();
// 添加读取状态函数
uint8_t readSi5351Status() {
uint8_t status = 0;
myWire.beginTransmission(SI5351_ADDRESS);
myWire.write(0); // 状态寄存器地址
myWire.endTransmission();
myWire.requestFrom(SI5351_ADDRESS, 1);
if (myWire.available()) {
status = myWire.read();
}
return status;
}
// 添加读取寄存器函数
uint8_t readSi5351Register(uint8_t reg) {
myWire.beginTransmission(SI5351_ADDRESS);
myWire.write(reg);
myWire.endTransmission();
myWire.requestFrom(SI5351_ADDRESS, 1);
if (myWire.available()) {
return myWire.read();
}
return 0xFF; // 错误值
}
void printDeviceStatus(uint8_t status) {
Serial.println("\nSi5351 设备状态:");
Serial.print("状态寄存器值: 0x");
Serial.println(status, HEX);
Serial.print("SYS_INIT (启动状态): ");
Serial.println((status & (1 << 6)) ? "设备正在启动" : "设备已就绪");
Serial.print("LOL_B (PLLB 失锁): ");
Serial.println((status & (1 << 5)) ? "检测到失锁" : "锁定");
Serial.print("LOL_A (PLLA 失锁): ");
Serial.println((status & (1 << 4)) ? "检测到失锁" : "锁定");
Serial.print("LOS (晶体输入丢失): ");
Serial.println((status & (1 << 3)) ? "晶体输入丢失" : "晶体输入正常");
Serial.print("REVID (修订ID): ");
Serial.println(status & 0x03);
}
void setup(void) {
Serial.begin(9600);
while (!Serial); // 等待串口连接(仅用于调试)
delay(2000); // 等待串行连接稳定
Serial.println("初始化 I2C 和 Si5351...");
// 使用自定义的 I2C 对象初始化 Si5351
if (clockgen.begin(&myWire) != ERROR_NONE) {
Serial.println("Si5351 未检测到! 请检查:");
Serial.println("1. 接线是否正确");
Serial.println("2. I2C 地址是否设置正确");
// 尝试读取状态(即使初始化失败)
uint8_t status = readSi5351Status();
Serial.print("状态寄存器: 0x");
Serial.println(status, HEX);
while (1);
}
Serial.println("Si5351 初始化成功!");
// 读取并打印设备状态
uint8_t status = readSi5351Status();
printDeviceStatus(status);
// 原频率配置代码保持不变
Serial.println("设置 PLLA 到 900MHz");
clockgen.setupPLLInt(SI5351_PLL_A, 36);
Serial.println("设置输出 #0 到 112.5MHz");
clockgen.setupMultisynthInt(0, SI5351_PLL_A, SI5351_MULTISYNTH_DIV_8);
Serial.println("设置 PLLB 到 616.66667MHz (分数模式)");
clockgen.setupPLL(SI5351_PLL_B, 24, 2, 3);
Serial.println("设置输出 #1 到 13.553115MHz");
clockgen.setupMultisynth(1, SI5351_PLL_B, 45, 1, 2);
Serial.println("设置输出 #2 到 10.706 KHz");
clockgen.setupMultisynth(2, SI5351_PLL_B, 900, 0, 1);
clockgen.setupRdiv(2, SI5351_R_DIV_64);
Serial.println("启用时钟输出");
clockgen.enableOutputs(true);
// 配置后再次检查状态
Serial.println("\n配置后检查状态...");
status = readSi5351Status();
printDeviceStatus(status);
// 读取一些关键寄存器以验证配置
Serial.println("\n配置寄存器验证:");
Serial.print("输出控制寄存器 (16-18): ");
Serial.print(readSi5351Register(16), HEX);
Serial.print(", ");
Serial.print(readSi5351Register(17), HEX);
Serial.print(", ");
Serial.println(readSi5351Register(18), HEX);
Serial.print("PLLA 配置寄存器 (26-33): ");
for (uint8_t reg = 26; reg <= 33; reg++) {
Serial.print(readSi5351Register(reg), HEX);
Serial.print(" ");
}
Serial.println();
}
void loop(void) {
// 定期检查设备状态
static uint32_t lastCheck = 0;
if (millis() - lastCheck > 5000) { // 每5秒检查一次
lastCheck = millis();
uint8_t status = readSi5351Status();
Serial.print("\n循环状态检查: 0x");
Serial.println(status, HEX);
// 检查是否失锁或晶体丢失
if (status & (1 << 5) || status & (1 << 4)) {
Serial.println("警告: 检测到PLL失锁!");
}
if (status & (1 << 3)) {
Serial.println("警告: 晶体输入丢失!");
}
}
delay(100); // 防止过于频繁的检查
}测试结果如下:





