0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何使用STM32連接射頻SI4438模塊詳細方法說明

2oON_changxuemc ? 來源:未知 ? 2019-07-20 12:00 ? 次閱讀

SI4438射頻模塊參數:

1、頻率范圍:425-525MHz

2、數字接收信號強度指示(RSSI)

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:晶振默認!

其他的不動

RF parameter

這里設置的射頻參數,包括調制模式、數據速率等參數,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;

}

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5294

    瀏覽量

    119816
  • STM32
    +關注

    關注

    2264

    文章

    10854

    瀏覽量

    354298
  • Si4438
    +關注

    關注

    0

    文章

    14

    瀏覽量

    34162

原文標題:STM32連接射頻si4438模塊

文章出處:【微信號:changxuemcu,微信公眾號:暢學單片機】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    智能電表無線抄表,Si4438性價比秒殺 CC1101,Si4432,Si4463

    的物料(BOM)成本。片上PA可用于補償低成本天線性能,而同類產品則需要更大、成本更高的片外PA以獲得同等性能。此舉使得Si4438芯片及成品模塊的價格極具優(yōu)勢,性價比遠超CC1100,Si
    發(fā)表于 12-27 14:37

    si4438,大家了解多少

    si4438,大家了解多少 ,與cc1100,1020系列的比較
    發(fā)表于 01-22 21:14

    誰有使用Si4438的經驗,請分享下

    誰有使用Si4438的經驗,請分享下,謝謝!{:23:}
    發(fā)表于 05-09 09:56

    SI4438的困擾,求大神建議

    現(xiàn)用SI4438想做一個RF無線模塊,但是感覺75ma的發(fā)射電流太大,用電池供電的話可能壽命會很短,有沒有大神有辦法降低下它的功耗,稍微犧牲一下增益也可以,看芯片資料似乎增益可調,但是要怎么調求指導啊
    發(fā)表于 06-24 10:14

    SI4438為什么不可以傳輸音頻

    這款模塊(或者說芯片Si4438無線模塊是Silicon labs公司專門針對中國市場推出的一款無線收發(fā)神器。其工作頻段是425MHz到525MHz。這款芯片的技術參數如下:參數名稱 SI
    發(fā)表于 05-27 13:57

    SI4438的中文參考資料

    SI4438的中文參考資料。。拿去不謝
    發(fā)表于 11-08 09:29

    Silicon Labs設計的Si4438收發(fā)器

    成本效益并且易于部署的無線技術。中國快速增長的智能電表市場將受益于具有卓越性能、超低休眠電流和最小BOM成本的無線連接解決方案。Silicon Labs新型Si4438 IC是滿足中國智能電網應用挑戰(zhàn)
    發(fā)表于 12-22 11:09

    SI4438與CC1101對比優(yōu)勢在哪里

    要更大、成本更高的片外PA以獲得同等性能。此舉使得Si4438芯片及成品模塊的價格極具優(yōu)勢,性價比遠超CC1100,Si4432,Si4463, 可滿足中國470-510MHz頻段智能
    發(fā)表于 11-30 15:30

    SI4438無線模塊stm32位機例程資料

    一、資料包含si4438例程二、提供技術支持三、有技術問題可以直接來電
    發(fā)表于 12-10 16:18

    SILICONLA無線射頻收發(fā)芯片SI4438-B1C-FMR 簡單介紹

    射頻技術在閱讀器和射頻卡之間進行非接觸雙向數據傳輸,以達到目標識別和數據交換的目的。今天我們就Silicon公司推出的無線射頻芯片SI4438給大家
    發(fā)表于 10-30 14:21

    Si4438-C_高性能的低電流收發(fā)器

    Si4438中文版數據資料,Si4438是專為中國智能電表市場推出的一種無線射頻芯片,超低功耗,超高性能
    發(fā)表于 03-03 16:06 ?0次下載

    Si4438芯片資料

    Si4438芯片資料
    發(fā)表于 12-29 20:49 ?51次下載

    lora、fsk、ook、藍牙模塊、433組網;無線射頻模塊

    專業(yè)無線射頻模塊研發(fā),歡迎咨詢訂購 si4432、si4438、si4463、cc1101、笙科7139、sx1278
    發(fā)表于 03-23 14:22 ?6338次閱讀
    lora、fsk、ook、藍牙<b class='flag-5'>模塊</b>、433組網;無線<b class='flag-5'>射頻</b><b class='flag-5'>模塊</b>

    基于STM32單片機連接射頻si4438模塊的方案設計

    SI4438射頻模塊參數: 1、頻率范圍:425-525MHz 2、數字接收信號強度指示(RSSI) 3、64字節(jié)收發(fā)數據寄存器(FIFO) 4、跳頻功能
    發(fā)表于 11-15 16:55 ?4406次閱讀

    HW3000、SI4438、SI4463、LLCC68方案比對

    )加上業(yè)內領先的20dBm輸出功率可以充分保證用戶通信的鏈路性能及產品低功耗要求。同時本模塊可支持硬件跳頻接收功能,可以有效的減小環(huán)境無線電對本模塊通信信號的干擾。SI4438模塊采用
    的頭像 發(fā)表于 03-18 16:35 ?1583次閱讀
    HW3000、<b class='flag-5'>SI4438</b>、<b class='flag-5'>SI</b>4463、LLCC68方案比對