当前位置:首页 > MCU > 正文内容

基于树莓派PICO RP2040使用Arduino对Si5351进行编程和配置

chanra1n8小时前MCU19

代码如下:

#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); // 防止过于频繁的检查
}

测试结果如下:

image.png


扫描二维码推送至手机访问。

版权声明:本文由我的FPGA发布,如需转载请注明出处。

本文链接:http://www.myfpga.cn/index.php/post/457.html

分享给朋友:
返回列表

上一篇:基于nRF52840实现一个FIDO2安全密钥

没有最新的文章了...

“基于树莓派PICO RP2040使用Arduino对Si5351进行编程和配置” 的相关文章

STC8G1K08 解决P5.5无法使用的问题

STC8G1K08 解决P5.5无法使用的问题

在STC8G系列上电之后,需要初始化P5口端口寄存器代码如下:P5M0 = 0x00;                &...

使用ADC+DAC实现程控增益放大器V3.1,基于STC8G单片机 开源页面

使用ADC+DAC实现程控增益放大器V3.1,基于STC8G单片机 开源页面

本项目主要是研究目的,如果希望用于实际用途,还请使用放大器+数字电位器,或者直接使用程控仪表放大器,例如AD603等。原理图:代码://main.c /* 注意:请不要输入超过5.5V的信号,否则可能会导致芯片永久损坏! 当输入的信号封装为0~0.5V范围时,输出会放大十倍。 当输入的信号封...

基于nRF52840实现一个FIDO2安全密钥

基于nRF52840实现一个FIDO2安全密钥

项目参考了1.https://github.com/google/OpenSK 2.https://github.com/adafruit/Adafruit_nRF52_Bootloader 3.https://github.com/canokeys/canokey-nrf52 坑已经踩完了,大家可...