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

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

chanra1n13小时前MCU25

代码如下:

#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://myfpga.cn/index.php/post/457.html

分享给朋友:
返回列表

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

没有最新的文章了...

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

UART通信方式简明教程

UART通信方式简明教程

Uart 即最常见的串口通信方式,相信你点进来之前就对此有或多或少的了解了,不对基本介绍做赘述,Uart协议采用两根数据总线,一根是RXD,一根是TXD,怎么区分呢?R是Receive接收的意思,T是Transmit发送的意思协议需要掌握的有3个:时序、寄存器Uart协议标准的构成为:起始...

TI-TM4C123x系列单片机编程救急宝典(持续更新中...)

TI-TM4C123x系列单片机编程救急宝典(持续更新中...)

前言TI-TM4C123x系列单片机的编程有种面向过程的感觉,无论是时钟设置,端口配置,还是操作外设都是采样的函数调用方式。这种方式有很强的结构化感觉,也便于初学者学习。下面作者将从多个角度介绍。本手册更接近应用,跳过了大多的理论和原理,大篇幅讲述如何快速入门和使用起来该单片机,作者更建议读者认真阅...

Ai-M61-32S开发环境搭建 BL616/BL618 Windows/Linux

Ai-M61-32S开发环境搭建 BL616/BL618 Windows/Linux

这两天正在研究BL616的板子,想搞出来USB相关做项目用(需求是USB 2.0高速),都把AI-M62的加购了,准备这两天付款(毕竟运费6块,得看看店里有没有啥可以一起买的)。突然看到发的内容,可以白嫖。真的是想啥来啥,想要BL616的,结果白嫖BL618的。。。“就像是想吃奶了,娘来了。”你可能...

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