精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

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

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

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

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

1、頻率范圍:425-525MHz

2、數(shù)字接收信號強度指示(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 通道空間,某個通道回憶 base freq+ channel spacin*num 為頻率通信,當(dāng)然會有小浮動,但是浮動不會超過 Channel spacing。

計算通道號數(shù)量:

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

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

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

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

其他的不動

RF parameter

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

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

NIRQ配置成RX data output,即NIRQ和單片機(jī)引腳相連單片機(jī)可以通過該引腳判斷是否有數(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);//啟動傳輸

}

//í?ò?ê±?????üê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接收端

接收函數(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ù)拷貝出來,然后再RECV函數(shù)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){

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

}

}

發(fā)送端:使用這個函數(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)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5325

    瀏覽量

    120052
  • STM32
    +關(guān)注

    關(guān)注

    2266

    文章

    10876

    瀏覽量

    354923
  • Si4438
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    34172

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

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

收藏 人收藏

    評論

    相關(guān)推薦

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

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

    si4438,大家了解多少

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

    誰有使用Si4438的經(jīng)驗,請分享下

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

    SI4438的困擾,求大神建議

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

    SI4438為什么不可以傳輸音頻

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

    SI4438的中文參考資料

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

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

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

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

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

    SI4438無線模塊stm32位機(jī)例程資料

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

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

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

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

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

    Si4438芯片資料

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

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

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

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

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

    HW3000、SI4438SI4463、LLCC68方案比對

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