⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 Si4432基于STM32的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
* File Name          : main.c
* Author             : MCD Application Team
* Version            : V2.0
* Date               : 05/23/2008
* DescriptWHY8W-QT9DJ-P0VNX-L15PE-W4DCR-VP3FMion        : Main program body
********************************************************************************
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
* FOR MORE INFORMATION PLEASE CAREFULLY READ THE LICENSE AGREEMENT FILE LOCATED 
* IN THE ROOT DIRECTORY OF THIS FIRMWARE PACKAGE.
*******************************************************************************/

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "si4432.h"


#define SI4432_CSH()  GPIO_SetBits(GPIOB, GPIO_Pin_12)			//P3OUT |= BIT0//  PB12	
#define SI4432_CSL()  GPIO_ResetBits(GPIOB, GPIO_Pin_12)		//P3OUT &= ~BIT0//  
#define SI4432_SDNH() GPIO_SetBits(GPIOB, GPIO_Pin_1)			//P3OUT |= BIT4//PB1
#define SI4432_SDNL() GPIO_ResetBits(GPIOB, GPIO_Pin_1)			//P3OUT &= ~BIT4
#define SI4432_IRQ()  GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)	//(P2IN & BIT7)  //PB0

static u8 Spi0Write(u8 byte);
void GPIO_Config(void);
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
#define code const
#define uint8 unsigned char
#define BAND_434
//#define BAND_868
//#define BAND_915

//==============================================================
// RF specific definitions
//==============================================================

#ifdef  BAND_434
   #define FW_VERSION "1.0 434MHz"
   //define the default radio frequency
   #define FREQ_BAND_SELECT 0x53							//frequency band select
   #define NOMINAL_CAR_FREQ1 0x53							//default carrier frequency
   #define NOMINAL_CAR_FREQ2 0x40

#endif

#ifdef  BAND_868
   #define FW_VERSION "1.0 868MHz"
   //define the default radio ferquency
   #define FREQ_BAND_SELECT 0x73							//frequency band select
   #define NOMINAL_CAR_FREQ1 0x2C							//default carrier frequency
   #define NOMINAL_CAR_FREQ2 0x60

#endif

#ifdef  BAND_915
   #define FW_VERSION "1.0 915MHz"
   //define the default radio ferquency
   #define FREQ_BAND_SELECT 0x75							//frequency band select
   #define NOMINAL_CAR_FREQ1 0x0A							//default carrier frequency
   #define NOMINAL_CAR_FREQ2 0x80

#endif

/*------------------------------------------------------------------------*/
/*						GLOBAL variables								  */
/*------------------------------------------------------------------------*/
const unsigned char RMRfSettings[NMBR_OF_SAMPLE_SETTING1][NMBR_OF_PARAMETER] =		
{
//revV2
//	 IFBW, COSR, CRO2, CRO1, CRO0, CTG1, CTG0, TDR1, TDR0, MMC1, FDEV, B_TIME
	{0x01, 0x83, 0xc0, 0x13, 0xa9, 0x00, 0x05, 0x13, 0xa9, 0x20, 0x3a },  		//DR: 2.4kbps, DEV: +-36kHz, BBBW: 75.2kHz
	{0x04, 0x41, 0x60, 0x27, 0x52, 0x00, 0x0a, 0x27, 0x52, 0x20, 0x48 },		//DR: 4.8kbps, DEV: +-45kHz, BBBW: 95.3kHz
	{0x91, 0x71, 0x40, 0x34, 0x6e, 0x00, 0x18, 0x4e, 0xa5, 0x20, 0x48 },		//DR: 9.6kbps, DEV: +-45kHz, BBBW: 112.8kHz
	{0x26, 0x34, 0x02, 0x75, 0x25, 0x07, 0xFF, 0x9D, 0x49, 0x20, 0x15 },		//DR: 19.2kbps, DEV: +-9.6kHz, BBBW: 28.8kHz
	{0x16, 0x34, 0x02, 0x75, 0x25, 0x07, 0xFF, 0x09, 0xD5, 0x00, 0x1F },		//DR: 38.4kbps, DEV: +-19.2kHz, BBBW: 57.6kHz  
	{0x03, 0x45, 0x01, 0xD7, 0xDC, 0x07, 0x6E, 0x0E, 0xBF, 0x00, 0x2E },		//DR: 57.6kbps, DEV: +-28.8kHz, BBBW: 86.4kHz
	{0x99, 0x34, 0x02, 0x75, 0x25, 0x07, 0xFF, 0x1D, 0x7E, 0x00, 0x5C },		//DR: 115.2kbps, DEV: +-57.6kHz, BBBW: 172.8kHz

};

