STM32连接射频si4438模块

发布者:Changsheng520最新更新时间:2017-07-13 来源: eefocus关键字:STM32  连接射频  si4438模块 手机看文章 扫描二维码
随时随地手机看文章

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配置文件:


  1. #include   

  2. #include "stm32f10x_spi.h"  

  3. #include " STM32SPI2.h"  

  4.   

  5. u8 STM32SPI2_ReadWriteByte(u8 TxData)  

  6. {         

  7.     u8 retry=0;                

  8.     while((SPI2->SR&1<<1) == 0)    {  

  9.         retry++;  

  10.         if(retry>250)  

  11.       return 0;  

  12.     }               

  13.     SPI2->DR=TxData;   

  14.     

  15.     retry=0;  

  16.     while((SPI2->SR&1<<0) == 0)//    

  17.     {  

  18.         retry++;  

  19.         if(retry>250)  

  20.       return 0;  

  21.     }                                 

  22.     return SPI2->DR;  

  23. }  

  24.   

  25.   

  26. //APB2=72M/8=9M  

  27. void STM32SPI2_Config(void)  

  28. {             

  29.      SPI_InitTypeDef  SPI_InitStructure;  

  30.     GPIO_InitTypeDef GPIO_InitStructure;  

  31.   

  32.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );  

  33.   

  34.     /* Configure SPI2 pins: SCK, MISO and MOSI */  

  35.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;  

  36.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  

  37.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;  

  38.     GPIO_Init(GPIOB, &GPIO_InitStructure);  

  39.   

  40.     /* Configure NSEL pins */  

  41.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;  

  42.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  

  43.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;  

  44.     GPIO_Init(GPIOB, &GPIO_InitStructure);  

  45.     GPIO_SetBits(GPIOB, GPIO_Pin_12);  

  46.   

  47.     /* SPI2 configuration */  

  48.     SPI_I2S_DeInit(SPI2);  

  49.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);  

  50.     SPI_Cmd(SPI2, DISABLE);  

  51.   

  52.     SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  

  53.     SPI_InitStructure.SPI_Mode = SPI_Mode_Master;  

  54.     SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;  

  55.     SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;  

  56.     SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;  

  57.     SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;  

  58.     SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;//SPI_BaudRatePrescaler_64;  

  59.     SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;  

  60.     SPI_InitStructure.SPI_CRCPolynomial = 7;  

  61.     SPI_Init(SPI2, &SPI_InitStructure);  

  62.   

  63.     /* Enable SPI2  */  

  64.     SPI_Cmd(SPI2, ENABLE);  

  65.     STM32SPI2_ReadWriteByte(0xff);//启动传输      

  66.           

  67. }    

  68.   

  69. //ͬһʱ¼äÖ»ÄÜʹÄÜÒ»¸öSPIÉ豸,²ÎÊýTYPE_SPI_ALLÎÞЧ  

  70. void STM32SPI2_Enable(TYPE_SPI type)  

  71. {  

  72. /* 

  73.   if(type == TYPE_SPI_FLASH) //这其实没啥用 

  74.   { 

  75.     GPIO_SetBits(GPIOA,GPIO_Pin_4);//ʧÄÜRF 

  76.     GPIO_ResetBits(GPIOC,GPIO_Pin_4);//ʹÄÜFLASH 

  77.   }   

  78.   else 

  79.   { 

  80. */  

  81. //    GPIO_SetBits(GPIOC,GPIO_Pin_4);//ʧÄÜFLASH  

  82.    GPIO_ResetBits(GPIOB,GPIO_Pin_12);//   

  83. /* 

  84.   } 

  85. */  

  86. }  


  1. void STM32SPI2_Disable(TYPE_SPI type)  

  2. {  

  3.   if(type == TYPE_SPI_FLASH)  

  4.   {  

  5.     GPIO_SetBits(GPIOC,GPIO_Pin_4);//ʧÄÜFLASH     

  6.   }    

  7.   else if(type == TYPE_SPI_RF)  

  8.   {  

  9.     GPIO_SetBits(GPIOB,GPIO_Pin_12);//ʧÄÜRF  

  10.   }  

  11.   else  

  12.   {  

  13.     GPIO_SetBits(GPIOC,GPIO_Pin_4);//ʧÄÜFLASH  

  14.     GPIO_SetBits(GPIOA,GPIO_Pin_4);//ʧÄÜRF  

  15.   }  

  16. }  

  17. radio.c  radio hal层 spi接口修改处  

  18. void radio_hal_SpiWriteByte(u8 byteToWrite)  

  19. {  

  20.   STM32SPI2_ReadWriteByte(byteToWrite);  

  21. }  

  22.   

  23. u8 radio_hal_SpiReadByte(void)  

  24. {  

  25.   return STM32SPI2_ReadWriteByte(0xFF);  

  26. }  

  27.   

  28. void radio_hal_SpiWriteData(u8 byteCount, u8* pData)  

  29. {  

  30.   while(byteCount--)  

  31.   {  

  32.     STM32SPI2_ReadWriteByte(*pData++);  

  33.   }  

  34. }  

  35.   

  36. void radio_hal_SpiReadData(u8 byteCount, u8* pData)  

  37. {  

  38.   while(byteCount--)  

  39.   {  

  40.     *pData++ = STM32SPI2_ReadWriteByte(0xFF);  

  41.   }  

  42. }  

  43. Radio_Config:配置SDN power IRQ引脚  

  44. void Radio_Config(void)  

  45. {  

  46.   GPIO_InitTypeDef GPIO_InitStructure;  

  47.     

  48.   //ºÍFLASH¹²ÓÃÒ»¸öSPI,SPIÒѾ­ÔÚFLASHµÄ³õʼ»¯Öе÷Óà   

  49.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);  

  50.     

  51.   //RF_POWER  

  52.   GPIO_InitStructure.GPIO_Pin = RF_POWER_PIN;  

  53.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  

  54.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  

  55.   GPIO_Init(RF_POWER_PORT, &GPIO_InitStructure);  

  56.   GPIO_SetBits(RF_POWER_PORT, RF_POWER_PIN);  

  57.       

  58.     //RF_ON  

  59.   GPIO_InitStructure.GPIO_Pin = RF_ON_PIN;  

  60.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  

  61.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  

  62.   GPIO_Init(RF_ON_PORT, &GPIO_InitStructure);  

  63.   GPIO_SetBits(RF_ON_PORT, RF_ON_PIN);  

  64.     

  65.   //RF_SDN  

  66.   GPIO_InitStructure.GPIO_Pin = RF_SDN_PIN;  

  67.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  

  68.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  

  69.   GPIO_Init(RF_SDN_PORT, &GPIO_InitStructure);  

  70.   GPIO_SetBits(RF_SDN_PORT, RF_SDN_PIN);  

  71.   

  72.   //RF_IRQ  

  73.   GPIO_InitStructure.GPIO_Pin = RF_IRQ_PIN;  

  74.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿ÕÊäÈë  

  75.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  

  76.   GPIO_Init(RF_IRQ_PORT, &GPIO_InitStructure);  

  77. }     

  78. 接收信号:  

  79. u8 radio_hal_NirqLevel(void)  

  80. {  

  81.   return GPIO_ReadInputDataBit(RF_IRQ_PORT, RF_IRQ_PIN);  

  82. }  

  83.   

  84. void radio_hal_AssertShutdown(void)  

  85. {  

  86.   GPIO_SetBits(RF_SDN_PORT, RF_SDN_PIN);  

  87. }  

  88.   

  89. void radio_hal_DeassertShutdown(void)  

  90. {  

  91.   GPIO_ResetBits(RF_SDN_PORT, RF_SDN_PIN);  

  92. }  




