📄 main.c
字号:
//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 + -