const unsigned char CMRfSettings[NMBR_OF_SAMPLE_SETTING2][NMBR_OF_PARAMETER] =		
{
//revV2
//	 IFBW, COSR, CRO2, CRO1, CRO0, CTG1, CTG0, TDR1, TDR0, MMC1, FDEV, B_TIME
	 
	{0x8F, 0xE5, 0x80, 0x1A, 0x28, 0x00, 0x08, 0x4e, 0x79, 0x20, 0x90 },		//DR: 9.6kbps, DEV: +-90kHz, BBBW:184.8kHz 
	
};

        
#ifdef BAND_434
//parameters of the frequency setting
	const uint8 FreqSettings[4][7] =		
	{

	//	 2.4kbps,	4.8kbps,	9.6kbps, 	19.2kbps,	38.4kbps 	57.6kbps 	115.2kbps 
		{4,			4,			4, 			3, 			3, 			2, 			1 	  },  			//max channel number  
		{0x53,		0x53,		0x53, 		0x58, 		0x56, 		0x5A, 		0x61  },			//start freq. reg1
		{0x40,		0x40,		0x40, 		0x40, 		0xC0, 		0x40, 		0xC0  },			//start freq. reg2 
		{33,		33,			33, 		39, 		45, 		36, 		0 	  },			//freq. step   

	};
#endif
#ifdef BAND_868
	//parameters of the frequency setting
	code uint8 FreqSettings[4][7] =		
	{

	//	 2.4kbps,	4.8kbps,	9.6kbps, 	19.2kbps,	38.4kbps 	57.6kbps 	115.2kbps 
		{14,		14,			14, 		11, 		10, 		8, 			6    },  			//max channel number  
		{0x2C,		0x2C,		0x2C, 		0x2E, 		0x2D, 		0x2E, 		0x32 },				//start freq. reg1
		{0x60,		0x60,		0x60, 		0x40, 		0x40, 		0xE0, 		0x00 },				//start freq. reg2
		{45,		45,			45, 		55, 		64, 		78, 		100  },				//freq. step   

	};
#endif

#ifdef BAND_915
 	//parameters of the frequency setting
	code uint8 FreqSettings[4][7] =		
	{

	//	 2.4kbps,	4.8kbps,	9.6kbps, 	19.2kbps,	38.4kbps 	57.6kbps 	115.2kbps 
		{60,		60,			60, 		52, 		45, 		37, 		29 	 },	  			//max channel number  
		{0x0A,		0x0A,		0x0A, 		0x0A, 		0x0A, 		0x0A, 		0x0A },				//start freq. reg1 
		{0x80,		0x80,		0x80, 		0x80, 		0x80, 		0x80, 		0x80 },				//start freq. reg2 
		{48,		48,			48, 		55, 		64, 		78, 		100  },				//freq. step   

	};
#endif

unsigned char rf_ch;
unsigned char rf_pwr;
unsigned char rf_dr; 
//RF_SAMPLE_SETTINGS rf_dr;     
unsigned char mode = 0;   //普通模式
void delay_ms(unsigned int delay)
{
	unsigned int  j;
	unsigned short i;

	if( delay == 0 )
	{
		return;
	}

	for(j=0;j<delay;j++)
	{
		for(i=0;i<2000;i++);
	}
}

void  Delay(u32 nCount)
{
  for(; nCount != 0; nCount--);
}
void InitSPI2()
{
	SPI_InitTypeDef SPI_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);

	SPI_Cmd(SPI2, DISABLE);             //必须先禁能,才能改变MODE
    SPI_InitStructure.SPI_Direction =SPI_Direction_2Lines_FullDuplex;  //两线全双工
    SPI_InitStructure.SPI_Mode =SPI_Mode_Master;       //主
    SPI_InitStructure.SPI_DataSize =SPI_DataSize_8b;       //8位
    SPI_InitStructure.SPI_CPOL =SPI_CPOL_High;         //CPOL=1时钟悬空高
    SPI_InitStructure.SPI_CPHA =SPI_CPHA_2Edge;       //CPHA=1 数据捕获第2个
    SPI_InitStructure.SPI_NSS =SPI_NSS_Soft;         //软件NSS
    SPI_InitStructure.SPI_BaudRatePrescaler =SPI_BaudRatePrescaler_256; //256分频
    SPI_InitStructure.SPI_FirstBit =SPI_FirstBit_MSB;      //高位在前
    SPI_InitStructure.SPI_CRCPolynomial =7;         //CRC7
   
	SPI_Init(SPI2,&SPI_InitStructure);
	SPI_Cmd(SPI2, ENABLE);
	//spi的配置结束了可以使用了。
}

