基于树莓派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); // 防止过于频繁的检查 }
测试结果如下: