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_