0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用STM32連接射頻SI4438模塊詳細(xì)方法說(shuō)明

2oON_changxuemc ? 來(lái)源:未知 ? 2019-07-20 12:00 ? 次閱讀

SI4438射頻模塊參數(shù):

1、頻率范圍:425-525MHz

2、數(shù)字接收信號(hào)強(qiáng)度指示(RSSI)

3、64字節(jié)收發(fā)數(shù)據(jù)寄存器(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: 頻率和功率的設(shè)置,

base freq基頻,中心頻率,

Channel spacing 通道空間,某個(gè)通道回憶 base freq+ channel spacin*num 為頻率通信,當(dāng)然會(huì)有小浮動(dòng),但是浮動(dòng)不會(huì)超過(guò) Channel spacing。

計(jì)算通道號(hào)數(shù)量:

(Base freq + channel spacin*num) >=425MHz

(Base freq + channel spacin*num) <=525MHz

所以Base freq的設(shè)置以及channel spacing的設(shè)置會(huì)影響到通道的數(shù)量。

Crystal:晶振默認(rèn)!

其他的不動(dòng)

RF parameter

這里設(shè)置的射頻參數(shù),包括調(diào)制模式、數(shù)據(jù)速率等參數(shù),RSSI threshold設(shè)置信號(hào)閾值。數(shù)據(jù)速率射頻之間的距離有關(guān)系,速度越快,對(duì)應(yīng)的距離要求越短。所以這應(yīng)該按照自己的需求來(lái)選。

Pakect數(shù)據(jù)包的設(shè)置,包括TX和RX緩沖區(qū)的長(zhǎng)度、前導(dǎo)碼的配置Preamble、同步字的配置SyncWord、Field對(duì)應(yīng)負(fù)載的字節(jié)數(shù)據(jù),注意總的負(fù)載字節(jié)數(shù)為T(mén)X和RX閾值,具體分幾個(gè)fields看個(gè)人需求。

NIRQ配置成RX data output,即NIRQ和單片機(jī)引腳相連單片機(jī)可以通過(guò)該引腳判斷是否有數(shù)據(jù)接收。低電平有效!然后即可生成代碼!

生成的代碼是基于C8051F910單片機(jī)的,我們所用的是,所以必須做好移植。

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);//啟動(dòng)傳輸

}

//í?ò?ê±?????üê1?üò???SPIéè±?,2?êyTYPE_SPI_ALL?TD§

voidSTM32SPI2_Enable(TYPE_SPItype)

{

/*

if(type==TYPE_SPI_FLASH)//這其實(shí)沒(méi)啥用

{

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);

}

接收信號(hào):

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"

把不是自己的平臺(tái)的屏蔽了!

Main接收端

接收函數(shù):

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)函數(shù)把接收的數(shù)據(jù)拷貝出來(lái),然后再RECV函數(shù)memcpy過(guò)來(lái)就可以了。

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);啟動(dòng)接收

while(1){

if((recvLen=SI4338RecvData(void*(buf),64))>0){

//處理接收的數(shù)據(jù)

}

}

發(fā)送端:使用這個(gè)函數(shù)發(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;

}

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

    關(guān)注

    31

    文章

    5403

    瀏覽量

    122933
  • STM32
    +關(guān)注

    關(guān)注

    2287

    文章

    10988

    瀏覽量

    361588
  • Si4438
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    34361

原文標(biāo)題:STM32連接射頻si4438模塊

文章出處:【微信號(hào):changxuemcu,微信公眾號(hào):暢學(xué)單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 1人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    智能電表無(wú)線(xiàn)抄表,Si4438性?xún)r(jià)比秒殺 CC1101,Si4432,Si4463

    的物料(BOM)成本。片上PA可用于補(bǔ)償?shù)统杀咎炀€(xiàn)性能,而同類(lèi)產(chǎn)品則需要更大、成本更高的片外PA以獲得同等性能。此舉使得Si4438芯片及成品模塊的價(jià)格極具優(yōu)勢(shì),性?xún)r(jià)比遠(yuǎn)超CC1100,Si
    發(fā)表于 12-27 14:37

    si4438,大家了解多少

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

    誰(shuí)有使用Si4438的經(jīng)驗(yàn),請(qǐng)分享下

    誰(shuí)有使用Si4438的經(jīng)驗(yàn),請(qǐng)分享下,謝謝!{:23:}
    發(fā)表于 05-09 09:56

    SI4438的困擾,求大神建議

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

    SI4438為什么不可以傳輸音頻

    這款模塊(或者說(shuō)芯片Si4438無(wú)線(xiàn)模塊是Silicon labs公司專(zhuān)門(mén)針對(duì)中國(guó)市場(chǎng)推出的一款無(wú)線(xiàn)收發(fā)神器。其工作頻段是425MHz到525MHz。這款芯片的技術(shù)參數(shù)如下:參數(shù)名稱(chēng) SI
    發(fā)表于 05-27 13:57

    SI4438的中文參考資料

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

    Silicon Labs設(shè)計(jì)的Si4438收發(fā)器

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

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

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

    SI4438無(wú)線(xiàn)模塊stm32位機(jī)例程資料

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

    SILICONLA無(wú)線(xiàn)射頻收發(fā)芯片SI4438-B1C-FMR 簡(jiǎn)單介紹

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

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

    Si4438中文版數(shù)據(jù)資料,Si4438是專(zhuān)為中國(guó)智能電表市場(chǎng)推出的一種無(wú)線(xiàn)射頻芯片,超低功耗,超高性能
    發(fā)表于 03-03 16:06 ?0次下載

    Si4438芯片資料

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

    lora、fsk、ook、藍(lán)牙模塊、433組網(wǎng);無(wú)線(xiàn)射頻模塊

    專(zhuān)業(yè)無(wú)線(xiàn)射頻模塊研發(fā),歡迎咨詢(xún)訂購(gòu) si4432、si4438、si4463、cc1101、笙科7139、sx1278
    發(fā)表于 03-23 14:22 ?6555次閱讀
    lora、fsk、ook、藍(lán)牙<b class='flag-5'>模塊</b>、433組網(wǎng);無(wú)線(xiàn)<b class='flag-5'>射頻</b><b class='flag-5'>模塊</b>

    基于STM32單片機(jī)連接射頻si4438模塊的方案設(shè)計(jì)

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

    HW3000、SI4438、SI4463、LLCC68方案比對(duì)

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

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品