SI4438射频模块参数:

1、频率范围:425-525 MHz

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 <stdio.h>
#include "stm32f10x_spi.h"
#include " STM32SPI2.h"u8 STM32SPI2_ReadWriteByte(u8 TxData)
{       u8 retry=0;                 while((SPI2->SR&1<<1) == 0) {retry++;if(retry>250)return 0;}             SPI2->DR=TxData; retry=0;while((SPI2->SR&1<<0) == 0)//  {retry++;if(retry>250)return 0;}                             return SPI2->DR;
}//APB2=72M/8=9M
void STM32SPI2_Config(void)
{           SPI_InitTypeDef  SPI_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );/* Configure SPI2 pins: SCK, MISO and MOSI */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);/* Configure NSEL pins */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);/* SPI2 configuration */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);/* Enable SPI2  */SPI_Cmd(SPI2, ENABLE);STM32SPI2_ReadWriteByte(0xff);//启动传输 }  //ͬһʱ¼äÖ»ÄÜʹÄÜÒ»¸öSPIÉ豸,²ÎÊýTYPE_SPI_ALLÎÞЧ
void STM32SPI2_Enable(TYPE_SPI type)
{
/*if(type == TYPE_SPI_FLASH) //这其实没啥用{GPIO_SetBits(GPIOA,GPIO_Pin_4);//ʧÄÜRFGPIO_ResetBits(GPIOC,GPIO_Pin_4);//ʹÄÜFLASH}  else{
*/
//    GPIO_SetBits(GPIOC,GPIO_Pin_4);//ʧÄÜFLASHGPIO_ResetBits(GPIOB,GPIO_Pin_12);//
/*}
*/
}
void STM32SPI2_Disable(TYPE_SPI type)
{if(type == TYPE_SPI_FLASH){GPIO_SetBits(GPIOC,GPIO_Pin_4);//ʧÄÜFLASH   }  else if(type == TYPE_SPI_RF){GPIO_SetBits(GPIOB,GPIO_Pin_12);//ʧÄÜRF}else{GPIO_SetBits(GPIOC,GPIO_Pin_4);//ʧÄÜFLASHGPIO_SetBits(GPIOA,GPIO_Pin_4);//ʧÄÜRF}
}
radio.c  radio hal层 spi接口修改处
void radio_hal_SpiWriteByte(u8 byteToWrite)
{STM32SPI2_ReadWriteByte(byteToWrite);
}u8 radio_hal_SpiReadByte(void)
{return STM32SPI2_ReadWriteByte(0xFF);
}void radio_hal_SpiWriteData(u8 byteCount, u8* pData)
{while(byteCount--){STM32SPI2_ReadWriteByte(*pData++);}
}void radio_hal_SpiReadData(u8 byteCount, u8* pData)
{while(byteCount--){*pData++ = STM32SPI2_ReadWriteByte(0xFF);}
}
Radio_Config:配置SDN power IRQ引脚
void Radio_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;//ºÍFLASH¹²ÓÃÒ»¸öSPI,SPIÒѾ­ÔÚFLASHµÄ³õʼ»¯Öе÷Óà  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);//RF_POWERGPIO_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_ONGPIO_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_SDNGPIO_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_IRQGPIO_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);
}
接收信号:
u8 radio_hal_NirqLevel(void)
{return GPIO_ReadInputDataBit(RF_IRQ_PORT, RF_IRQ_PIN);
}void radio_hal_AssertShutdown(void)
{GPIO_SetBits(RF_SDN_PORT, RF_SDN_PIN);
}void radio_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"#define SILABS_RADIO_SI446X
#include "radio_comm.h"#include "si446x_api_lib.h"
#include "si446x_defs.h"
//#include "si446x_nirq.h"
#include <string.h>
//#include "drivers\radio\Si446x\si446x_patch.h"

把不是自己的平台的屏蔽了!

Main接收端

接收函数:

int SI4338RecvData(void* buf,u32 len){u16 i,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){case SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_SENT_PEND_BIT:{vRadio_StartRX(pRadioConfiguration->Radio_ChannelNumber, 64);///* Clear Packet Sending flag */}break;case SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_RX_PEND_BIT:{memset(ptr,0,len);memcpy(ptr,SI4338RecvData,SI4338RecvLen);//recv OK ,you must start RX!vRadio_StartRX(pRadioConfiguration->Radio_ChannelNumber,pRadioConfiguration->Radio_PacketLength);return SI4338RecvLen;}break;default:break;} /* switch */return -1;
}
//注意:需要在U8 bRadio_Check_Tx_RX(void)函数把接收的数据拷贝出来,然后再RECV函数memcpy过来就可以了。
U8 bRadio_Check_Tx_RX(void){
……………………………………….if(Si446xCmd.GET_INT_STATUS.PH_PEND & SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_RX_PEND_BIT){/* Packet RX *//* Get payload length */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);return SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_RX_PEND_BIT;}….
}
unsigned char buf[64];
int recvLen;
vRadio_StartRX(pRadioConfiguration->Radio_ChannelNumber,0u); 启动接收
while(1){
if((recvLen  = SI4338RecvData(void*( buf),64)) >0){//处理接收的数据
}
}
发送端:使用这个函数发送既可以!
int SI4338SendData(void* buf,u32 len){u8* ptr;int ret = -1;u16 i;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);#if 1bMain_IT_Status = bRadio_Check_Tx_RX();switch (bMain_IT_Status){case SI446X_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;case SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_RX_PEND_BIT:{vRadio_StartRX(pRadioConfiguration->Radio_ChannelNumber, pRadioConfiguration->Radio_PacketLength);return SI4338RecvLen;}default: ;break;}
#endifreturn ret;
}

STM32连接射频si4438模块相关推荐

  1. 基础篇010.2 STM32驱动RC522 RFID模块之二:STM32硬件SPI驱动RC522

    目录 1. 实验硬件及原理图 1.1 RFID硬件 1.2 硬件原理图 2. 单片机与RFID硬件模块分析 3. 利用STM32CubeMX创建MDK工程 3.1 STM32CubeMX工程创建 3. ...

  2. STM32单片机通过ESP8266WiFi模块与Android APP实现数据传输(二)---上位机搭建

    事物的难度远远低于对事物的恐惧 完成对STM32单片机和ESP8266 WiFi模块的配置之后,接下来需要完成Android APP代码的编写以及实现. 1.添加网络权限 因为我们需要对WiFi进行操 ...

  3. STM32控制HC-05蓝牙模块进行通信

    一.HC-05蓝牙模块 1. 简介 HC-05主从一体蓝牙串口模块采用英国CSR公司BlueCore4系列的芯片,符合符合蓝牙2.0+EDR规范,可以同带同种蓝牙功能的电脑.蓝牙主机和手机等智能终端配 ...

  4. STM32单片机与蓝牙模块HC-05通信数据帧处理

    本章将会详细讲述蓝牙模块(HC-05)和STM32单片机之间的通信收发的数据如何处理,在测试开始前首先在手机上下载好一个蓝牙调试APP,此APP可以是手机端和PC端口的,以我常用的手机端的为例. 在配 ...

  5. 动手实操丨RC522射频卡模块与IC卡完成充值消费查询的技术实现思路

    本文分享自华为云社区<RC522射频卡模块与IC卡完成充值消费查询的技术实现思路>,作者:DS小龙哥. 一.IC卡介绍 常用的IC卡一般是M1卡,也称为S50卡,购买RC522刷卡模块送的 ...

  6. RC522 射频读卡器模块(MINI型)

    一.硬件: 二.[主芯片介绍] MF RC522是应用于13.56MHz非接触式通信中高集成度的读写卡芯片,是NXP公司针对"三表"应用推出的一款低电压.低成本.体积小的非接触式读 ...

  7. STM32驱动W5100S网口模块实现UDP通讯

    本文博客链接:https://blog.csdn.net/zsj2016o/article/details/88883863 作者:zsj ,转载请注明. STM32驱动W5100S网口模块实现UDP ...

  8. STM32对接涂鸦wifi模块项目记录(智能插座完善版本)

    应项目需求,客户需要对接涂鸦平台,从了解平台到样品实际落地,还是挺方便的, 做过的一个项目,人体感应智能插座项目,对接涂鸦云 : 硬件平台:STM32F103 WIFI模块: 涂鸦WiFi(型号见文章 ...

  9. 【STM32】ESP8266 WiFi模块实时上报温湿度及控制LED灯项目笔记

    ESP8266 WiFi模块实时上报温湿度及控制LED灯项目笔记 一.ESP8266模块 1.模块介绍 2.AT指令介绍 2.硬件连接 二.串口转发及调试 1.串口转发流程 2.串口转发程序实现 ST ...

  10. STM32用超声波测距模块实现测距

    STM32用超声波测距模块实现测距 通过超声波测距模块可以实现超声波反射型距离测试.市面上的超声波测距模块主要有两种.一种是分体式模块(HC-SR04等),由超生波发射头和接收头组成,一种是一体式模块 ...

最新文章

  1. SpringBoot培训教程--史前文明之Spring简介
  2. 用java的stream流库在实际项目的使用案例
  3. leetcode面试题 08.04. 幂集(递归)
  4. Apache ActiveMQ 各个版本所依赖的JDK版本
  5. 6.2阻碍循环(Cyclic Barriers)
  6. 动态规划之详细分析0-1背包问题
  7. 解决报错:错误使用 xlsread未找到工作表 ‘sheet1‘
  8. php微信卡券创建、生成二维码等
  9. Tangent Space的基向量计算方法
  10. 华为高薪吸纳“天才” !任正非:进来华为,就没有“天才少年”这个名词了
  11. openlayers3中,在地图上添加静态边界线
  12. 51单片机 仿真器驱动安装失败
  13. 武林外传之勇夺金掌柜 【安卓游戏】
  14. 【DL】血与泪的炼丹心得
  15. 北洋雷达UST-10LX基于ROS都安装使用测试小问题
  16. 深圳软件测试培训:Pytest+Appium+Allure 做 UI 自动化的那些事
  17. QQ好友自定义头像不更新的解决办法(转)
  18. python随机生成小写字母_python生成n个随机(大小写)字母
  19. 火灾检测——相关数据集
  20. Redis之Centos6安装使用及Windows客户端工具(绿色免安装版)下载

热门文章

  1. MAC苹果电脑装单win10系统
  2. Google Earth Engine(GEE)——点、线、面和省级行政区的加载和展示,以及矢量的过滤筛选
  3. 【Chapter 1】什么是软件架构
  4. 《C专家编程》:编译器的金科玉律(一)
  5. OpenLayers教程十五:多源数据加载之矢量地图
  6. AI嘻哈写歌词软件总结
  7. C#读取CAD文件DXF
  8. 一天入门Tableau详细教程(上)
  9. pysnmp snmpwalk
  10. gulp-livereload组件使用