/*******************************************************************************
* Function Name  : main
* Description    : Main program.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/

//读写十六位数据
unsigned short SpiReadWriteWord(unsigned short spi_in)
{
  unsigned short temp16;
  
  SI4432_CSL();					
  temp16 = (unsigned short) (Spi0Write( (unsigned char)((spi_in & 0xFF00) >> 8) ));
  temp16 <<= 8;
  temp16 += (unsigned short) (Spi0Write( (unsigned char)(spi_in & 0x00FF) ));
  SI4432_CSH();
  
  return temp16;
}
//写入地址和数据
void SpiWriteAddressData(unsigned char addr, unsigned char data)
{
  SI4432_CSL();
  Spi0Write(addr);
  Spi0Write(data);
  SI4432_CSH();
}
static u8 Spi0Write(u8 byte)
{
	//while((SPI2->SR &SPI_I2S_FLAG_TXE)==RESET);
	while((SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE))==RESET);
	  
	//SPI2->DR = byte;
	SPI_I2S_SendData(SPI2,byte);
	
	//while((SPI2->SR &SPI_I2S_FLAG_RXNE)==RESET);
	while((SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE))==RESET);
	//return(SPI2->DR);
	return( SPI_I2S_ReceiveData(SPI2) );//读寄存器用硬件清除标志位。

	//SPI_I2S_ClearFlag(SPI2,SPI_I2S_FLAG_RXNE) ;直接软件清除标志位。
}
//SI4432初始化
RF_ENUM RfInitHw(void)
{
  //Init IO
//  P3DIR |= BIT0;          //cs  PB12
//  P3DIR |= BIT4;          //SDN PB1
//  P2DIR &= ~BIT7;         //nIRQ  PB0

  SI4432_CSH();
  SI4432_SDNL();
  InitSPI2();      
  //
  SpiReadWriteWord(InterruptStatus1 << 8);
  SpiReadWriteWord(InterruptStatus2 << 8);
  //SW reset   -> wait for POR interrupt
  SpiWriteAddressData((REG_WRITE | OperatingFunctionControl1), 0x80); 
  
  //wait for POR interrupt from the radio (while the nIRQ pin is high)
  while(SI4432_IRQ());
  //read interrupt status registers to clear the interrupt flags and release NIRQ pin
  SpiReadWriteWord(InterruptStatus1 << 8);
  SpiReadWriteWord(InterruptStatus2 << 8);
  
  //wait for chip ready interrupt from the radio (while the nIRQ pin is high)
  while (SI4432_IRQ());  
  //read interrupt status registers to clear the interrupt flags and release NIRQ pin
  SpiReadWriteWord(InterruptStatus1 << 8);
  SpiReadWriteWord(InterruptStatus2 << 8);	
  
  //disable all ITs, except 'ichiprdy'
  SpiWriteAddressData((REG_WRITE | InterruptEnable1), 0x00);
  SpiWriteAddressData((REG_WRITE | InterruptEnable2), 0x02);
  
  SpiReadWriteWord(InterruptStatus1 << 8);
  SpiReadWriteWord(InterruptStatus2 << 8);

  //set VCO
  SpiWriteAddressData((REG_WRITE | VCOCurrentTrimming), 0x7F); 
  SpiWriteAddressData((REG_WRITE | DividerCurrentTrimming), 0xC0); 	
  
  
   
  //reset digital testbus, disable scan test
  SpiWriteAddressData((REG_WRITE | DigitalTestBus), 0x00);      
  //select nothing to the Analog Testbus
  SpiWriteAddressData((REG_WRITE | AnalogTestBus), 0x0B);
   	   
  //set frequency
  SpiWriteAddressData((REG_WRITE | FrequencyBandSelect), FREQ_BAND_SELECT);                  
  SpiWriteAddressData((REG_WRITE | NominalCarrierFrequency1), NOMINAL_CAR_FREQ1);
  SpiWriteAddressData((REG_WRITE | NominalCarrierFrequency0), NOMINAL_CAR_FREQ2);  
	
  //set  cap. bank rev. V2 
  SpiWriteAddressData((REG_WRITE | CrystalOscillatorLoadCapacitance), 0xD7);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -