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

📄 main.c

📁 Si4432基于STM32的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
        
  //disable RX-TX headers, 
  SpiWriteAddressData((REG_WRITE | HeaderControl1), 0x00 );            
  SpiWriteAddressData((REG_WRITE | HeaderControl2), 0x02 );    
  SpiWriteAddressData((REG_WRITE | SyncWord3), 0x2D);
  SpiWriteAddressData((REG_WRITE | SyncWord2), 0xD4);
  
  //set GPIO0 to GND
  SpiWriteAddressData((REG_WRITE | GPIO2Configuration), 0x14);  //接收数据
  //set GPIO1 & GPIO2 to control the TRX switch
  SpiWriteAddressData((REG_WRITE | GPIO0Configuration), 0x15);  //接收状态
  SpiWriteAddressData((REG_WRITE | GPIO1Configuration), 0x12);  //发送状态
  
  
  rf_pwr = 0x1F;							//default output power	
  
  rf_ch = 0;							//default frequency channel
  set_frq(rf_ch);
  set_pwr(rf_pwr);
  if (mode == 0)
  {	
    rf_dr = 2;							//default datarate 9.6 kbps
    RFSetRfParameters((RF_SAMPLE_SETTINGS)rf_dr);				
  }
  else 
  {
    rf_dr = 0;							//default datarate 9.6 kbps
    RFSetRfParameters((RF_SAMPLE_SETTINGS)rf_dr);	
  } 
  
  return RF_OK;
}

//发送数据
RF_ENUM RFTransmit(uint8 * packet, uint8 length)
{
  uint8 temp8;
  
  //set packet content
  SpiWriteAddressData((REG_WRITE | TransmitPacketLength), length);					
  for(temp8=0;temp8<length;temp8++)
  {
    SpiWriteAddressData((REG_WRITE | FIFOAccess),packet[temp8]);		
  }
  //enable transmitter
  SpiWriteAddressData((REG_WRITE | OperatingFunctionControl1), 0x09);
  
  //enable the wanted ITs
  SpiWriteAddressData((REG_WRITE | InterruptEnable1), 0x04);
  SpiWriteAddressData((REG_WRITE | InterruptEnable2), 0x00);
  
  SpiReadWriteWord(InterruptStatus1 << 8);
  SpiReadWriteWord(InterruptStatus2 << 8);
   
  while(SI4432_IRQ());
  
  return RF_OK;
}

//接收数据
RF_ENUM RFReceive(void)
{
  //enable receiver chain
  SpiWriteAddressData((REG_WRITE | OperatingFunctionControl1), 0x05);
  //enable the wanted ITs
  SpiWriteAddressData((REG_WRITE | InterruptEnable1), 0x03); 
  SpiWriteAddressData((REG_WRITE | InterruptEnable2), 0x00); 
  
  SpiReadWriteWord(InterruptStatus1 << 8);
  SpiReadWriteWord(InterruptStatus2 << 8);
  
  return RF_OK;
}

RF_ENUM RFIdle(void)
{
	SpiWriteAddressData((REG_WRITE | OperatingFunctionControl1), 0x01);

	//diasble all ITs
	SpiWriteAddressData((REG_WRITE | InterruptEnable1), 0x00);
	SpiWriteAddressData((REG_WRITE | InterruptEnable2), 0x00);

	SpiReadWriteWord(InterruptStatus1 << 8);
	SpiReadWriteWord(InterruptStatus2 << 8);


	return RF_OK;
}

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  +
  + FUNCTION NAME:  RF_ENUM RFPacketReceived(uint8 * packet, uint8 * length)
  +
  + DESCRIPTION:    check wheter the packet received or not.
  +
  + INPUT:			pointers for storing data and length
  +
  + RETURN:         RF_PACKET_RECEIVED:		packet received
  +					RF_NO_PACKET:			packet is not yet received
  +
  + NOTES:          
  +
  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
RF_ENUM RFPacketReceived(uint8 * packet, uint8 * length)
{
	uint8 i;

	if(SI4432_IRQ() == 0)
	{
		
		i = (uint8)(0x00FF & SpiReadWriteWord(InterruptStatus1 << 8));
		if( (i & 0x01) == 0x01 )
		{//CRC error
			//disable receiver 
			SpiWriteAddressData((REG_WRITE | OperatingFunctionControl1), 0x01);
			return RF_CRC_ERROR;
		}
		if( (i & 0x02) == 0x02 )
		{//packet received
			//read buffer
			*length =  (uint8)(0x00FF & SpiReadWriteWord(ReceivedPacketLength << 8)) ;
			for(i=0;i<*length;i++)
			{
				*packet++ = (uint8)(0x00FF & SpiReadWriteWord(FIFOAccess << 8));
			}
			//disable receiver 
			SpiWriteAddressData((REG_WRITE | OperatingFunctionControl1), 0x01);
			return RF_PACKET_RECEIVED;
		}
	}
	
	return RF_NO_PACKET;
}

RF_ENUM RFSetRfParameters(RF_SAMPLE_SETTINGS setting)
{
		
	if (mode == 0)
	{	
		//set the registers according the selected RF settings in the range mode
		SpiWriteAddressData((REG_WRITE | IFFilterBandwidth), 				RMRfSettings[setting][0] );
		SpiWriteAddressData((REG_WRITE | ClockRecoveryOversamplingRatio),	RMRfSettings[setting][1]);
		SpiWriteAddressData((REG_WRITE | ClockRecoveryOffset2), 			RMRfSettings[setting][2]);
		SpiWriteAddressData((REG_WRITE | ClockRecoveryOffset1), 			RMRfSettings[setting][3]);
		SpiWriteAddressData((REG_WRITE | ClockRecoveryOffset0), 			RMRfSettings[setting][4]);
		SpiWriteAddressData((REG_WRITE | ClockRecoveryTimingLoopGain1), 	RMRfSettings[setting][5]);
		SpiWriteAddressData((REG_WRITE | ClockRecoveryTimingLoopGain0), 	RMRfSettings[setting][6]);
		SpiWriteAddressData((REG_WRITE | TXDataRate1), 						RMRfSettings[setting][7]);
		SpiWriteAddressData((REG_WRITE | TXDataRate0), 						RMRfSettings[setting][8]);
		SpiWriteAddressData((REG_WRITE | ModulationModeControl1), 			RMRfSettings[setting][9]);
		SpiWriteAddressData((REG_WRITE | FrequencyDeviation), 				RMRfSettings[setting][10]);
	}
	else
	{	
		//set the registers according the selected RF settings in the compatible mode 
		SpiWriteAddressData((REG_WRITE | IFFilterBandwidth), CMRfSettings[setting][0] );
		SpiWriteAddressData((REG_WRITE | ClockRecoveryOversamplingRatio), CMRfSettings[setting][1]);
		SpiWriteAddressData((REG_WRITE | ClockRecoveryOffset2), CMRfSettings[setting][2]);
		SpiWriteAddressData((REG_WRITE | ClockRecoveryOffset1), CMRfSettings[setting][3]);
		SpiWriteAddressData((REG_WRITE | ClockRecoveryOffset0), CMRfSettings[setting][4]);
		SpiWriteAddressData((REG_WRITE | ClockRecoveryTimingLoopGain1), CMRfSettings[setting][5]);
		SpiWriteAddressData((REG_WRITE | ClockRecoveryTimingLoopGain0), CMRfSettings[setting][6]);
		SpiWriteAddressData((REG_WRITE | TXDataRate1), CMRfSettings[setting][7]);
		SpiWriteAddressData((REG_WRITE | TXDataRate0), CMRfSettings[setting][8]);
		SpiWriteAddressData((REG_WRITE | ModulationModeControl1), CMRfSettings[setting][9]);
		SpiWriteAddressData((REG_WRITE | FrequencyDeviation), CMRfSettings[setting][10]);
	}
	//enable packet handler & CRC16
	SpiWriteAddressData((REG_WRITE | DataAccessControl), 0x8D);
	
	SpiWriteAddressData((REG_WRITE | ModulationModeControl2), 0x63);
	
	//set preamble length & detection threshold
	SpiWriteAddressData((REG_WRITE | PreambleLength), (PREAMBLE_LENGTH << 1));		
	SpiWriteAddressData((REG_WRITE | PreambleDetectionControl), ( PD_LENGTH << 4) );
	
	
	SpiWriteAddressData((REG_WRITE | ClockRecoveryGearshiftOverride), 0x03);
	SpiWriteAddressData((REG_WRITE | AFCLoopGearshiftOverride), 0x40);
	
		
	return RF_OK;
}

RF_ENUM set_frq(uint8 frq)
{
  //set frequency
  SpiWriteAddressData((REG_WRITE | NominalCarrierFrequency1), FreqSettings[1][rf_dr] );
  SpiWriteAddressData((REG_WRITE | NominalCarrierFrequency0), FreqSettings[2][rf_dr] );
  SpiWriteAddressData((REG_WRITE | FrequencyHoppingStepSize), FreqSettings[3][rf_dr] );
  SpiWriteAddressData((REG_WRITE | FrequencyHoppingChannelSelect), frq);
  delay_ms(100);//wait a bit

  return RF_OK;
}

RF_ENUM set_pwr(uint8 pwr)
{
  SpiWriteAddressData((REG_WRITE | TXPower), pwr);
  delay_ms(100);														//wait a bit
  
  return RF_OK;
}

void GPIO_Config(void)
{
  
  GPIO_InitTypeDef GPIO_InitStructure;
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | 
  						RCC_APB2Periph_GPIOB | 
						RCC_APB2Periph_GPIOC |
                         RCC_APB2Periph_GPIOD | 
						 RCC_APB2Periph_GPIOE |
						 RCC_APB2Periph_AFIO, ENABLE); 
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);	 //JTAG禁用但SW-DP使能
	GPIO_DeInit(GPIOB);					 
	/**
		LED1 -> PB8	,	LED2 -> PB9 , LED3 -> PE0 , LED4 -> PE1
	*/	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
	GPIO_Init(GPIOB, &GPIO_InitStructure);					 
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_15|GPIO_Pin_14;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
	GPIO_Init(GPIOB, &GPIO_InitStructure);
		
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
	GPIO_Init(GPIOB, &GPIO_InitStructure);

	/*GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
	GPIO_Init(GPIOB, &GPIO_InitStructure); */

}
#include <string.h>
#include <stdio.h>
int main(void)
{
	char buf[100];
	SystemInit();
	GPIO_Config();	

	RfInitHw();
	
	sprintf(buf,"%s","yufujian\n");

    while (1)
	{
//		RfInitHw();
		RFTransmit((unsigned char*)buf,strlen(buf));
//		delay_ms(1000);
//		Spi0Write(0x81);
//		delay_ms(1);
    }
	return 0;
}
#ifdef  USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{ 
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif

/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/

⌨️ 快捷键说明

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