底层配置完毕,配置bsh头文件:


  1. #include "stdio.h"  

  2. #include "compiler_defs.h"  

  3. //#include "platform_defs.h"  

  4. //#include "hardware_defs.h"  

  5.   

  6. //#include "application_defs.h"  

  7.   

  8. //#include "cdd_common.h"  

  9. #include "radio_config.h"  

  10. #include "radio.h"  

  11. //#include "sample_code_func.h"  

  12.   

  13.   

  14. #include "radio_hal.h"  

  15.   

  16. #define SILABS_RADIO_SI446X  

  17. #include "radio_comm.h"  

  18.   

  19.   

  20. #include "si446x_api_lib.h"  

  21. #include "si446x_defs.h"  

  22. //#include "si446x_nirq.h"  

  23. #include   

  24. //#include "drivers\radio\Si446x\si446x_patch.h"  


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

 

Main接收端

接收函数:


  1. int SI4338RecvData(void* buf,u32 len){  

  2.     u16 i,crc16;  

  3.     u8* ptr;  

  4.       

  5.     SEGMENT_VARIABLE(bMain_IT_Status, U8, SEG_XDATA);  

  6.   

  7.     ptr = (u8*)buf;  

  8.     if(ptr == NULL) return -1;  

  9.   

  10.     bMain_IT_Status = bRadio_Check_Tx_RX();  

  11.           

  12.     switch (bMain_IT_Status)  

  13.     {  

  14.         case SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_SENT_PEND_BIT:{  

  15.             vRadio_StartRX(pRadioConfiguration->Radio_ChannelNumber, 64);  

  16.             ///* Clear Packet Sending flag */  

  17.         }  

  18.         break;  

  19.   

  20.         case SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_RX_PEND_BIT:{  

  21.             memset(ptr,0,len);  

  22.             memcpy(ptr,SI4338RecvData,SI4338RecvLen);  

  23.             //recv OK ,you must start RX!  

  24.             vRadio_StartRX(pRadioConfiguration->Radio_ChannelNumber,pRadioConfiguration->Radio_PacketLength);  

  25.             return SI4338RecvLen;  

  26.         }  

  27.         break;  

  28.   

  29.         default:  

  30.         break;  

  31.     } /* switch */  

  32.     return -1;  

  33. }  

  34. //注意:需要在U8 bRadio_Check_Tx_RX(void)函数把接收的数据拷贝出来,然后再RECV函数memcpy过来就可以了。  

  35. U8 bRadio_Check_Tx_RX(void){  

  36. ……………………………………….  

  37.       if(Si446xCmd.GET_INT_STATUS.PH_PEND & SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_RX_PEND_BIT)  

  38.       {  

  39.         /* Packet RX */  

  40.   

  41.         /* Get payload length */  

  42.         si446x_fifo_info(0x00);  

  43.   

  44.         si446x_read_rx_fifo(Si446xCmd.FIFO_INFO.RX_FIFO_COUNT, &rxInformation[0]);  

  45.                 SI4338RecvLen =Si446xCmd.FIFO_INFO.RX_FIFO_COUNT;  

  46.                 memcpy(SI4338RecvData,rxInformation,Si446xCmd.FIFO_INFO.RX_FIFO_COUNT);  

  47.         return SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_RX_PEND_BIT;  

  48.       }  

  49.       ….  

  50. }  

  51. unsigned char buf[64];  

  52. int recvLen;  

  53. vRadio_StartRX(pRadioConfiguration->Radio_ChannelNumber,0u); 启动接收  

  54. while(1){  

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

  56.     //处理接收的数据  

  57. }  

  58. }  


  1. 发送端:使用这个函数发送既可以!  

  2. int SI4338SendData(void* buf,u32 len){  

  3.     u8* ptr;  

  4.     int ret = -1;  

  5.     u16 i;  

  6.   

  7.     SEGMENT_VARIABLE(bMain_IT_Status, U8, SEG_XDATA);  

  8.   

  9.     ptr = (u8*)buf;  

  10.       

  11.     if(buf == NULL) return -1;  

  12.   

  13.     vRadio_StartTx_Variable_Packet(pRadioConfiguration->Radio_ChannelNumber,ptr, len);  

  14.     #if 1  

  15.     bMain_IT_Status = bRadio_Check_Tx_RX();  

  16.   

  17.     switch (bMain_IT_Status)  

  18.     {  

  19.         case SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_SENT_PEND_BIT:  

  20.             //vRadio_StartTx_Variable_Packet(pRadioConfiguration->Radio_ChannelNumber,ptr, len);  

  21.             vRadio_StartRX(pRadioConfiguration->Radio_ChannelNumber, pRadioConfiguration->Radio_PacketLength);  

  22.             ret = 0;  

  23.         break;  

  24.         case SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_RX_PEND_BIT:{  

  25.   

  26.             vRadio_StartRX(pRadioConfiguration->Radio_ChannelNumber, pRadioConfiguration->Radio_PacketLength);  

  27.             return SI4338RecvLen;  

  28.         }  

  29.         default: ;break;  

  30.     }  

  31. #endif  

  32.     return ret;  

  33. }  


