找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6380|回复: 8
打印 上一主题 下一主题
收起左侧

ADF4351单片机程序

[复制链接]
跳转到指定楼层
楼主
需要的拿去吧

ADF4351单片机驱动源程序如下(c语言代码,请自行移植到各个嵌入式平台.):
  1. #include "ADF4351.h"
  2. #include "delay.h"

  3. //#define
  4. #define ADF4351_R0            ((u32)0X2C8018)
  5. #define ADF4351_R1            ((u32)0X8029)
  6. #define ADF4351_R2            ((u32)0X10E42)
  7. #define ADF4351_R3            ((u32)0X4B3)
  8. #define ADF4351_R4            ((u32)0XEC803C)
  9. #define ADF4351_R5            ((u32)0X580005)

  10. #define ADF4351_R1_Base    ((u32)0X8001)
  11. #define ADF4351_R4_Base    ((u32)0X8C803C)
  12. #define ADF4351_R4_ON      ((u32)0X8C803C)
  13. #define ADF4351_R4_OFF    ((u32)0X8C883C)

  14. #define ADF4351_RF_OFF    ((u32)0XEC801C)

  15. #define ADF4351_PD_ON        ((u32)0X10E42)
  16. #define ADF4351_PD_OFF    ((u32)0X10E02)


  17. void ADF_Output_GPIOInit(void)
  18. {
  19.     GPIO_InitTypeDef GPIO_InitStruct;
  20.    
  21.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  22.     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
  23.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  24.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
  25.     GPIO_Init(GPIOA, &GPIO_InitStruct);
  26.    
  27. }

  28. void ADF_Input_GPIOInit(void)
  29. {
  30.     GPIO_InitTypeDef GPIO_InitStruct;
  31.    
  32.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  33.     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
  34.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  35.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
  36.     GPIO_Init(GPIOA, &GPIO_InitStruct);
  37.    
  38.     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
  39.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING ;
  40.     GPIO_Init(GPIOA, &GPIO_InitStruct);   
  41. }

  42. void delay (int length)
  43. {
  44.     while (length >0)
  45.         length--;
  46. }

  47. void WriteToADF4351(u8 count, u8 *buf)
  48. {
  49.     u8 ValueToWrite = 0;
  50.     u8 i = 0;
  51.     u8 j = 0;
  52.    
  53. //    ADF_Output_GPIOInit();
  54.    
  55.     ADF4351_CE = 1;
  56.     delay_us(1);
  57.     ADF4351_CLK = 0;
  58.     ADF4351_LE = 0;
  59.     delay_us(1);
  60.    
  61.     for(i = count; i>0; i--)
  62.     {
  63.         ValueToWrite = *(buf+i-1);
  64.         for(j=0; j<8; j++)
  65.         {
  66.             if(0x80 == (ValueToWrite & 0x80))
  67.             {
  68.                 ADF4351_OUTPUT_DATA = 1;
  69.             }
  70.             else
  71.             {
  72.                 ADF4351_OUTPUT_DATA = 0;
  73.             }
  74.             delay_us(1);
  75.             ADF4351_CLK = 1;
  76.             delay_us(1);
  77.             ValueToWrite <<= 1;
  78.             ADF4351_CLK = 0;   
  79.         }
  80.     }
  81.     ADF4351_OUTPUT_DATA = 0;
  82.     delay_us(1);
  83.     ADF4351_LE = 1;
  84.     delay_us(1);
  85.     ADF4351_LE = 0;
  86. }


  87. void ReadToADF4351(u8 count, u8 *buf)
  88. {
  89.     u8 i = 0;
  90.     u8 j = 0;
  91.     u8 iTemp = 0;
  92.     u8 RotateData = 0;
  93.    
  94.     ADF_Input_GPIOInit();
  95.     ADF4351_CE = 1;
  96.     delay_us(1);
  97.     ADF4351_CLK = 0;
  98.     ADF4351_LE = 0;
  99.     delay_us(1);
  100.    
  101.     for(i = count; i>0; i--)
  102.     {
  103.         for(j = 0; j<8; j++)
  104.         {
  105.             RotateData <<=1;
  106.             delay_us(1);
  107.             iTemp = ADF4351_INPUT_DATA;
  108.             ADF4351_CLK = 1;
  109.             if(0x01 == (iTemp&0x01))
  110.             {
  111.                 RotateData |= 1;
  112.             }
  113.             delay_us(1);
  114.             ADF4351_CLK = 0;
  115.         }
  116.         *(buf+i-1) = RotateData;
  117.     }
  118.     delay_us(1);
  119.     ADF4351_LE = 1;
  120.     delay_us(1);
  121.     ADF4351_LE = 0;
  122. }


  123. void ADF4351Init(void)
  124. {
  125.     u8 buf[4] = {0,0,0,0};
  126.    
  127.     ADF_Output_GPIOInit();
  128.    
  129.     buf[3] = 0x00;
  130.     buf[2] = 0x58;                //R5
  131.     buf[1] = 0x00;                //write communication register 0x00580005 to control the progress
  132.      buf[0] = 0x05;                //to write Register 5 to set digital lock detector
  133.     WriteToADF4351(4,buf);        

  134.     buf[3] = 0x00;                //R4
  135.     buf[2] = 0xec;                //(DB23=1)The signal is taken from the VCO directly;(DB22-20:4H)the RF divider is 16;(DB19-12:C8H)R is 200
  136.     buf[1] = 0x80;                //(DB11=0)VCO powerd up;
  137.      buf[0] = 0x3C;                //(DB5=1)RF output is enabled;(DB4-3=3H)Output power level is 5
  138.     WriteToADF4351(4,buf);        

  139.     buf[3] = 0x00;
  140.     buf[2] = 0x00;                //R3
  141.     buf[1] = 0x04;                //(DB14-3:96H)clock divider value is 150.
  142.      buf[0] = 0xB3;
  143.     WriteToADF4351(4,buf);   
  144.    
  145.     buf[3] = 0x00;                //R2
  146. //    buf[2] = 0x01;                //(DB6=1)set PD polarity is positive;(DB7=1)LDP is 6nS;
  147. //    buf[1] = 0x0E;                //(DB8=0)enable fractional-N digital lock detect;
  148.     buf[2] = 0x00;
  149.     buf[1] = 0x4E;
  150.      buf[0] = 0x42;                //(DB12-9:7H)set Icp 2.50 mA;
  151.     WriteToADF4351(4,buf);        //(DB23-14:1H)R counter is 1

  152.     buf[3] = 0x00;
  153.     buf[2] = 0x00;                //R1
  154.     buf[1] = 0x80;               //(DB14-3:6H)MOD counter is 6;
  155.      buf[0] = 0x29;               //(DB26-15:6H)PHASE word is 1,neither the phase resync
  156.     WriteToADF4351(4,buf);       //nor the spurious optimization functions are being used
  157.                                //(DB27=1)prescaler value is 8/9

  158.     buf[3] = 0x00;
  159.     buf[2] = 0x2c;
  160.     buf[1] = 0x80;                //R0
  161.      buf[0] = 0x18;                //(DB14-3:0H)FRAC value is 0;
  162.     WriteToADF4351(4,buf);        //(DB30-15:140H)INT value is 320;
  163.    
  164.    
  165. //    WriteOneRegToADF4351(ADF4351_R0);
  166. //    WriteOneRegToADF4351(ADF4351_R1);
  167. //    WriteOneRegToADF4351(ADF4351_R2);
  168. //    WriteOneRegToADF4351(ADF4351_R3);
  169. //    WriteOneRegToADF4351(ADF4351_R4);
  170. //    WriteOneRegToADF4351(ADF4351_R5);
  171.    
  172. }
  173. void WriteOneRegToADF4351(u32 Regster)
  174. {
  175.     u8 buf[4] = {0,0,0,0};
  176.     buf[3] = (u8)((Regster>>24)&(0X000000FF));
  177.     buf[2] = (u8)((Regster>>16)&(0X000000FF));
  178.     buf[1] = (u8)((Regster>>8) &(0X000000FF));
  179.     buf[0] = (u8)((Regster)&(0X000000FF));
  180.     WriteToADF4351(4,buf);   
  181. }
  182. void ADF4351_Init_some(void)
  183. {
  184.     WriteOneRegToADF4351(ADF4351_R2);
  185.     WriteOneRegToADF4351(ADF4351_R3);
  186.     WriteOneRegToADF4351(ADF4351_R5);
  187. }

  188. void ADF4351WriteFreq(float Fre)        //    (xx.x) M Hz
  189. {
  190.     u16 Fre_temp, N_Mul = 1, Mul_Core = 0;
  191.     u16 INT_Fre, Frac_temp, Mod_temp, i;
  192.     u32 W_ADF4351_R0 = 0, W_ADF4351_R1 = 0, W_ADF4351_R4 = 0;
  193.     float multiple;
  194.    
  195.     if(Fre < 35.0)
  196.         Fre = 35.0;
  197.     if(Fre > 4400.0)
  198.         Fre = 4400.0;
  199.     Mod_temp = 250;
  200.     Fre = ((float)((u32)(Fre*10)))/10;
  201.    
  202.     Fre_temp = Fre;
  203.     for(i = 0; i < 10; i++)
  204.     {
  205.         if(((Fre_temp*N_Mul) >= 2199.9) && ((Fre_temp*N_Mul) <= 4400.1))
  206.             break;
  207.         Mul_Core++;
  208.         N_Mul = N_Mul*2;
  209.     }
  210.    
  211.     multiple = (Fre*N_Mul)/25;        //带宽出已固定为参考25M,若改参考频率,则应修改R4低字节
  212.     INT_Fre = (u16)multiple;
  213. //    if(((u32)(multiple*10000)%10)> 5)
  214. //        multiple += 0.001;
  215.     Frac_temp = ((u32)(multiple*250))%250;
  216.     while(((Frac_temp%5) == 0) && ((Mod_temp%5) == 0))
  217.     {
  218.         Frac_temp = Frac_temp/5;
  219.         Mod_temp = Mod_temp/5;
  220.     }
  221.     while(((Frac_temp%2) == 0)&&((Mod_temp%2) == 0))
  222.     {
  223.         Frac_temp = Frac_temp/2;
  224.         Mod_temp = Mod_temp/2;
  225.     }
  226.    
  227.     Mul_Core %= 7;
  228.     W_ADF4351_R0 = (INT_Fre<<15)+(Frac_temp<<3);
  229.     W_ADF4351_R1 = ADF4351_R1_Base + (Mod_temp<<3);
  230.     W_ADF4351_R4 = ADF4351_R4_ON + (Mul_Core<<20);
  231.    
  232.    
  233. //    WriteOneRegToADF4351(ADF4351_PD_OFF); //ADF4351_RF_OFF
  234. //    WriteOneRegToADF4351((u32)(ADF4351_R4_OFF + (6<<20)));
  235.     WriteOneRegToADF4351(ADF4351_RF_OFF);
  236.     WriteOneRegToADF4351(W_ADF4351_R1);
  237.     WriteOneRegToADF4351(W_ADF4351_R0);
  238.     WriteOneRegToADF4351(W_ADF4351_R4);
  239. //    WriteOneRegToADF4351(ADF4351_PD_ON);
  240.    
  241. //    WriteOneRegToADF4351((u32)(ADF4351_R4_ON + (Mul_Core<<20)));
  242. }

复制代码
  1. #ifndef _ADF4351_H_
  2. #define _ADF4351_H_

  3. #include "sys.h"

  4. #define ADF4351_CLK PAout(7)
  5. #define ADF4351_OUTPUT_DATA PAout(6)
  6. #define ADF4351_LE PAout(5)
  7. #define ADF4351_CE PAout(4)

  8. #define ADF4351_INPUT_DATA PAin(1)


  9. void ADF4351Init(void);
  10. void ReadToADF4351(u8 count, u8 *buf);
  11. void WriteToADF4351(u8 count, u8 *buf);
  12. void WriteOneRegToADF4351(u32 Regster);
  13. void ADF4351_Init_some(void);
  14. void ADF4351WriteFreq(float Fre);                //        (xx.x) M Hz
  15. void ADF_Output_GPIOInit(void);
  16. #endif

复制代码



c语言代码,请自行移植到各个嵌入式平台

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:248916 发表于 2017-11-15 15:16 来自手机 | 只看该作者
有详细的么。
回复

使用道具 举报

板凳
ID:499266 发表于 2019-7-16 09:39 | 只看该作者
感觉很不错诶,最近刚开始学习ADF4351模块,还有很多地方不懂,作者大大的这个挺有参考价值的
回复

使用道具 举报

地板
ID:970087 发表于 2021-10-6 15:50 | 只看该作者
下载了 怎么没有余下代码
回复

使用道具 举报

5#
ID:262 发表于 2021-10-7 03:29 | 只看该作者
NL950806 发表于 2021-10-6 15:50
下载了 怎么没有余下代码

在那个.c文件里面,234行的后面就是
回复

使用道具 举报

6#
ID:970087 发表于 2021-10-8 16:47 | 只看该作者
heicad 发表于 2021-10-7 03:29
在那个.c文件里面,234行的后面就是

程序怎么有错误呢
回复

使用道具 举报

7#
ID:970087 发表于 2021-10-8 16:52 | 只看该作者
heicad 发表于 2021-10-7 03:29
在那个.c文件里面,234行的后面就是

是C文件里面 数4行下面 的程序吗  把程序加进去就行了吗
回复

使用道具 举报

8#
ID:970087 发表于 2021-10-8 17:11 | 只看该作者
heicad 发表于 2021-10-7 03:29
在那个.c文件里面,234行的后面就是

是加在程序的后面 还是哪里
回复

使用道具 举报

9#
ID:262 发表于 2021-10-9 01:35 | 只看该作者
NL950806 发表于 2021-10-8 17:11
是加在程序的后面 还是哪里

楼主的这个diam估计是从他自己的工程项目中提取取出来,又没有说是什么MCU芯片的,你得移植进你的项目,你用的是什么单片机?得改一下delay,把ADF4351.c里面该去掉的全都去掉,然后加入你自己的main()才行,楼主的文件只是一些函数而已,你得自己在main里面调用这些函数,实现你自己的功能,说白了就是复制粘贴然,然后用你自己的思路来组合,以便实现你需要的功能.你可能需要一个完整的实例来参考学习,论坛里面有人上传这个芯片的430MCU的工程,你可以参考一下:http://www.51hei.com/bbs/dpj-99871-1.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表