1、頻率范圍:425-525MHz
3、64字節(jié)收發(fā)數據寄存器(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:晶振默認!
其他的不動
這里設置的射頻參數,包括調制模式、數據速率等參數,RSSI threshold設置信號閾值。數據速率射頻之間的距離有關系,速度越快,對應的距離要求越短。所以這應該按照自己的需求來選。
Pakect數據包的設置,包括TX和RX緩沖區(qū)的長度、前導碼的配置Preamble、同步字的配置SyncWord、Field對應負載的字節(jié)數據,注意總的負載字節(jié)數為TX和RX閾值,具體分幾個fields看個人需求。
NIRQ配置成RX data output,即NIRQ和單片機引腳相連單片機可以通過該引腳判斷是否有數據接收。低電平有效!然后即可生成代碼!
生成的代碼是基于C8051F910單片機的,我們所用的是,所以必須做好移植。
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μ&pide;ó?
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_
GPIO_InitStructure.GPIO_Pin=RF_ON_PIN;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(RF_ON_PORT,&GPIO_InitStructure);
GPIO_SetBits(RF_ON_PORT,RF_ON_PIN);
//RF_SDN
GPIO_InitStructure.GPIO_Pin=RF_SDN_PIN;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(RF_SDN_PORT,&GPIO_InitStructure);
GPIO_SetBits(RF_SDN_PORT,RF_SDN_PIN);
//RF_IRQ
GPIO_InitStructure.GPIO_Pin=RF_IRQ_PIN;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//????ê?è?
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(RF_IRQ_PORT,&GPIO_InitStructure);
}
接收信號:
u8radio_hal_NirqLevel(void)
{
returnGPIO_ReadInputDataBit(RF_IRQ_PORT,RF_IRQ_PIN);
}
voidradio_hal_AssertShutdown(void)
{
GPIO_SetBits(RF_SDN_PORT,RF_SDN_PIN);
}
voidradio_hal_DeassertShutdown(void)
{
GPIO_ResetBits(RF_SDN_PORT,RF_SDN_PIN);
}
底層配置完畢,配置bsh頭文件:
#include"stdio.h"
#include"compiler_defs.h"
//#include"platform_defs.h"
//#include"hardware_defs.h"
//#include"application_defs.h"
//#include"cdd_common.h"
#include"radio_config.h"
#include"radio.h"
//#include"sample_code_func.h"
#include"radio_hal.h"
#defineSILABS_RADIO_SI446X
#include"radio_comm.h"
#include"si446x_api_lib.h"
#include"si446x_defs.h"
//#include"si446x_nirq.h"
#include
//#include"drivers\radio\Si446x\si446x_patch.h"
把不是自己的平臺的屏蔽了!
Main接收端
接收函數:
intSI4338RecvData(void*buf,u32len){
u16i,crc16;
u8*ptr;
SEGMENT_VARIABLE(bMain_IT_Status,U8,SEG_XDATA);
ptr=(u8*)buf;
if(ptr==NULL)return-1;
bMain_IT_Status=bRadio_Check_Tx_RX();
switch(bMain_IT_Status)
{
caseSI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_SENT_PEND_BIT:{
vRadio_StartRX(pRadioConfiguration->Radio_ChannelNumber,64);
///*ClearPacketSendingflag*/
}
break;
caseSI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_RX_PEND_BIT:{
memset(ptr,0,len);
memcpy(ptr,SI4338RecvData,SI4338RecvLen);
//recvOK,youmuststartRX!
vRadio_StartRX(pRadioConfiguration->Radio_ChannelNumber,pRadioConfiguration->Radio_PacketLength);
returnSI4338RecvLen;
}
break;
default:
break;
}/*switch*/
return-1;
}
//注意:需要在U8bRadio_Check_Tx_RX(void)函數把接收的數據拷貝出來,然后再RECV函數memcpy過來就可以了。
U8bRadio_Check_Tx_RX(void){
……………………………………….
if(Si446xCmd.GET_INT_STATUS.PH_PEND&SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_RX_PEND_BIT)
{
/*PacketRX*/
/*Getpayloadlength*/
si446x_fifo_info(0x00);
si446x_read_rx_fifo(Si446xCmd.FIFO_INFO.RX_FIFO_COUNT,&rxInformation[0]);
SI4338RecvLen=Si446xCmd.FIFO_INFO.RX_FIFO_COUNT;
memcpy(SI4338RecvData,rxInformation,Si446xCmd.FIFO_INFO.RX_FIFO_COUNT);
returnSI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_RX_PEND_BIT;
}
….
}
unsignedcharbuf[64];
intrecvLen;
vRadio_StartRX(pRadioConfiguration->Radio_ChannelNumber,0u);啟動接收
while(1){
if((recvLen=SI4338RecvData(void*(buf),64))>0){
//處理接收的數據
}
}
發(fā)送端:使用這個函數發(fā)送既可以!
intSI4338SendData(void*buf,u32len){
u8*ptr;
intret=-1;
u16i;
SEGMENT_VARIABLE(bMain_IT_Status,U8,SEG_XDATA);
ptr=(u8*)buf;
if(buf==NULL)return-1;
vRadio_StartTx_Variable_Packet(pRadioConfiguration->Radio_ChannelNumber,ptr,len);
#if1
bMain_IT_Status=bRadio_Check_Tx_RX();
switch(bMain_IT_Status)
{
caseSI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_SENT_PEND_BIT:
//vRadio_StartTx_Variable_Packet(pRadioConfiguration->Radio_ChannelNumber,ptr,len);
vRadio_StartRX(pRadioConfiguration->Radio_ChannelNumber,pRadioConfiguration->Radio_PacketLength);
ret=0;
break;
caseSI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_RX_PEND_BIT:{
vRadio_StartRX(pRadioConfiguration->Radio_ChannelNumber,pRadioConfiguration->Radio_PacketLength);
returnSI4338RecvLen;
}
default:;break;
}
#endif
returnret;
}
-
寄存器
+關注
關注
31文章
5294瀏覽量
119816 -
STM32
+關注
關注
2264文章
10854瀏覽量
354298 -
Si4438
+關注
關注
0文章
14瀏覽量
34162
原文標題:STM32連接射頻si4438模塊
文章出處:【微信號:changxuemcu,微信公眾號:暢學單片機】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論