关键字:STM32  连接射频  si4438模块 引用地址:STM32连接射频si4438模块

上一篇:AT24C128 EEPROM的读写
下一篇:STM32F205双USB开发做device

推荐阅读最新更新时间:2024-03-16 15:35

解决STM32 I2C接口死锁在BUSY状态的方法讨论
关于STM32的I2C接口死锁在BUSY状态无法恢复的现象,网上已有很多讨论,看早几年比较老的贴子,有人提到复位MCU也无法恢复、只有断电才行的状况,那可是相当严重的问题。类似复位也无法恢复的情况是存在的,技术支持矢口否认问题存在,并不是正确面对问题的态度。比如我用这款F439芯片的SDRAM控制器,在错误操作后进入HardFault状态,复位无法恢复,JTAG也无法联机,只能断电重来,官方的Erratasheet里也提到了。 如果I2C接口无法可靠工作,那么所做的设计将存在严重隐患,不可能要求用户用断电的方法恢复系统。如果像某些网友提到弃用硬件I2C,转为GPIO模拟I2C时序,那么首先I2C时钟频率不易确定,因为STM32的时
[单片机]
解决<font color='red'>STM32</font> I2C接口死锁在BUSY状态的方法讨论
基于STM32的OV7670摄像头总结
一、OV7670模块: 介绍一下OV7670传感器:CMOS器件;标准的SCCB接口,兼容IIC接口;内置感光阵列,时序发生器,AD转换器,模拟信号处理,数字信号处理器..... 大致工作过程:光照射到感光阵列产生相应电荷,传输到相应的模拟信号处理单元,再由AD转换为数字信号,在经由数字信号处理器插值到RGB信号,最后传输到屏幕上...... 先了解一下基础知识:现在市面上的OV7670模块分两种:1、带FIFO芯片;2、不带FIFO芯片。当然带FIFO的要贵一点~下面介绍带FIFO和不带FIFO的工作原理: 图1:不带FIFO 图2:带FIFO 下面就讲解这两种方式的适用范围: 不带FIFO:这种方法最
[单片机]
基于<font color='red'>STM32</font>的OV7670摄像头总结
STM32(六)外部中断-EXTI
一、外部中断叙述 1、STM32的每个IO都可以作为外部中断输入。 2、STM32的中断控制器支持19个外部中断/事件请求: 线0~15:对应外部IO口的输入中断。 线16:连接到PVD输出。 线17:连接到RTC闹钟事件。 线18:连接到USB唤醒事件。 3、每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用的状态位。 从上面可以看出,STM32供IO使用的中断线只有16个,但是STM32F10x系列的IO口多达上百个,STM32F103ZET6(112), STM32F103RCT6(51),那么中断线怎么跟io口对应呢? GPIOx.0映射到EXTI0 GPIOx.1映
[单片机]
<font color='red'>STM32</font>(六)外部中断-EXTI
STM32系列的处理器介绍
应用背景 如果你正为项目的处理器而进行艰难的选择:一方面抱怨16位单片机有限的指令和性能,另一方面又抱怨32位处理器的高成本和高功耗,那么,基于ARM Cortex-M3内核的STM32系列处理器也许能帮你解决这个问题。使你不必在性能、成本、功耗等因素之间做出取舍和折衷。 即使你还没有看完STM32的产品手册,但对于这样一款融合ARM和ST技术的 新生儿 相信你和我一样不会担心这款针对16位MCU应用领域的32位处理器的性能,但是从工程的角度来讲,除了芯片本身的性能和成本之外,你或许还会考虑到开发工具的成本和广泛度;存储器的种类、规模、性能和容量;以及各种软件获得的难易,我相信你看完本专题会得到一个满意的答案。 对于在16位MCU领
[单片机]
FPGA配置芯片EPCS读写操作--STM32读写
注意事项: (1)首先STM32需要设置nCE和nConfig信号,即nCE置高,nConfig拉低,获得EPCS的控制权,而后对EPCS操作,操作完成后需要释放这两个管脚,即nCE拉低,nConfig置高。 (2)EPCS的极性为:sck为空闲状态为高电平,采样边沿为SCK的第二个跳变沿,(即上升沿,注意前提是SCK空闲为高) SPI_InitStruct.SPI_Direction= SPI_Direction_2Lines_FullDuplex; SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b; SPI_InitStruct.SPI_Mode = SPI_Mode_M
[单片机]
使用STM32的TIMER进行外部计数
使用ETR引脚的输入信号作为计数时钟,本例程使用Timer 2,其ETR输入引脚为PA1,该引脚工作模式为输 入模式,Timer的工作模式为从模式;另外使用PC6输出一模拟方波时钟信号。 测试时将PC6与PA1短接。(用户也可另外连接一个时钟信号到PA1引脚上。) 代码见下: int main(void) { unsigned char i_Loop; unsigned char n_Counter; #ifdef DEBUG debug(); #endif RCC_Configuration(); // System Clocks Configuration NVIC_Configurati
[单片机]
STM32单片机汇编资料学习(1)
1.Cortex-M3内核架构 2.Cortex-M3指令系统的开发 总结:Cortex‐M3 只使用 Thumb‐2 指令集。这是个了不起的突破,因为它允许 32 位指令和 16 位指令 水乳交融,代码密度与处理性能两手抓,两手都硬。而且虽然它很强大,却依然易于使用 3.Cortex-M3简介 4.Cortex-M3寄存器组 1.寄存器特性 2.特殊功能寄存器特性 3.具体学习 CM3 拥有通用寄存器 R0‐R15 以及一些特殊功能寄存器。 R0‐R12 是最“通用目的” 的, 但是绝大多数的 16 位指令只能使用 R0‐R7(低组寄存器),而 32 位的 Thumb‐2
[单片机]
<font color='red'>STM32</font>单片机汇编资料学习(1)
SPI接口说明及原理
1简介 SPI:Serial Peripheral Interface,是串行外设接口。 SPI是由摩托罗拉于 1985 年前后开发,是一种适用于短距离、设备到设备通信的同步串行接口。 从那时起,这种接口就已成为许多半导体制造商,特别是微控制器(MCU)和微处理器(MPU)采用的事实标准。 2SPI接口 SPI总线是一种4线总线,通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以。 MOSI:Master Output Slave Input,主设备数据输出,从设备数据输入; MISO:Master Input Slave Output,主设备数据输入,从设备数据输出; SCLK:Serial Clock,时
[单片机]
SPI接口说明及原理
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved