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

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

chanra1n6天前MCU60

代码如下:

#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发布,如需转载请注明出处。

本文链接:https://world.myfpga.cn/index.php/post/457.html

分享给朋友:
返回列表

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

没有最新的文章了...

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

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

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

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

温控风扇控制板 最大支持十路输出 Tip:类似深度学习实现自动控制

温控风扇控制板 最大支持十路输出 Tip:类似深度学习实现自动控制

电路尺寸:2.7*2.9cm在一般情况下,风扇被设置为:温度超过控制板温度10度时启动风扇,在检测温度大于80度时满速,其中的速度正比与温度你也可以通过串口发送AT指令控制阈值,以及改变模式三种工作模式:1、使用板载温度湿度传感器,可以将板上SIG排座连接至PWM控制风扇的控制引脚2、使用一半的SI...

STM32G0核心板V1.0开源页面

STM32G0核心板V1.0开源页面

原理图PCB项目工程文件STM32G0核心板.zip可以直接打印,Gerber_PCB_STM32G0核心板_2.zipBOMIDNameDesignatorFootprintQuantityManufacturer PartManufacturerSupplierSupplier PartPric...

基于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 坑已经踩完了,大家可...