历史上的今天
今天是:2025年02月04日(星期二)
2020年02月04日 | 基于STM32单片机连接射频si4438模块的方案设计
2020-02-04 来源:eefocus
SI4438射频模块参数:
1、频率范围:425-525MHz
2、数字接收信号强度指示(RSSI)
3、64字节收发数据寄存器(FIFO)
4、跳频功能

等!
使用SI的WDS工具生成代码
1、选择仿真模式
2、芯片选择si4438 B1模式
3、Radio Configuration ApplicaTIon
4、Select ApplicaTIon
1、Select Project
选择BidirecTIonal packet ,双向通信模式
2、Configure project 配置工程
Frequency and power: 频率和功率的设置,
base freq基频,中心频率,
Channel spacing 通道空间,某个通道回忆 base freq+ channel spacin*num 为频率通信,当然会有小浮动,但是浮动不会超过 Channel spacing。
计算通道号数量:
(Base freq + channel spacin*num) 》=425MHz
(Base freq + channel spacin*num) 《=525MHz
所以Base freq的设置以及channel spacing的设置会影响到通道的数量。
Crystal:晶振默认!
其他的不动
RF parameter
这里设置的射频参数,包括调制模式、数据速率等参数,RSSI threshold设置信号阈值。数据速率射频之间的距离有关系,速度越快,对应的距离要求越短。所以这应该按照自己的需求来选。
Pakect数据包的设置,包括TX和RX缓冲区的长度、前导码的配置Preamble、同步字的配置SyncWord、Field对应负载的字节数据,注意总的负载字节数为TX和RX阈值,具体分几个fields看个人需求。
NIRQ配置成RX data output,即NIRQ和单片机引脚相连单片机可以通过该引脚判断是否有数据接收。低电平有效!然后即可生成代码!
生成的代码是基于C8051F910单片机的,我们所用的是STM32,所以必须做好移植。
SPI移植:
不需要生成spi.c,建立STM32 SPI配置文件:
#include
#include“stm32f10x_spi.h”
#include“STM32SPI2.h”
u8STM32SPI2_ReadWriteByte(u8TxData)
{
u8retry=0;
while((SPI2-》SR&1《《1)==0){
retry++;
if(retry》250)
return0;
}
SPI2-》DR=TxData;
retry=0;
while((SPI2-》SR&1《《0)==0)//
{
retry++;
if(retry》250)
return0;
}
returnSPI2-》DR;
}
//APB2=72M/8=9M
voidSTM32SPI2_Config(void)
{
SPI_InitTypeDefSPI_InitStructure;
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
/*ConfigureSPI2pins:SCK,MISOandMOSI*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
/*ConfigureNSELpins*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
/*SPI2configuraTIon*/
SPI_I2S_DeInit(SPI2);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
SPI_Cmd(SPI2,DISABLE);
SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode=SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_128;//SPI_BaudRatePrescaler_64;
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial=7;
SPI_Init(SPI2,&SPI_InitStructure);
/*EnableSPI2*/
SPI_Cmd(SPI2,ENABLE);
STM32SPI2_ReadWriteByte(0xff);//启动传输
}
//í?ò?ê±?????üê1?üò???SPIéè±?,2?êyTYPE_SPI_ALL?TD§
voidSTM32SPI2_Enable(TYPE_SPItype)
{
/*
if(type==TYPE_SPI_FLASH)//这其实没啥用
{
GPIO_SetBits(GPIOA,GPIO_Pin_4);//ê§?üRF
GPIO_ResetBits(GPIOC,GPIO_Pin_4);//ê1?üFLASH
}
else
{
*/
//GPIO_SetBits(GPIOC,GPIO_Pin_4);//ê§?üFLASH
GPIO_ResetBits(GPIOB,GPIO_Pin_12);//
/*
}
*/
}
voidSTM32SPI2_Disable(TYPE_SPItype)
{
if(type==TYPE_SPI_FLASH)
{
GPIO_SetBits(GPIOC,GPIO_Pin_4);//ê§?üFLASH
}
elseif(type==TYPE_SPI_RF)
{
GPIO_SetBits(GPIOB,GPIO_Pin_12);//ê§?üRF
}
else
{
GPIO_SetBits(GPIOC,GPIO_Pin_4);//ê§?üFLASH
GPIO_SetBits(GPIOA,GPIO_Pin_4);//ê§?üRF
}
}
radio.cradiohal层spi接口修改处
voidradio_hal_SpiWriteByte(u8byteToWrite)
{
STM32SPI2_ReadWriteByte(byteToWrite);
}
u8radio_hal_SpiReadByte(void)
{
returnSTM32SPI2_ReadWriteByte(0xFF);
}
voidradio_hal_SpiWriteData(u8byteCount,u8*pData)
{
while(byteCount--)
{
STM32SPI2_ReadWriteByte(*pData++);
}
}
voidradio_hal_SpiReadData(u8byteCount,u8*pData)
{
while(byteCount--)
{
*pData++=STM32SPI2_ReadWriteByte(0xFF);
}
}
Radio_Config:配置SDNpowerIRQ引脚
voidRadio_Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
//oíFLASH12ó?ò???SPI,SPIò??-?úFLASHμ?3?ê??ˉ?Dμ÷ó?
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);
//RF_POWER
GPIO_InitStructure.GPIO_Pin=RF_POWER_PIN;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(RF_POWER_PORT,&GPIO_InitStructure);
GPIO_SetBits(RF_POWER_PORT,RF_POWER_PIN);
//RF_ON
GPIO_InitStructure.GPIO_Pin = RF_
史海拾趣
|
给想学linux的朋友一些建议(我学linux的体会) 一. 什么人会学linux? 这个问题涉及到linux是否会代替Windows。我认为绝对不可能。Windows易上手易学习的特点,以及Microsoft多年的积累,加上丰富的软件选择,是linux不可比拟的。 那为什么我们 ...… 查看全部问答> |
|
摘要:介绍基于SRAM的可重配置CPLD的原理,通过对多种串行配置的比较,提出了由单片机和FLASH存储器组成的串行配置方式,并从系统复杂度、可靠性和经济性等方面进行了比较和分析。 关键词:复杂可编程逻辑器件 静态随机存储器 被动串行 基于SRAM ...… 查看全部问答> |
|
十八般兵器 快使用单片机,哼哼哈兮! 孔子说:“工欲善其事,必先利其器”,学习单片机所用的工具、元器件和数模电路是有一些区别的,我们在学习之前 最好先备齐它们,至少让外人看出我们是搞过单片机的。有几样东东很重要,在上场之前不得不提 ...… 查看全部问答> |
|
本帖最后由 jameswangsynnex 于 2015-3-3 19:58 编辑 AMD不久前终于在移动计算机领域向英特尔发起了攻击,推出了一些新的移动处理器。但是,AMD还更新了其台式电脑芯片产品线。然而,总是有推出更多的处理器的空间,因为英特尔定期发布新的芯片。A ...… 查看全部问答> |
|
RT,在网上找了些,发现有个专门做电桥信号放大的芯片,AM457,AM467和AM417,可一问价格,二十几块钱,晕死, 这么贵! 不知道大家知不知道性价比好点的?… 查看全部问答> |
|
发送多于16个自己的数据, pc就接收困难。我PC部分使用com控件接收。在C#下编的程序。 不知道遇到类似问题的人,如何解决 这个问题的 。 我用的2812 。 … 查看全部问答> |
|
小弟最近按照EEWORLDDEC f2812实验板的原理图自己刷了一块PCB 在调试中遇到了一点问题 1。片内flash在烧写时总是不成功,用EEWORLD提供的FLASH测试程序提示FLASH无法写入。小弟想请问在烧写片内FLASH要注意些什么,F2812的引脚定义要注意些什么 2 ...… 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 12:48 编辑 有谁用过NS公司的lmp90100芯片没有,这两天我用这款芯片作为PT100和热电偶的前端处理,但是一直不能让芯片动起来,希望用过的朋友能提供一下调试经验,因为我用的是自己做的板子做的测试,现在无法定 ...… 查看全部问答> |




