首页 > 编程语言 >咚咚咚————【封装驱动】Si5351A方波信号发生器发送任意(8K-160Mhz)频率程序

咚咚咚————【封装驱动】Si5351A方波信号发生器发送任意(8K-160Mhz)频率程序

时间:2023-07-21 09:02:28浏览次数:67  
标签:P2 8K Si5351A IICsendreg SI 160Mhz GPIO uint32 define

咚咚咚————【封装驱动】Si5351A方波信号发生器发送任意[8K-160Mhz]频率程序


(使用阿波罗STM32F7开发板)

(一)效果展示

(二)源码分享

芯片SI5351A源代码下载
可以支持一下吗QAQ

SI5351A.c

/********************************************
主控芯片:STM32F405RGT6主频168Mhz
晶体频率:HSE=8Mhz  SYSCLK=168Mhz
模块型号:STM32串口初始化
通讯方式:
函数功能:Si5351时钟芯片
作者:苏夏雨
授权:未经作者允许,禁止转载
********************************************/
#include "si5351a.h"
#include "delay.h"
void IICstart()//IIC总线起始信号
{
	  SDA(1);
	  CLK(1);
	  SDA(0);
    delay_us(100); 
	  CLK(0);
    delay_us(100); 	
}
void IICstop()//IIC总线停止信号
{
	  CLK(0);
    delay_us(100); 
	  SDA(0);
    delay_us(100); 
	  CLK(1);
    delay_us(100); 
	  SDA(1);	
    delay_us(100); 
}
void IICsend(u8 DATA)//IIC总线发送信数据
{
		u16 i;
    for(i=0;i<8;i++) //发送一个字节数据 
    {     
        CLK(0); 		 //拉低时钟线,准备开始给SDA赋值
    if((DATA&amp;0x80)==0)  
    {SDA(0);}  
    else  
    {SDA(1);}  
			
    DATA&lt;&lt;=1;  
    delay_us(100);    
    CLK(1);
    delay_us(100);      //等待从设备把数据接收完
	}  
CLK(0);  
SDA(1);	 				   //释放数据线   
delay_us(100);   
CLK(1); 
delay_us(100); 
	while(i&lt;1000){i++;}//等待从设备应答ACK 
	CLK(0); 					 //释放时钟线,为下次操作做准备

}
void IICsendreg(uint8_t reg, uint8_t data)
{
IICstart(); //起始信号
delay_us(200);
IICsend(0xC0); //发送设备地址+写信号
delay_us(200);
IICsend(reg); //内部寄存器地址
delay_us(200);
IICsend(data); //内部寄存器数据
delay_us(200);
IICstop();
}
void Si5351Init()//初始化Si5351芯片
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOB_CLK_ENABLE(); //开启GPIOB时钟
GPIO_Initure.Pin=GPIO_PIN_10|GPIO_PIN_11;//PB10,11引脚
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;//复用推挽输出
GPIO_Initure.Pull=GPIO_PULLUP;//上拉模式
GPIO_Initure.Speed=GPIO_SPEED_HIGH;//GPIO速度高速
HAL_GPIO_Init(GPIOB,&GPIO_Initure);//初始化GPIOB
}
void SetFrequency(uint32_t frequency)//设置时钟频率
{
uint32_t pllFreq;
uint32_t xtalFreq = XTAL_FREQ;// 晶体频率
uint32_t l;
float f;
uint8_t mult;
uint32_t num;
uint32_t denom;
uint32_t divider;
divider = 900000000 / frequency; //锁相环频率:900 mhz
if (divider % 2) divider--; //确保一个更整数除法比率
pllFreq = divider * frequency; //计算pllFrequency:分频器*所需的输出频率
mult = pllFreq / xtalFreq; //确定所需的pllFrequency的乘数
l = pllFreq % xtalFreq; //它有三个部分:
f = l; //乘是一个整数,必须在15 . . 90
f *= 1048575; //num和分母项是小数部分,分子和分母
f /= xtalFreq; //每20位(范围0 . . 1048575)
num = f; //实际的乘数是乘+ num /分母项
denom = 1048575; //为简单起见我们将分母最大1048575
//设置锁相环与倍增系数计算
SetPLLClk(SI_SYNTH_PLL_A, mult, num, denom);
//设置MultiSynth分配器0分计算。
//最后R分裂阶段可以除以2的幂,从1 . . 128。
//由常量SI_R_DIV1 reprented SI_R_DIV128(见si5351a。h头文件)
//如果你想在1兆赫兹以下输出,你必须使用
//最后R分裂阶段

SetMultisynth(SI_SYNTH_MS_0,divider,SI_R_DIV_1);
//重置锁相环。这将导致输出的故障。对于小的变化
//参数,不需要复位锁相环,没有故障

IICsendreg(SI_PLL_RESET,0xA0);
//最后打开CLK0输出(0 x4f)
//并设置MultiSynth0是锁相环的输入
IICsendreg(SI_CLK0_CONTROL, 0x4F|SI_CLK_SRC_PLL_A);
}
void SetPLLClk(uint8_t pll, uint8_t mult, uint32_t num, uint32_t denom)//设置PPL时钟
{
uint32_t P1; // PLL config register P1
uint32_t P2; // PLL config register P2
uint32_t P3; // PLL config register P3

P1 = (uint32_t)(128 * ((float)num / (float)denom));
P1 = (uint32_t)(128 * (uint32_t)(mult) + P1 - 512);
P2 = (uint32_t)(128 * ((float)num / (float)denom));
P2 = (uint32_t)(128 * num - denom * P2);
P3 = denom;

IICsendreg(pll + 0, (P3 & 0x0000FF00) >> 8);
IICsendreg(pll + 1, (P3 & 0x000000FF));
IICsendreg(pll + 2, (P1 & 0x00030000) >> 16);
IICsendreg(pll + 3, (P1 & 0x0000FF00) >> 8);
IICsendreg(pll + 4, (P1 & 0x000000FF));
IICsendreg(pll + 5, ((P3 & 0x000F0000) >> 12) | ((P2 & 0x000F0000) >> 16));
IICsendreg(pll + 6, (P2 & 0x0000FF00) >> 8);
IICsendreg(pll + 7, (P2 & 0x000000FF));
}
void SetMultisynth(uint8_t synth,uint32_t divider,uint8_t rDiv)//设置多synth
{
uint32_t P1; // Synth config register P1
uint32_t P2; // Synth config register P2
uint32_t P3; // Synth config register P3

P1 = 128 * divider - 512;
P2 = 0; // P2 = 0, P3 = 1 forces an integer value for the divider
P3 = 1;

IICsendreg(synth + 0, (P3 & 0x0000FF00) >> 8);
IICsendreg(synth + 1, (P3 & 0x000000FF));
IICsendreg(synth + 2, ((P1 & 0x00030000) >> 16) | rDiv);
IICsendreg(synth + 3, (P1 & 0x0000FF00) >> 8);
IICsendreg(synth + 4, (P1 & 0x000000FF));
IICsendreg(synth + 5, ((P3 & 0x000F0000) >> 12) | ((P2 & 0x000F0000) >> 16));
IICsendreg(synth + 6, (P2 & 0x0000FF00) >> 8);
IICsendreg(synth + 7, (P2 & 0x000000FF));
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155

SA5351A.h

/********************************************
主控芯片:STM32F405RGT6主频168Mhz
晶体频率:HSE=8Mhz  SYSCLK=168Mhz
模块型号:STM32串口初始化
通讯方式:
函数功能:Si5351时钟芯片
作者:苏夏雨
授权:未经作者允许,禁止转载
********************************************/
#ifndef _si5351a_h
#define _si5351a_h
#include "system.h"
//Si5351寄存器声明
#define SI_CLK0_CONTROL	16			// Register definitions
#define SI_CLK1_CONTROL	17
#define SI_CLK2_CONTROL	18
#define SI_SYNTH_PLL_A	26
#define SI_SYNTH_PLL_B	34
#define SI_SYNTH_MS_0		42
#define SI_SYNTH_MS_1		50
#define SI_SYNTH_MS_2		58
#define SI_PLL_RESET		177

define SI_R_DIV_1 0x00 // R-division ratio definitions

define SI_R_DIV_2 0b00010000

define SI_R_DIV_4 0b00100000

define SI_R_DIV_8 0b00110000

define SI_R_DIV_16 0b01000000

define SI_R_DIV_32 0b01010000

define SI_R_DIV_64 0b01100000

define SI_R_DIV_128 0b01110000

define SI_CLK_SRC_PLL_A 0x00

define SI_CLK_SRC_PLL_B 0b00100000

define XTAL_FREQ 25000000 // Crystal frequency

//IIC总线引脚配置

define SDA(n)

define CLK(n)

//相关函数声明
void Si5351Init(void);//初始化Si5351的GPIO
void SetPLLClk(uint8_t pll, uint8_t mult, uint32_t num, uint32_t denom);//设置PPL时钟
void SetFrequency(uint32_t frequency);//时钟Si5351时钟频率
void SetMultisynth(uint8_t synth,uint32_t divider,uint8_t rDiv);//设置多synth

endif

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

(三)需要改进的地方及不足

学校里的示波器只有100M带宽,所以只能测试有效值低于12.5Mhz的方波(频率太高带宽就不够用了,一般是示波器带宽除以八)后续频率的测试没有进行…

标签:P2,8K,Si5351A,IICsendreg,SI,160Mhz,GPIO,uint32,define
From: https://www.cnblogs.com/SymPny/p/17570276.html

相关文章

  • CS5466 Type-c to HDMI2.1_8K拓展坞方案芯片|低成本替代GSV6201方案
    GSV6201是一款高性能、低功耗、高性能的,USBType-C备用模式显示端口1.4至HDMI2.1转换器。通过集成增强型微控制器,GSV6201创造了一个经济高效的解决方案提供了上市时间优势。显示端口接收机支持高达32.4Gbps(HBR3,4通道)和HDMI发射机支持高达48Gbps(FRL,12G4Lane)。集成PowerDelivery3......
  • Armsom推出工规级RK3588J-Core(armsom P1 Core) 8K 智能NVR核心板**
    ArmsomP1Core板载RockchipRK3588J新一代工业级八核64位处理器;采用工业级芯片、精密元器件和BTB连接器,支持宽温温度-40°C~85°C长时间稳定运行;支持ARMPC、边缘计算、云服务器、智能NVR等相关领域;提供10年+超长供货期和完善的技术资料,用户可自主深度化定制。八核工业级处理器RK......
  • 面试谈薪4点博弈策略,将20k谈到28k
    薪资谈判本质上是一种博弈,无论是表面谈得好还是实质上谈得好,都需要掌握一些策略 面试薪资怎么谈,您目前的薪资是20k,如果您想要提高到28k,那么请花两分钟看完以下内容。薪资谈判本质上是一种博弈,无论是表面谈得好还是实质上谈得好,都需要掌握一些策略。如果您不想在面试后被压价,那......
  • 一个9个月测试经验的人,居然在面试时跟我要18K,我都被他吓到了····
    2月初我入职了深圳某家创业公司,刚入职还是很兴奋的,到公司一看我傻了,公司除了我一个测试,公司的开发人员就只有3个前端2个后端还有2个UI,在粗略了解公司的业务后才发现是一个从零开始的项目,目前啥都没有什么都需要自己搭建,我就提出人手不够需要在招一个测试,由于咱公司就我一个测试所......
  • P1075 [NOIP2012 普及组] 质因数分解 提交 333.88k 通过 126.26k 时间限制 1.00s 内存
    P1075[NOIP2012普及组]质因数分解[NOIP2012普及组]质因数分解题目描述已知正整数n是两个不同的质数的乘积,试求出两者中较大的那个质数。输入格式输入一个正整......
  • MKV10Z64VLF7(64KB)MKE06Z128VLH4(128KB)MC9S08PA32AVLC闪存微控制器
    技术参数1、MKV10Z64VLF7 ICMCU32BIT64KBFLASH48LQFP核心处理器:ARM®Cortex®-M0+内核规格:32位单核速度:75MHz连接能力:I²C,SPI,UART/USART外设:DMA,LVD,POR,WDTI/O数:40......
  • 8K-15K的python工作,你,来吗?
    嗨害大家好鸭!我是小熊猫~本次采集网站如下图:源码资料电子书:​​点击此处跳转文末名片获取​​主要运用知识点:1.re正则表达式模块的简单使用2.requests模块的使用3.保存c......
  • 看我是如何用C#编写一个小于8KB的贪吃蛇游戏的
    译者注:这是MichalStrehovský大佬的一篇文章,他目前在微软.NETRuntime团队工作,主要是负责.NETNativeAOT功能的开发。我在前几天看到这篇文章,非常喜欢,虽然它的内容稍微......
  • 8KB的C#贪吃蛇游戏热点答疑和.NET7版本
    在之前的一篇文章《看我是如何用C#编写一个小于8KB的贪吃蛇游戏》中,介绍了在.NETCore3.0的环境下如何将贪吃蛇游戏降低到8KB。不过也有很多小伙伴提出了一些疑问和看法,主......
  • 看我是如何用C#编写一个小于8KB的贪吃蛇游戏的
    译者注:这是MichalStrehovský大佬的一篇文章,他目前在微软.NETRuntime团队工作,主要是负责.NETNativeAOT功能的开发。我在前几天看到这篇文章,非常喜欢,虽然它的内容稍微有......