详解si5338 si53xx 设计使用及STM32 iic驱动设计

背景

在实际项目中经常使用si5338 si53xx,进行多路时钟的倍频以生成想要的时钟信号,但是针对si5338 si53xx设计使用缺少相关的资料,本文详解si5338 si53xx 设计使用及STM32 iic驱动设计,本文使用工程在项目中得到测试,在多个项目中同时使用。这里做个详解,加速今后的项目开发。本文使用的资源如下图所示

ClockBuilderPro_project------------>> 使用ClockBuilder Pro生成的工程,及配置头文件

ClockBuilder-Pro-Installer.zip------->>ClockBuilder Pro安装文件

si5338.rar------------------------>>stm32cubeide代码工程

详解si5338 si53xx 设计使用及STM32 iic驱动设计.pdf----->>使用说明文档

详解si5338si53xx设计使用及STM32iic驱动设计全套资料原理图代码使用手册ClockBuilder设计工程资源-CSDN文库

硬件设计

这里还是先要把硬件原理图给出来,因为后面si5338 si53xx,都需要根据原理图进行参数的配置,这里可以看出输入时钟25Mhz,支持四路时钟输出,I2C_LSB管脚接地,电压电压1.8v。

连接STM32F407如下表所示:

Label

Si5338A

STM32F407

备注

STM32_1V8_I2C2_SCL

SCL

PF1

STM32_1V8_I2C2_SCL电平转3.3v后连接PF1

STM32_1V8_I2C2_SDA

SDA

PF0

STM32_1V8_I2C2_SDA电平转3.3v后连接PF0

使用ClockBuilder Pro生成寄存器配置列表

安装ClockBuilder Pro

si5338 si53xx的寄存器配置需要采用官方提供的ClockBuilder Pro,下面详述步骤,首先安装ClockBuilder Pro,如下图所示:

解压ClockBuilder-Pro-Installer.zip

双击ClockBuilder-Pro-2.45.exe,都选择默认配置,即可完成软件安装

ClockBuilder Pro有更新的版本了,这里采用ClockBuilder-Pro-2.45,读者也可以去下载最新的版本使用,基本上步骤都是一样的。

新建工程

 

输入时钟配置 

输出时钟配置

导出配置寄存器文件 

选择C头文件的格式,记得这里生成的头文件,可以直接复制到软件设计中提供侧工程,头文件。 

完成配置头文件导出

配置文件内容复制到工程

复制Si5338-RevB-Registers.h文件内容,替换如下工程中register_map.h中所有内容,编译工程即可。

软件设计

软件采用stm32cubeide,配置,使用串口1作为调试串口,波特率配置9600,参考代码

/* USER CODE BEGIN PV */#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endifPUTCHAR_PROTOTYPE
{while((USART1->SR&0x40)==0){};USART1->DR = ch;return ch;
}
/* USER CODE END PV */

 时钟采用8Mhz外部时钟倍频

仿真器采用sw接口

配置GPIO PF0 PF1为默认输出

 采用IO模拟IIC读写si53xx数据,参考代码

static void si5338_configure(void)
{uint32_t counter, timeout = 100;uint8_t curr_chip_val, clear_curr_val, clear_new_val, combined, reg;Reg_Data curr;//----------------------------------------------------------------// See Si5338 datasheet Figure 9 for more details on this procedure// delay added to wait for Si5338 to be ready to communicate // after turning on///counter = 0;///while(counter < SI5338_DELAY) { counter++; }I2C_ByteWrite(230, 0x10);                   //OEB_ALL = 1I2C_ByteWrite(241, 0xE5);                   //DIS_LOL = 1//for all the register values in the Reg_Store array//get each value and mask and apply it to the Si5338for(counter=0; counter<NUM_REGS_MAX; counter++){curr = Reg_Store[counter];if(curr.Reg_Mask != 0x00) { if(curr.Reg_Mask == 0xFF) { // do a write transaction only // since the mask is all ones			I2C_ByteWrite(curr.Reg_Addr, curr.Reg_Val);} else {		//do a read-modify-writecurr_chip_val = I2C_ByteRead(curr.Reg_Addr);clear_curr_val = curr_chip_val & ~curr.Reg_Mask;clear_new_val = curr.Reg_Val & curr.Reg_Mask;combined = clear_new_val | clear_curr_val;		I2C_ByteWrite(curr.Reg_Addr, combined);}}}// check LOS alarm for the xtal input // on IN1 and IN2 (and IN3 if necessary) - // change this mask if using inputs on IN4, IN5, IN6reg = I2C_ByteRead(218) & LOS_MASK;while(reg != 0){reg = I2C_ByteRead(218) & LOS_MASK;timeout --;//osDelay(1);delay_ms(1);if(timeout == 0){printf("si5338_configure timeout1\n");break;}					}I2C_ByteWrite(49, I2C_ByteRead(49) & 0x7F); //FCAL_OVRD_EN = 0I2C_ByteWrite(246, 2);                      //soft resetI2C_ByteWrite(241, 0x65);                   //DIS_LOL = 0// wait for Si5338 to be ready after calibration (ie, soft reset)///counter = 0;///while(counter < SI5338_DELAY) { counter++; }///counter = 0;///while(counter < SI5338_DELAY) { counter++; }//osDelay(24);delay_ms(24);//make sure the device locked by checking PLL_LOL and SYS_CALtimeout = 100;reg = I2C_ByteRead(218) & LOCK_MASK;while(reg != 0){reg = I2C_ByteRead(218) & LOCK_MASK;timeout --;//msleep(1);if(timeout == 0){printf("si5338_configure timeout2\n");break;}				}//copy FCAL valuesI2C_ByteWrite(45, I2C_ByteRead(235));I2C_ByteWrite(46, I2C_ByteRead(236));// clear bits 0 and 1 from 47 and // combine with bits 0 and 1 from 237reg = (I2C_ByteRead(47) & 0xFC) | (I2C_ByteRead(237) & 3);I2C_ByteWrite(47, reg);I2C_ByteWrite(49, I2C_ByteRead(49) | 0x80); // FCAL_OVRD_EN = 1I2C_ByteWrite(230, 0x00);                   // OEB_ALL = 0printf("si5338_configure success!\n");//------------------------------------------------------------}

测试记录

能够正确配置si5338,串口1,log打印如下图所示

使用工程及其他资料如下:

ClockBuilderPro_project------------>> 使用ClockBuilder Pro生成的工程,及配置头文件

ClockBuilder-Pro-Installer.zip------->>ClockBuilder Pro安装文件

si5338.rar------------------------>>stm32cubeide代码工程

详解si5338 si53xx 设计使用及STM32 iic驱动设计.pdf----->>使用说明文档

详解si5338si53xx设计使用及STM32iic驱动设计全套资料原理图代码使用手册ClockBuilder设计工程资源-CSDN文库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/416601.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虚拟系统VS

定义 虚拟系统VS&#xff08;Virtual System&#xff09;是指将一台物理设备PS&#xff08;Physical System&#xff09;虚拟成多个相互隔离的逻辑系统。每个VS独立工作&#xff0c;在业务功能上等同于一台独立的传统物理设备&#xff0c;如图2-1所示。 目的 随着网络规模的不…

省钱的开源项目「GitHub 热点速览」

本期&#xff0c;我从上周的热门开源项目中挑选了 5 个既省钱又省事&#xff0c;还好玩的开源项目。 首先&#xff0c;推荐的是省钱的电动汽车智能充电管理平台 evcc&#xff0c;它可以根据分时电价智能安排电动车充电时间&#xff0c;从而降低电费&#xff0c;如果你家还有太阳…

第五篇——数学边界:从毕达哥拉斯定理到费马大定理

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 数学世界让我敬畏的心&#xff0c;再一次蠢蠢欲动&#xff0c;那些伟大的…

VXLAN 为何采用UDP

VXLAN 简介 VXLAN是一种网络虚拟化技术&#xff0c;它通过在UDP数据包中封装MAC地址和IP信息&#xff0c;使得二层网络&#xff08;如以太网&#xff09;能够跨越三层网络&#xff08;如IP网络&#xff09;进行扩展。这种封装方式不仅支持TCP流量的传输&#xff0c;还能有效处…

Open3D 点云导向滤波

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 三、实现效果 3.1原始点云 3.2滤波后点云 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总&#xff08;长期更新&#xff09;-CSDN博客 一、概述 点云导向…

香橙派开启vnc

1连接香橙派 2. 更新系统 在SSH会话中&#xff0c;首先更新系统软件包列表并升级现有软件包&#xff1a; sudo apt update sudo apt upgrade3. 安装VNC服务器 安装VNC服务器软件&#xff0c;这里以x11vnc为例&#xff1a; sudo apt install x11vnc 出现如图输入如下代码即可…

AI模拟面试记录

一&#xff1a;Java模拟面试&#xff08;9.4&#xff09; 1.哪些问题是HTTPS无法解决的&#xff1f; 1.网络延迟&#xff1a;HTTPS是基于TCP协议的&#xff0c;因此会受到TCP握手和TLS挥手带来的时间延迟&#xff0c;会导致加载的页面时间变长。 2.数据包大小&#xff1a;由…

二进制方式安装K8S

⼀、安装说明 本⽂章将演示Rocky 8 ⼆进制⽅式安装⾼可⽤k8s 1.28.0版本。 ⽣产环境中&#xff0c;建议使⽤⼩版本⼤于5的Kubernetes版本&#xff0c;⽐如1.19.5 以后的才可⽤于⽣产环境。 ⼆、集群安装 2.1 基本环境配置 请统⼀替换这些⽹段&#xff0c;Pod⽹段和service和…

Golang | Leetcode Golang题解之第393题UTF-8编码验证

题目&#xff1a; 题解&#xff1a; const mask1, mask2 1 << 7, 1<<7 | 1<<6func getBytes(num int) int {if num&mask1 0 {return 1}n : 0for mask : mask1; num&mask ! 0; mask >> 1 {nif n > 4 {return -1}}if n > 2 {return n}r…

Hadoop是什么?

Hadoop 是什么 1&#xff09;Hadoop 是一个由 Apache 开发的分布式系统基础架构&#xff1b; 2&#xff09;主要解决&#xff1a;海量数据的存储和海量数据的分析计算问题&#xff1b; 3&#xff09;广义上来说&#xff0c;HADOOP 通常是指——HADOOP 生态圈&#xff1b; H…

v-bind后面不加属性和v-bind的动态属性

v-bind 平常常见的用法我们应该都知道&#xff0c;说一说 v-bind 的不常用的方式&#xff0c;第一个就是 v-bind 后面直接不添加任何属性&#xff0c;此时会将一个对象的所有 property 都作为 prop 传入 先看官网的说法案例&#xff1a; 父组件&#xff1a; <templat…

828华为云征文|华为云Flexus X实例docker部署srs6并调优,协议使用webrtc与rtmp

828华为云征文&#xff5c;华为云Flexus X实例docker部署srs6并调优&#xff0c;协议使用webrtc与rtmp 华为云最近正在举办828 B2B企业节&#xff0c;Flexus X实例的促销力度非常大&#xff0c;特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务…

异地多活架构计算设计

随着互联网的飞速发展,企业对业务连续性和高可用性的需求日益增加。异地多活架构作为一种高可靠性的系统设计方案,通过在地理上分散的多个数据中心部署应用和数据,有效降低了单一故障点对整个系统的影响,确保业务在灾难发生时能够持续运行。 架构设计策略 业务解耦:将系…

git如何设置嵌套仓库(设置子树或子模块),并解决直接将一个仓库拖拽到另一个仓库中导致的问题

git 将一个仓库拷贝到另一个仓库的文件夹下。默认git并不会处理&#xff0c;上传上去之后&#xff0c;只会创建一个文件夹&#xff0c;但是这个文件夹点不开。 在 git add . 的时候&#xff0c;会报出警告&#xff1a; 警告&#xff1a;正在添加嵌入式 git 仓库&#xff1a;cl…

什么是云计算?

1.云计算的概念&#xff1f; 现阶段广为人们所接受的是美国国家标准与技术研究院&#xff08;National Institute of Standards and Technology&#xff0c;NIST&#xff09;给出的定义&#xff1a;“云计算”是一种按使用量付费的模式&#xff0c;这种模式提供可用的、便捷的、…

刷题记录-HOT 100(四)二叉树

1、二叉树的中序遍历 ①递归 处理逻辑&#xff1a;递归地访问左子树-处理中间节点-递归地访问右子树。时间复杂度和空间复杂度都是O(n)。 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.va…

【Python百日进阶-Web开发-音频】Day707 - 时域处理 librosa.autocorrelate

文章目录 一、时域处理1.1 librosa.autocorrelate1.1.1 语法与参数1.1.2 例子1.1.2.1 计算完全自相关y1.1.2.2 计算长达 4 秒的起始强度自相关 一、时域处理 1.1 librosa.autocorrelate https://librosa.org/doc/latest/generated/librosa.autocorrelate.html 1.1.1 语法与参…

【TS】类(class)学习

类&#xff08;class&#xff09;基础概念 类定义&#xff1a;学习如何定义一个类&#xff0c;包括类的属性和方法。构造函数&#xff1a;理解构造函数的作用和如何使用它来初始化对象。访问修饰符&#xff1a;学习 public、private 和 protected 修饰符&#xff0c;以及它们如…

elasticsearch文档Delete By Query API(一)

这里的查询需要使用和Search API&#xff08;后文会讲&#xff09;相同的方式来将查询条件作为query的值传递&#xff0c;当然也可以使用q关键字&#xff0c;例如如下请求&#xff1a; curl -X POST “localhost:9200/twitter/_delete_by_query?pretty&quser:kimchy” -H…

react购物车Redux

入口index.js import React from react import {createRoot} from react-dom/clientimport App from ./App //注入store import {Provider} from "react-redux"; import store from "./store";const root createRoot(document.getElementById(root)) roo…