uint8 gRadio_CheckReceived(void) { /* Read ITs, clear pending ones */ si446x_get_int_status(0u, 0u, 0u); si446x_change_state(SI446X_CMD_CHANGE_STATE_ARG_NEW_STATE_ENUM_READY); /* check the reason for the IT */ if (Si446xCmd.GET_INT_STATUS.PH_PEND & SI446X_CMD_GET_INT_STATUS_REP_PACKET_RX_PEND_BIT) { RfRxDataX[0]=0; si446x_fifo_info(0u); si446x_read_rx_fifo(1, &RfRxDataX[0]); //si446x_read_rx_fifo(RxBuffer[0], &RxBuffer[1]); //RxBuff2FrameBuff(RxBuffer,&FrameBuffToUart); RfRxFlag=RfRxData; /* Reset FIFO */ si446x_fifo_info(SI446X_CMD_FIFO_INFO_ARG_RX_BIT); si446x_change_state(SI446X_CMD_CHANGE_STATE_ARG_NEW_STATE_ENUM_RX); return TRUE; } /* Reset FIFO */ si446x_fifo_info(SI446X_CMD_FIFO_INFO_ARG_RX_BIT); si446x_change_state(SI446X_CMD_CHANGE_STATE_ARG_NEW_STATE_ENUM_RX); return FALSE; }
/*! * Check if Packet received IT flag is pending. * * @return TRUE - Packet successfully received / FALSE - No packet pending. * * @note * */ uint8 gRadio_CheckReceived_VariablePacket(void) { uint8 nirq_recv_var= SI4463_NIRQ_Bit(); if (nirq_recv_var == FALSE) { /* Read ITs, clear pending ones */ si446x_get_int_status(0u, 0u, 0u); if (Si446xCmd.GET_INT_STATUS.CHIP_PEND & SI446X_CMD_GET_CHIP_STATUS_REP_CMD_ERROR_PEND_BIT) { /* State change to */ si446x_change_state(SI446X_CMD_CHANGE_STATE_ARG_NEW_STATE_ENUM_SLEEP); /* Reset FIFO */ si446x_fifo_info(SI446X_CMD_FIFO_INFO_ARG_RX_BIT); /* State change to */ si446x_change_state(SI446X_CMD_CHANGE_STATE_ARG_NEW_STATE_ENUM_RX); } /* check the reason for the IT */ if (Si446xCmd.GET_INT_STATUS.MODEM_PEND & SI446X_CMD_GET_INT_STATUS_REP_SYNC_DETECT_BIT) { /* Blink once LED2 to show Sync Word detected */ //vHmi_ChangeLedState(eHmi_Led2_c, eHmi_LedBlinkOnce_c); } if (Si446xCmd.GET_INT_STATUS.PH_PEND & SI446X_CMD_GET_INT_STATUS_REP_PACKET_RX_PEND_BIT) { /* Blink once LED3 as CRC OK or not enabled */ // vHmi_ChangeLedState(eHmi_Led3_c, eHmi_LedBlinkOnce_c); /* Read the length of RX_FIFO */ si446x_fifo_info(0u); /* Packet RX */ si446x_read_rx_fifo(Si446xCmd.FIFO_INFO.RX_FIFO_COUNT, &fixRadioPacket[0]); /* Do not use UART in case of direct firmware load */ #ifdef UART_LOGGING_SUPPORT { /* Send it to UART */ UartSendByte(fixRadioPacket,RadioConfiguration.Radio_PacketLength); } #endif return TRUE; } if (Si446xCmd.GET_INT_STATUS.PH_PEND & SI446X_CMD_GET_INT_STATUS_REP_CRC_ERROR_BIT) { /* Reset FIFO */ si446x_fifo_info(SI446X_CMD_FIFO_INFO_ARG_RX_BIT); } } return FALSE; }
unsigned char Si4438_Tx__Config(void) { GPIO_InitTypeDef GPIO_InitStructure; SetHighRate(); //设置成高速率模式 //配置相应发送GPIO口 GPIO_InitStructure.GPIO_Pin = TX_DATA_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(TX_DATA_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = TX_CLK_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(TX_CLK_PORT, &GPIO_InitStructure); si446x_change_state(SI446X_CMD_CHANGE_STATE_ARG_NEW_STATE_ENUM_READY); si4438_phy.RF_status=RF_IDLE_FLAG; NVIC_DisableIRQ(GDIO1_EXTI_IRQn); NVIC_DisableIRQ(GDIO0_EXTI_IRQn); if (SI446X_SUCCESS != si446x_configuration_init(DirectModefiguration)) { DBUG("Si4438_Tx__Config fail\r\n"); wireless_phy_init(); return 0; } return 1; }
/*! * Check if Packet sent IT flag or Packet Received IT is pending. * * @return SI4455_CMD_GET_INT_STATUS_REP_PACKET_SENT_PEND_BIT / SI4455_CMD_GET_INT_STATUS_REP_PACKET_RX_PEND_BIT * * @note * */ U8 bRadio_Check_Tx_RX(void) { if (RF_NIRQ == FALSE) { /* Read ITs, clear pending ones */ si446x_get_int_status(0u, 0u, 0u); if (Si446xCmd.GET_INT_STATUS.CHIP_PEND & SI446X_CMD_GET_CHIP_STATUS_REP_CHIP_PEND_CMD_ERROR_PEND_BIT) { /* State change to */ si446x_change_state(SI446X_CMD_CHANGE_STATE_ARG_NEXT_STATE1_NEW_STATE_ENUM_SLEEP); /* Reset FIFO */ si446x_fifo_info(SI446X_CMD_FIFO_INFO_ARG_FIFO_RX_BIT); /* State change to */ si446x_change_state(SI446X_CMD_CHANGE_STATE_ARG_NEXT_STATE1_NEW_STATE_ENUM_RX); } if(Si446xCmd.GET_INT_STATUS.PH_PEND & SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_SENT_PEND_BIT) { return SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_SENT_PEND_BIT; } 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, &customRadioPacket[0]); return SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_RX_PEND_BIT; } if (Si446xCmd.GET_INT_STATUS.PH_PEND & SI446X_CMD_GET_INT_STATUS_REP_PH_STATUS_CRC_ERROR_BIT) { /* Reset FIFO */ si446x_fifo_info(SI446X_CMD_FIFO_INFO_ARG_FIFO_RX_BIT); } } return 0; }
/*! * Set Radio to TX mode, variable packet length. * * @param channel Freq. Channel, Packet to be sent length of of the packet sent to TXFIFO * * @note * */ void set_txd_mode(void) { volatile unsigned int tick_tmp=1000; //延时220uS; PA_Txen(); RXD_LED(0); si4438_phy.RF_status=RF_IDLE_FLAG; si446x_change_state(SI446X_CMD_CHANGE_STATE_ARG_NEW_STATE_ENUM_READY); while(tick_tmp--); si446x_get_int_status(0u, 0u, 0u); si446x_fifo_info(SI446X_CMD_FIFO_INFO_ARG_TX_BIT); /* Reset the Tx Fifo */ si4438_phy.tx_flag=TX_ON; si4438_phy.RF_status=RF_TX_FLAG; }
unsigned char Rf_set(void) { U8 SetPA[]={ RF_PA_MODE_5}; si4438_phy.RF_status=RF_IDLE_FLAG; si446x_change_state(SI446X_CMD_CHANGE_STATE_ARG_NEW_STATE_ENUM_READY); if (radio_comm_SendCmdGetResp(0x09, SetPA, 0, 0) != 0xFF) { DBUG("rf_power_up SI446X_CTS_TIMEOUT\r\n"); return FALSE; } return TRUE; }
/*! * Set Radio to TX mode, variable packet length. * * @param channel Freq. Channel, Packet to be sent length of of the packet sent to TXFIFO * * @note * */ void vRadio_StartTx_Variable_Packet(U8 channel, U8 *pioRadioPacket, U8 length) { /* Leave RX state */ si446x_change_state(SI446X_CMD_CHANGE_STATE_ARG_NEXT_STATE1_NEW_STATE_ENUM_READY); /* Read ITs, clear pending ones */ si446x_get_int_status(0u, 0u, 0u); /* Reset the Tx Fifo */ si446x_fifo_info(SI446X_CMD_FIFO_INFO_ARG_FIFO_TX_BIT); /* Fill the TX fifo with datas */ si446x_write_tx_fifo(length, pioRadioPacket); /* Start sending packet, channel 0, START immediately */ si446x_start_tx(channel, 0x80, length); }
U8 set_hop_table(U8 UserChannel) { U8 i=0,j=0; if(UserChannel>32) { UserChannel = PUBLIC_CHANNEL; } si4438_phy.RF_status=RF_IDLE_FLAG; si446x_change_state(SI446X_CMD_CHANGE_STATE_ARG_NEW_STATE_ENUM_READY); Clear_int_status(); Pro2Cmd[i++]=0x11; Pro2Cmd[i++]=0x50; Pro2Cmd[i++]=0x0C; Pro2Cmd[i++]=0x00; Pro2Cmd[i++]=Si4438HopRegister[j++]=0x30; Pro2Cmd[i++]=Si4438HopRegister[j++]=0x04; Pro2Cmd[i++]=Si4438HopRegister[j++]=ChannelsSupported[0][0]; Pro2Cmd[i++]=Si4438HopRegister[j++]=ChannelsSupported[0][1]; Pro2Cmd[i++]=Si4438HopRegister[j++]=ChannelsSupported[UserChannel][0]; Pro2Cmd[i++]=Si4438HopRegister[j++]=ChannelsSupported[UserChannel][1]; Pro2Cmd[i++]=Si4438HopRegister[j++]=0xFF; Pro2Cmd[i++]=Si4438HopRegister[j++]=0xFF; Pro2Cmd[i++]=Si4438HopRegister[j++]=0xFF; Pro2Cmd[i++]=Si4438HopRegister[j++]=0xFF; Pro2Cmd[i++]=Si4438HopRegister[j++]=0xFF; Pro2Cmd[i++]=Si4438HopRegister[j++]=0xFF; if(set_property(Pro2Cmd,0x10)==SI446X_SUCCESS) { DBUG("set_hop_table=%d\r\n",UserChannel); set_pchannel=UserChannel; si4438_phy.PhyPrivateChannel=UserChannel; Clear_int_status(); vRadio_StartRX(ChannelsSupported[0][0]); return TRUE; } return FALSE; }
/*! * Set Radio to RX mode, fixed packet length. * * @param channel Freq. Channel * * @note * */ void vRadio_StartRX(U8 channel) { // volatile unsigned int tick_tmp=1000; //延时220uS; // while(tick_tmp--); #ifdef LOW_RATE_CHECK SetHighRate(); #endif PA_Rxen(); si4438_phy.RF_status=RF_IDLE_FLAG; si446x_change_state(SI446X_CMD_CHANGE_STATE_ARG_NEW_STATE_ENUM_READY); si4438_phy.rx_flag=RX_ON; si4438_phy.RF_status=RF_RX_FLAG; // Read ITs, clear pending ones si446x_get_int_status(0u, 0u, 0u); /* Reset FIFO */ si446x_fifo_info(SI446X_CMD_FIFO_INFO_ARG_RX_BIT); /* Start Receiving packet, channel 0, START immediately, Packet length according to PH */ si446x_start_rx(channel, 0u, 0x00, SI446X_CMD_START_RX_ARG_RXTIMEOUT_STATE_ENUM_NOCHANGE, SI446X_CMD_START_RX_ARG_RXVALID_STATE_ENUM_RX, SI446X_CMD_START_RX_ARG_RXINVALID_STATE_ENUM_RX ); }