#include <stm32f10x.h>
#include "lmx2595.h"
_LMX2595_REG lmx;
static LMX_MAP_T sLMX_MAP_T = {
//sck
{
RCC_APB2Periph_GPIOC,
GPIOC,
GPIO_Pin_8,
},
//sdi
{
RCC_APB2Periph_GPIOC,
GPIOC,
GPIO_Pin_7,
},
//csb
{
RCC_APB2Periph_GPIOB,
GPIOB,
GPIO_Pin_15,
},
//ldo
{
RCC_APB2Periph_GPIOC,
GPIOC,
GPIO_Pin_6,
}
};
unsigned char gLmxLdSta = 0x00;
static void DELAY_Nop(uint32_t num)
{
while(num--)
{
__NOP();
}
}
void Lmx_CSB_SET(void)
{
GPIO_WriteBit(sLMX_MAP_T.CSB.gpio, sLMX_MAP_T.CSB.gpio_pin, Bit_SET);
}
void Lmx_CSB_RESET(void)
{
GPIO_WriteBit(sLMX_MAP_T.CSB.gpio, sLMX_MAP_T.CSB.gpio_pin, Bit_RESET);
}
void Lmx_SCK_SET(void)
{
GPIO_WriteBit(sLMX_MAP_T.SCK.gpio, sLMX_MAP_T.SCK.gpio_pin, Bit_SET);
}
void Lmx_SCK_RESET(void)
{
GPIO_WriteBit(sLMX_MAP_T.SCK.gpio, sLMX_MAP_T.SCK.gpio_pin, Bit_RESET);
}
void Lmx_SDI_SET(void)
{
GPIO_WriteBit(sLMX_MAP_T.SDI.gpio, sLMX_MAP_T.SDI.gpio_pin, Bit_SET);
}
void Lmx_SDI_RESET(void)
{
GPIO_WriteBit(sLMX_MAP_T.SDI.gpio, sLMX_MAP_T.SDI.gpio_pin, Bit_RESET);
}
uint8_t spi_8bit(uint8_t dat)
{
uint8_t rCtrlSpiCodeB;
uint8_t i;
uint8_t B_Miso = 0x00;
rCtrlSpiCodeB = dat;
for(i=0;i<8;i++)
{
B_Miso = (B_Miso<<0x01);
if((rCtrlSpiCodeB&0x80) == 0x00)
{
Lmx_SDI_RESET();
}
else
{
Lmx_SDI_SET();
}
Lmx_SCK_RESET();
DELAY_Nop(10);
Lmx_SCK_SET();
DELAY_Nop(10);
//上升沿后微小延时,读取MISO数据//
B_Miso=GPIO_ReadInputDataBit(sLMX_MAP_T.LDO.gpio, sLMX_MAP_T.LDO.gpio_pin);
Lmx_SCK_RESET();
rCtrlSpiCodeB = (rCtrlSpiCodeB<<1);
}
return B_Miso;
}
uint16_t spi_16bit(uint16_t dat)
{
uint16_t rCtrlSpiCodeW;
uint8_t i;
uint16_t W_Miso = 0x00;
rCtrlSpiCodeW = dat;
for(i=0;i<16;i++)
{
W_Miso = (W_Miso<<0x0001);
if((rCtrlSpiCodeW&0x8000) == 0x0000)
{
Lmx_SDI_RESET();
}
else
{
Lmx_SDI_SET();
}
Lmx_SCK_RESET();
DELAY_Nop(10);
Lmx_SCK_SET();
//上升沿后微小延时,读取MISO数据//
W_Miso = (W_Miso | GPIO_ReadInputDataBit(sLMX_MAP_T.LDO.gpio, sLMX_MAP_T.LDO.gpio_pin));
DELAY_Nop(10);
Lmx_SCK_RESET();
rCtrlSpiCodeW = (rCtrlSpiCodeW<<1);
}
return W_Miso;
}
//对器件进行读操作,输入为寄存器地址,返回读出的数据//
uint16_t lmxRead(uint8_t regadr)
{
uint16_t rddat;
regadr=regadr|0x80; //将寄存器地址最高位置1,确保为读操作//
Lmx_CSB_RESET(); //片选信号拉低//
Lmx_SCK_RESET();
DELAY_Nop(5);
spi_8bit(regadr); //送出地址//
rddat=spi_16bit(0); //送出16位无效数据,用于回读寄存器数据//
DELAY_Nop(5);
Lmx_CSB_SET(); //片选失效//
return rddat;
}
void LmxWrite(uint8_t regadr,uint16_t dat)
{
regadr=regadr&0x7f; //将寄存器地址最高位置0,确保为写操作//
Lmx_CSB_RESET(); //片选信号拉低//
Lmx_SCK_RESET();
DELAY_Nop(5);
spi_8bit(regadr); //送出地址//
spi_16bit(dat); //送出数据//
DELAY_Nop(5);
Lmx_CSB_SET(); //片选失效//
}
void LmxPortReset(void)
{
Lmx_CSB_SET(); //片选失效//
Lmx_SCK_RESET();
Lmx_SDI_RESET();
}
void Lmx_PortIntit(void)
{
static GPIO_InitTypeDef GPIO_InitStructure;
//SCK
RCC_APB2PeriphClockCmd(sLMX_MAP_T.SCK.RCC_Periph_Type, ENABLE);
GPIO_InitStructure.GPIO_Pin = sLMX_MAP_T.SCK.gpio_pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(sLMX_MAP_T.SCK.gpio, &GPIO_InitStructure);
//SDI
RCC_APB2PeriphClockCmd(sLMX_MAP_T.SCK.RCC_Periph_Type, ENABLE);
GPIO_InitStructure.GPIO_Pin = sLMX_MAP_T.SDI.gpio_pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(sLMX_MAP_T.SDI.gpio, &GPIO_InitStructure);
//CSB
RCC_APB2PeriphClockCmd(sLMX_MAP_T.SCK.RCC_Periph_Type, ENABLE);
GPIO_InitStructure.GPIO_Pin = sLMX_MAP_T.CSB.gpio_pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(sLMX_MAP_T.CSB.gpio, &GPIO_InitStructure);
//LD
RCC_APB2PeriphClockCmd(sLMX_MAP_T.SCK.RCC_Periph_Type, ENABLE);
GPIO_InitStructure.GPIO_Pin = sLMX_MAP_T.LDO.gpio_pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(sLMX_MAP_T.LDO.gpio, &GPIO_InitStructure);
LmxPortReset();
}
void SetLmxParameter(void)
{
#if 1
lmx.LMX_R112.All = 0x0000;
lmx.LMX_R111.All = 0x0000;
lmx.LMX_R110.All = 0x0000;
lmx.LMX_R109.All = 0x0000;
lmx.LMX_R108.All = 0x0000;
lmx.LMX_R107.All = 0x0000;
lmx.LMX_R106.All = 0x0000;
lmx.LMX_R105.All = 0x0021;
lmx.LMX_R104.All = 0x0000;
lmx.LMX_R103.All = 0x0000;
lmx.LMX_R102.All = 0x0000;
lmx.LMX_R101.All = 0x0011;
lmx.LMX_R100.All = 0x0000;
lmx.LMX_R99.All = 0x0000;
lmx.LMX_R98.All = 0x0000;
lmx.LMX_R97.All = 0x0888;
lmx.LMX_R96.All = 0x0000;
lmx.LMX_R95.All = 0x0000;
lmx.LMX_R94.All = 0x0000;
lmx.LMX_R93.All = 0x0000;
lmx.LMX_R92.All = 0x0000;
lmx.LMX_R91.All = 0x0000;
lmx.LMX_R90.All = 0x0000;
lmx.LMX_R89.All = 0x0000;
lmx.LMX_R88.All = 0x0000;
lmx.LMX_R87.All = 0x0000;
lmx.LMX_R86.All = 0x0000;
lmx.LMX_R85.All = 0x0000;
lmx.LMX_R84.All = 0x0000;
lmx.LMX_R83.All = 0x0000;
lmx.LMX_R82.All = 0x0000;
lmx.LMX_R81.All = 0x0000;
lmx.LMX_R80.All = 0x0000;
lmx.LMX_R79.All = 0x0000;
lmx.LMX_R78.All = 0x0129;
lmx.LMX_R77.All = 0x0000;
lmx.LMX_R76.All = 0x000C;
lmx.LMX_R75.All = 0x0800;
lmx.LMX_R74.All = 0x0000;
lmx.LMX_R73.All = 0x003F;
lmx.LMX_R72.All = 0x0001;
lmx.LMX_R71.All = 0x0081;
lmx.LMX_R70.All = 0xC350;
lmx.LMX_R69.All = 0x0000;
lmx.LMX_R68.All = 0x03E8;
lmx.LMX_R67.All = 0x0000;
lmx.LMX_R66.All = 0x01F4;
lmx.LMX_R65.All = 0x0000;
lmx.LMX_R64.All = 0x1388;
lmx.LMX_R63.All = 0x0000;
lmx.LMX_R62.All = 0x0322;
lmx.LMX_R61.All = 0x00A8;
lmx.LMX_R60.All = 0x0000;
lmx.LMX_R59.All = 0x0001;
lmx.LMX_R58.All = 0x9001;
lmx.LMX_R57.All = 0x0020;
lmx.LMX_R56.All = 0x0000;
lmx.LMX_R55.All = 0x0000;
lmx.LMX_R54.All = 0x0000;
lmx.LMX_R53.All = 0x0000;
lmx.LMX_R52.All = 0x0820;
lmx.LMX_R51.All = 0x0080;
lmx.LMX_R50.All = 0x0000;
lmx.LMX_R49.All = 0x4180;
lmx.LMX_R48.All = 0x0300;
lmx.LMX_R47.All = 0x0300;
lmx.LMX_R46.All = 0x07FD;
lmx.LMX_R45.All = 0xD0DF;
lmx.LMX_R44.All = 0x1FA3;
lmx.LMX_R43.All = 0x0EA6;
lmx.LMX_R42.All = 0x0000;
lmx.LMX_R41.All = 0x0000;
lmx.LMX_R40.All = 0x0000;
lmx.LMX_R39.All = 0x2710;
lmx.LMX_R38.All = 0x0000;
lmx.LMX_R37.All = 0x0304;
lmx.LMX_R36.All = 0x002C;
lmx.LMX_R35.All = 0x0004;
lmx.LMX_R34.All = 0x0000;
lmx.LMX_R33.All = 0x1E21;
lmx.LMX_R32.All = 0x0393;
lmx.LMX_R31.All = 0x03EC;
lmx.LMX_R30.All = 0x318C;
lmx.LMX_R29.All = 0x318C;
lmx.LMX_R28.All = 0x0488;
lmx.LMX_R27.All = 0x0003;
lmx.LMX_R26.All = 0x0DB0;
lmx.LMX_R25.All = 0x0C2B;
lmx.LMX_R24.All = 0x071A;
lmx.LMX_R23.All = 0x007C;
lmx.LMX_R22.All = 0x0001;
lmx.LMX_R21.All = 0x0401;
lmx.LMX_R20.All = 0xD048;
lmx.LMX_R19.All = 0x27B7;
lmx.LMX_R18.All = 0x0064;
lmx.LMX_R17.All = 0x0158;
lmx.LMX_R16.All = 0x0080;
lmx.LMX_R15.All = 0x064F;
lmx.LMX_R14.All = 0x1E30; //0x1E30:1.2mA 0x1E70: 1.5mA
lmx.LMX_R13.All = 0x4000;
lmx.LMX_R12.All = 0x5001;
lmx.LMX_R11.All = 0x0018;
lmx.LMX_R10.All = 0x10D8;
lmx.LMX_R9.All = 0x1604;
lmx.LMX_R8.All = 0x2000;
lmx.LMX_R7.All = 0x40B2;
lmx.LMX_R6.All = 0xC802;
lmx.LMX_R5.All = 0x00C8;
lmx.LMX_R4.All = 0x0A43;
lmx.LMX_R3.All = 0x0642;
lmx.LMX_R2.All = 0x0500;
lmx.LMX_R1.All = 0x0808;
lmx.LMX_R0.All = 0x251C;
#endif
#if 0
//100M PFD
lmx.LMX_R112.All = 0x0000;
lmx.LMX_R111.All = 0x0000;
lmx.LMX_R110.All = 0x0000;
lmx.LMX_R109.All = 0x0000;
lmx.LMX_R108.All = 0x0000;
lmx.LMX_R107.All = 0x0000;
lmx.LMX_R106.All = 0x0000;
lmx.LMX_R105.All = 0x0021;
lmx.LMX_R104.All = 0x0000;
lmx.LMX_R103.All = 0x0000;
lmx.LMX_R102.All =
STM32+LMX2595
需积分: 0 26 浏览量
更新于2022-11-28
4
收藏 5KB ZIP 举报
STM32是一款基于ARM Cortex-M内核的微控制器,广泛应用于嵌入式系统设计,尤其在工业、汽车和消费电子领域。LMX2595则是一款高性能的射频(RF)电压控制振荡器(VCO),适用于无线通信和射频系统。在这个项目中,我们将探讨如何使用STM32通过SPI(串行外设接口)来控制LMX2595。
SPI是一种同步串行通信协议,用于连接微控制器和各种外设,如传感器、存储器和数字信号处理器。它通常由四个主要线缆组成:主设备输出/从设备输入(MISO)、主设备输入/从设备输出(MOSI)、时钟(SCK)和片选(CS)。STM32作为SPI的主设备,将通过这些线缆向LMX2595发送命令和配置数据。
LMX2595是一款灵活的VCO,可提供广泛的频率范围和出色的相位噪声性能。它支持多种工作模式,如连续波(CW)、脉冲调制(PM)和频率调制(FM)。通过SPI接口,用户可以配置LMX2595的工作频率、调制参数、电源管理设置等。
为了实现SPI控制LMX2595,首先需要在STM32的固件中配置相应的SPI接口。这包括选择适当的GPIO引脚作为SPI线缆,设置时钟速度、数据帧格式(如8位数据、MSB优先)和SPI模式(如模式0或模式1)。在STM32CubeMX或类似的配置工具中,可以轻松完成这些设置。
接着,编写SPI传输函数。这个函数应包含初始化SPI总线、选择从设备(拉低CS引脚)、发送数据到从设备、等待接收数据并最终释放从设备的过程。在STM32的HAL库中,可以使用`HAL_SPI_TransmitReceive()`函数进行数据交换。
对于LMX2595的控制,需要理解其数据手册中的寄存器映射和命令集。每个寄存器都有特定的功能,比如设置工作频率、调制参数或电源状态。通过SPI发送适当的数据序列到LMX2595的地址,就可以改变这些寄存器的值。在编写代码时,可以创建结构体来表示这些寄存器,并提供相应的设置函数。
例如,如果要设置LMX2595的工作频率,可能需要先计算出所需的分频系数,然后将这个系数写入相应的频率设置寄存器。频率计算可能涉及到复杂的数学公式,包括与VCO的增益和参考频率相关的计算。
在实际应用中,还需要考虑错误处理和中断处理。例如,当SPI传输失败时,应当有重试机制或者故障报告。此外,LMX2595可能有中断输出,如锁定检测,可以通过STM32的中断系统来响应。
测试是验证SPI通信和LMX2595控制功能的关键步骤。可以使用示波器检查SPI信号,确保时钟、数据传输和片选信号正确无误。同时,可以通过读取LMX2595的状态寄存器来确认设置是否成功,或者通过测量输出频率来验证VCO的工作状态。
通过STM32的SPI接口控制LMX2595是一项涉及硬件配置、软件编程和射频知识的任务。正确理解和应用这些知识点,将能够实现高效、可靠的系统设计。在实际项目中,根据具体需求,可能还需要考虑其他因素,如电磁兼容性、电源稳定性等。
qq_32007751
- 粉丝: 0
- 资源: 7
最新资源
- Java源码jsp狄氏皮草服装店销售管理系统-毕业设计-期末大作业.zip
- Java源码jsp大学生综合素质测评系统-毕业设计-期末大作业.zip
- Java源码jsp大学新生报到管理系统-毕业设计-期末大作业.zip
- 论文文档八位移位输出芯片在LED大屏幕显示中的应用
- postgis-3.4.0.tar.gz
- 太阳能发电板组框设备sw15可编辑全套技术资料100%好用.zip
- Java源码jsp电子商品销售网站-毕业设计-期末大作业.zip
- Java源码jsp多媒体教学网-毕业设计-期末大作业.zip
- Java源码jsp动画门户网-毕业设计-期末大作业.zip
- [Android实例] 【版主帖推荐】继人员列表,聊天的实现,包括图片,语音-仅用于Android项目学习
- ProxyPool 爬虫代理IP池【python爬虫】
- Java源码jsp二手车销售管理系统-毕业设计-期末大作业.zip
- ABAQUS三维多孔材料,可生成实体多孔材料空隙连接或六面体网格映射模型 可自定义参数包括基体长宽高,骨料半径范围,体积比以及网格的尺寸 可导出到comsol ansys cad等
- Java源码jsp多用户博客系统-毕业设计-期末大作业.zip
- Java源码jsp法律援助与咨询系统-毕业设计-期末大作业.zip
- 减速器含设计文档减速器箱体工艺设计(图)毕业设计