CDCE913产生任意频率
1,上TI官网下载CDCE913的datasheet和配置软件clock Pro。如果只需要配置CDCE913成某一个固定频率,那么用clock Pro可以很方便快捷。http://www.ti.com.cn/general/cn/docs/lit/getliterature.tsp?baseLiteratureNumber=scac119&fileType=zip
TI的初衷应该就是通过I2C配置几个频率,然后写入到EEPROM中,不然没有必要设计EEPROM和频率选择PIN(S1,S2)。


该软件产生的配置文件是二进制的csv或者txt文档,导入到Excel中处理成16进制即可。或者直接手动填写,反正也就20来个寄存器。
2,如需要在程序运行过程中动态的配置成不同的频率,那么你需要通过I2C接口配置。CDCE913的器件地址如下:
#define CDCE_ADDRESS 0x65
#define SLAVE_WRITE CDCE_ADDRESS<<1
#define SLAVE_READ ((CDCE_ADDRESS<<1) | 0x01)
3,了解一下配置原理

可以看到Y1,Y2,Y3都可以从PLL1配置,然后进过M(M1,M2,M3),Pdiv出来。寄存器配置完成后,需要拉高S0,才能使能输出。
4,查看datasheet,配置PLL需要配置以下参数

计算方法如下:

公式略微有点复杂。下面代码以配置Y1输出为例(输入晶振频率为8MHz,平台为STM32,I2C为软件模拟)。
#define CLK_IN 8 void CDCE_Init(uint16_t f_out)
{
uint8_t read_back;
uint8_t i = 1;
AckTypeDef ack;
uint32_t M, N, Pdiv, Q, R;
uint8_t reg18, reg19, reg1A, reg1B;
int P;
uint16_t f_vco = f_out;
bool result = false;
uint8_t f_range; while (f_vco < 80)
{
i++;
f_vco = f_out * i;
} while (f_vco < 231)
{
for (N = 4095; N > 0; N--)
{
for (M = 511; M > 0; M--)
{
if ((N * CLK_IN / M) == f_vco)
{
{
result = true;
break;
}
}
}
if (result)
{
break;
}
}
if (result)
{
break;
}
else
{
i++;
f_vco = f_out * i;
}
} if (!result)
{
UserPrintf("Error:unsupport pclk\n");
return;
} P = 4 - (int)((log((double)N / (double)M))/log(2));
if (P < 0)
{
P = 0;
}
Q = (int)((double)N * pow(2, (double)P) / (double)M);
R = (double)N * pow(2, (double)P) - M * Q; if (f_vco < 125)
{
f_range = 0;
}
else if ((f_vco >= 125) && (f_vco < 150))
{
f_range = 1;
}
else if ((f_vco >= 150) && (f_vco < 175))
{
f_range = 2;
}
else
{
f_range = 3;
} S0 = 0; ack = CDCE_Read8bit(0x00, 1, &read_back);
if (ack != I2C_ACK)
{
UserPrintf("Error:clk configuration failed , maybe no pullup res\n");
return;
} if (read_back != CDCE_ID)
{
UserPrintf("Error:clk device ID error\n");
return;
} Pdiv = f_vco / f_out; UserPrintf("M:%d,N:%d,Pdiv:%d,f_vco:%d,P:%d,Q:%d,R:%d\n", M, N, Pdiv,f_vco,P,Q, R); CDCE_WriteByte(0x02, 0xB4);
CDCE_WriteByte(0x03, (uint8_t)Pdiv);
CDCE_WriteByte(0x04, 0x02);
CDCE_WriteByte(0x05, 0x00);
CDCE_WriteByte(0x06, 0x40);
CDCE_WriteByte(0x12, 0x00);
CDCE_WriteByte(0x13, 0x01);
CDCE_WriteByte(0x14, 0x6D);
CDCE_WriteByte(0x15, 0x02);
CDCE_WriteByte(0x16, 0);
CDCE_WriteByte(0x17, 0); reg18 = (N >> 4) & 0xFFF;
reg19 = (N & 0xf) << 4 | (R & 0xf0) >> 5;
reg1A = (R & 0x1f) << 3 | ((Q >> 3) & 0x7);
reg1B = (Q & 0x7) << 5 | (P & 0x07) << 2 | (f_range & 0x03); CDCE_WriteByte(0x18, reg18);
CDCE_WriteByte(0x19, reg19);
CDCE_WriteByte(0x1A, reg1A);
CDCE_WriteByte(0x1B, reg1B); CDCE_WriteByte(0x1C, N);
CDCE_WriteByte(0x1D, ((N & 0xf) << 4) | (R & 0xf0));
CDCE_WriteByte(0x1E, (R & 0x0f) | (Q & 0xf0));
CDCE_WriteByte(0x1F, ((Q & 0x07) << 5) | ((P & 0x07) << 2) | (f_range & 0x03)); S0 = 1;
UserPrintf("Info:clk well configured\n");
}
CDCE913产生任意频率的更多相关文章
- 基于FPGA的DDS任意波形发生器设计
一.简介 DDS技术最初是作为频率合成技术提出的,由于其易于控制,相位连续,输出频率稳定度高,分辨率高, 频率转换速度快等优点,现在被广泛应用于任意波形发生器(AWG).基于DDS技术的任 ...
- 前端学HTTP之缓存
前面的话 Web缓存是可以自动保存常见文档副本的HTTP设备.当Web请求抵达缓存时,如果本地有“已缓存的”副本,就可以从本地存储设备而不是原始服务器中提取这个文档.本文将详细介绍缓存的相关内容 功能 ...
- angular js 在ie11 下的get请求缓存问题的解决办法
使用angularjs 1.x开发的应用在ie11 下回碰到各种怪异的情况:一般表现在:卡,慢,丑. 还有另外一种情况,就是:get请求被缓存,导致页面数据没有刷新.今天我们就来解决这个问题. 几行代 ...
- HTTP缓存
本文是<HTTP权威指南>读书笔记 Web缓存是可以自动保存常见文档副本的设备.当Web请求抵达缓存时,如果本地在“已缓存”的的副本,就可以从本地存储设备而不是原始服务器中提取这个文档.使 ...
- AVR/Arduino定时/计数器、中断入门
在Arduino中,可以使用AnalogWrite来使用硬件产生490Hz/980Hz的pwm波,并可根据参数来设定占空比.不了解这个的同学可以去AnalogWrite学习下,SecretsOfArd ...
- 用verilog模拟DDS产生正弦波信号
前言: DDS:直接数字频率合成,正弦波0-2pi周期内,相位到幅度是一一对应的(这里我们使用放大后的整数幅度). 主要思路: 个人理解,FPGA不擅长直接做数字信号计算,那样太占用片上逻辑资源,所以 ...
- LDO稳压器工作原理
LDO稳压器工作原理 随着便携式设备(电池供电)在过去十年间的快速增长,像原来的业界标准 LM340 和LM317 这样的稳压器件已经无法满足新的需要.这些稳压器使用NPN 达林顿管,在本文中称其为N ...
- PCM EQ DRC 音频处理
PCM Pulse-code modulation的缩写,中文译名是脉冲编码调制.(I2S仅仅是PCM的一个分支,接口定义都是一样的, I2S的采样频率一般为44.1KHZ和48KHZ做,PCM采样频 ...
- 详解HTTP缓存
HTTP缓存是个大公司面试几乎必考的问题,写篇随笔说一下HTTP缓存. 1. HTTP报文首部中有关缓存的字段 在HTTP报文中,与缓存相关的信息都存在首部里,简单说一下首部. 首部 HTTP首部字段 ...
随机推荐
- JavaScript (If...Else和Switch和循环遍历) 语句以及常用消息框
If...Else 语句 JavaScript中if...else语句和Java中的语法和使用方法是一样的. 只是在JavaScript中要使用小写字母.使用大写的 IF 会出错! 至于if...el ...
- Java 数组打印数组的 五种方法
Arrays.toString(arr) for(int n: arr) System.out.println(n+", "); for (int i = 0; i < ar ...
- 实现CheckBox的三种选中状态(全选、半选、不选)在GridView中模拟树形的功能
度娘了很多帖子,只说三种状态要用图片替换来做,但没找到有用的例子,被逼自己写了一个 三方控件肯定是很多的,如jstree,可以直接用 由于公司的UDS限制,不能上传图片,只能文字说明了. 就是要在gr ...
- 3.awk数组详解及企业实战案例
awk数组详解及企业实战案例 3.打印数组: [root@nfs-server test]# awk 'BEGIN{array[1]="zhurui";array[2]=" ...
- 5-udev多路径
udev多路径 查看scsi的唯一标识符 用这个计算机可以识别 重启服务 想要看到下面的,可能重启服务也不行,那就需要重启计算机了 虚拟磁盘 安装这个包multipath 重启服务生效 重启计算机生效 ...
- java的JSP技术
java的JSP技术 [toc] 1.JSP简介 Jsp技术是用来开发java web的页面显示的,所有MVC模型里面的视图层,所以视图层的开发 jsp不是编程语言,三个英文是java server ...
- ASP.NET之纠错
甘特图是:计划项目的时间安排和资源平衡 IoC容器会自动判断javabean和某些数据类型是否建立起依赖关系(装配是否成功),主要用在自动装配中. 通过设置属性<bean id="&q ...
- 解读ASP.NET 5 & MVC6系列(9):日志框架
框架介绍 在之前的.NET中,微软还没有提供过像样的日志框架,目前能用的一些框架比如Log4Net.NLog.CommonLogging使用起来多多少少都有些费劲,和java的SLF4J根本无法相比. ...
- 【教程】简易CDQ分治教程&学习笔记
前言 辣鸡蒟蒻__stdcall终于会CDQ分治啦! CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. CDQ分治的基 ...
- 怎样简单灵活地将DataTable中的数据赋值给model
最近在做的一个项目中,有13个方法都需要用到同一种处理方式:通过SQL语句从数据库获取一条指定的数据,并将该数据中的每个值都赋值给一个model,再将这个model中的数据通过微信发送出去.每个方法都 ...