/******************************************************************************* * @brief US2400 Tx. * @param DestAddr: To * @param pData: The data Tx * @param DataLen: The number of data need to Tx * @retval Ref to system.h - StatusTypeDef. */ void Us2400Tx(unsigned short DestAddr, unsigned char *pData, unsigned short DataLen) { unsigned char *p = (unsigned char *)&DestAddr; memset(TxBuff, 0x00, sizeof(TxBuff)); TxBuff[0] = 0x0B; TxBuff[1] = TxBuff[0] + DataLen; TxBuff[2] = 0x01; TxBuff[3] = 0x88; TxBuff[4] = SerialNumber++; TxBuff[5] = Us2400ReadShortReg(PANIDL); TxBuff[6] = Us2400ReadShortReg(PANIDH); p = (unsigned char *)&DestAddr; TxBuff[7] = *p++; TxBuff[8] = *p; TxBuff[9] = TxBuff[5]; TxBuff[10] = TxBuff[6]; TxBuff[11] = Us2400ReadShortReg(SADRL); TxBuff[12] = Us2400ReadShortReg(SADRH); memcpy(&TxBuff[TxBuff[0]+2], pData, DataLen); do { Us2400WriteLongRegBlock(TX_FIFO, TxBuff[1] + 0x02, TxBuff); memset(TxTempBuff, 0x00, sizeof(TxTempBuff)); Us2400ReadLongRegBlock(TX_FIFO, TxBuff[1] + 0x02, TxTempBuff); } while(memcmp(TxBuff, TxTempBuff, TxBuff[1] + 0x02) != 0); Us2400WriteShortReg(TXNTRIG, 0x01); }
/******************************************************************************* * @brief US2400 Into Deep Sleep. * @param None * @retval None */ void Us2400IntoDeepSleep(void) { Us2400WriteShortReg(RXFLUSH, 0x40); Us2400SetRecoveryTime(0x12, 0x42); Us2400WriteLongReg(RFCTRL55, 0x00); Us2400WriteLongReg(RFCTRL77, 0x18); Us2400WriteLongReg(RFCTRL50, Us2400ReadLongReg(RFCTRL50) & ~0x10); Us2400WriteShortReg(RXFLUSH, Us2400ReadShortReg(RXFLUSH) & ~0x80); Us2400WriteShortReg(SLPACK, Us2400ReadShortReg(SLPACK) | 0x80); }
uint8_t RF_Rx(uint8_t* RxData, uint8_t* Data_Length, uint8_t* RSSI){ int _isReceived =0; int _checkFlag=0; // ============== Check RX FIFO Full/Overflow ================= // if (Us2400ReadShortReg(0x30) == 0x90){ Us2400Rx(Data, &DataLen_temp, &RFLqi, &RFRssi); if (DataLen_temp != 0){ DataLen = DataLen_temp; DataLen_temp = 0; memcpy(RxData, Data, DataLen); *Data_Length = DataLen; *RSSI = RFRssi; _checkFlag = headerCheck_AutoNet(); if(!_checkFlag) { // Not For AutoNet _isReceived = 1; Us2400WriteShortReg(0x0D, Us2400ReadShortReg(0x0D) | 0x01); } } } // ============== Packet Receive ================= // if (RFRxState == 1 || Us2400ReadShortReg(0x30) == 0x80){ Us2400Rx(Data, &DataLen_temp, &RFLqi, &rssi); if (DataLen_temp != 0){ DataLen = DataLen_temp; DataLen_temp = 0; memcpy(RxData, Data, DataLen); *Data_Length = DataLen; *RSSI = RFRssi; _checkFlag = headerCheck_AutoNet(); if(!_checkFlag) { // Not For AutoNet _isReceived = 1; RFRxState = 0; } } } return _isReceived; }
uint8_t RF_Rx(uint8_t* RxData, uint8_t* Data_Length){ int _rx_check_flag =0; int _header_check_flag=0; // ============== Check RX FIFO Full/Overflow ================= // if (Us2400ReadShortReg(0x30) == 0x90){ Us2400Rx(Data, &DataLen_temp, &RFLqi, &RFRssi); if (DataLen_temp != 0){ DataLen = DataLen_temp; DataLen_temp = 0; memcpy(pRxData, Data, DataLen); memcpy(RxData, pRxData, DataLen); *Data_Length = DataLen; _header_check_flag = autonet_header_check(); if(!_header_check_flag) { // Not For AutoNet _rx_check_flag = 1; Us2400WriteShortReg(0x0D, Us2400ReadShortReg(0x0D) | 0x01); } } } // ============== Packet Receive ================= // if (RFRxState == 1 || Us2400ReadShortReg(0x30) == 0x80){ Us2400Rx(Data, &DataLen_temp, &RFLqi, &rssi); if (DataLen_temp != 0){ DataLen = DataLen_temp; DataLen_temp = 0; memcpy(pRxData, Data, DataLen); memcpy(RxData, pRxData, DataLen); *Data_Length = DataLen; _header_check_flag = autonet_header_check(); if(!_header_check_flag) { // Not For AutoNet _rx_check_flag = 1; RFRxState = 0; } } } return _rx_check_flag; }
/** * @brief This function handles External lines 4 to 15 interrupt request. * @param None * @retval None */ void EXTI4_15_IRQHandler(void) { uint8_t IntStatus = 0; if(EXTI_GetITStatus(EXTI_Line8) != RESET) { IntStatus = Us2400ReadShortReg(ISRSTS); IntStatus |= Us2400ReadShortReg(ISRSTS); if ((IntStatus & 0x01) == 0x01) { RFTxState = 0x00; } if ((IntStatus & 0x08) == 0x08) { RFRxState = 0x01; } if ((IntStatus & 0x40) == 0x40) { RFSleepState = 0x00; } EXTI_ClearITPendingBit(EXTI_Line8); } }
int RF_RX_AUTONET(){ int _isReceived =0; int _checkFlag=0; // ============== Check RX FIFO Full/Overflow ================= // if (Us2400ReadShortReg(0x30) == 0x90){ Us2400Rx(Data, &DataLen_temp, &RFLqi, &RFRssi); if (DataLen_temp != 0){ DataLen = DataLen_temp; DataLen_temp = 0; memcpy(pRxData, Data, DataLen); _checkFlag = headerCheck_AutoNet(); if(_checkFlag) { // For AutoNet _isReceived = 1; Us2400WriteShortReg(0x0D, Us2400ReadShortReg(0x0D) | 0x01); } } } // ============== Packet Receive ================= // if (RFRxState == 1 || Us2400ReadShortReg(0x30) == 0x80){ Us2400Rx(Data, &DataLen_temp, &RFLqi, &rssi); if (DataLen_temp != 0){ DataLen = DataLen_temp; DataLen_temp = 0; memcpy(pRxData, Data, DataLen); _checkFlag = headerCheck_AutoNet(); if(_checkFlag) { // For AutoNet _isReceived = 1; RFRxState = 0; } } } return _isReceived; }
/******************************************************************************* * Function Name : * Description : * Input : None * Output : None * Return : None *******************************************************************************/ void RF_Tx(uint16_t destAddr, uint8_t *data, uint16_t dataLen) { TimObj.TimeoutFlag &= (~TIMOUT_FLAG_100MS); TimObj.Tim[TIM_100MS].Ticks = TimObj.Tim[TIM_100MS].Period; RFTxState = 1; Us2400Tx(destAddr, data, dataLen); while (RFTxState != 0) { if ((TimObj.TimeoutFlag & TIMOUT_FLAG_100MS) == TIMOUT_FLAG_100MS) { if (Us2400ReadShortReg(0x31) == 0x09) { //Us2400Rx(Data, &DataLen, &RFLqi, &RFRssi); if (dataLen != 0){ //Packet_Receive(); dataLen = 0; } RFRxState = 0; Us2400WriteShortReg(0x0D, Us2400ReadShortReg(0x0D) | 0x01); } TimObj.TimeoutFlag ^= TIMOUT_FLAG_100MS; RFTxState = 0; } } }
/******************************************************************************* * @brief Initialize US2400 * @param None * @retval None */ void Us2400Init(unsigned short Frequency, unsigned short PanID, unsigned short Addr, unsigned char Power) { unsigned char *p = 0x00; Us2400WriteShortReg(SOFTRST, 0x07); Us2400WriteShortReg(GATECLK, 0x20); while(1) { if ((Us2400ReadShortReg(GATECLK) & 0x20) == 0x20) { break; } } Us2400WriteShortReg(PACON1, 0x08); Us2400WriteShortReg(FIFOEN, 0x94); Us2400WriteShortReg(TXPEMISP, 0x95); Us2400WriteShortReg(BBREG3, 0x50); Us2400WriteShortReg(BBREG5, 0x07); Us2400WriteShortReg(BBREG6, 0x40); if ((Frequency > 2400) && (Frequency < 2485)) { Frequency = ((((Frequency - 2400) / 5) - 1) << 4) | 0x03; } else { Frequency = 0x03; } if(Power <= 0x1f) //0 - -8.3dBm { Us2400WriteLongReg(RFCTRL3, (Power & 0x1f) << 3); } else { Us2400WriteLongReg(RFCTRL3, Us2400ReadLongReg(RFCTRL3) & 0x07); } Us2400WriteLongReg(RFCTRL0, Frequency); Us2400WriteLongReg(RFCTRL1, 0x01); Us2400WriteLongReg(RFCTRL2, 0x74); Us2400WriteLongReg(RFCTRL4, 0x06); Us2400WriteLongReg(RFCTRL6, 0x10); Us2400WriteLongReg(RFCTRL7, 0xEC); Us2400WriteLongReg(RFCTRL8, 0x8C); Us2400WriteLongReg(GPIODIR, 0x00); Us2400WriteLongReg(SECCTRL, 0x20); Us2400WriteLongReg(RFCTRL50, 0x07); Us2400WriteLongReg(RFCTRL51, 0xC0); Us2400WriteLongReg(RFCTRL52, 0x01); Us2400WriteLongReg(RFCTRL53, Us2400ReadLongReg(RFCTRL53) & 0xF0); // TX power Us2400WriteLongReg(RFCTRL59, 0x00); Us2400WriteLongReg(RFCTRL73, 0x80); Us2400WriteLongReg(RFCTRL74, 0xE5); Us2400WriteLongReg(RFCTRL75, 0x13); Us2400WriteLongReg(RFCTRL76, 0x07); p = (unsigned char *)&PanID; Us2400WriteShortReg(PANIDL, *p++); Us2400WriteShortReg(PANIDH, *p); p = (unsigned char *)&Addr; Us2400WriteShortReg(SADRL, *p++); Us2400WriteShortReg(SADRH, *p); Us2400WriteShortReg(INTMSK, 0x00); Us2400WriteShortReg(SOFTRST, 0x02); Us2400WriteShortReg(RFCTL, 0x04); Us2400WriteShortReg(RFCTL, 0x00); Us2400WriteShortReg(RFCTL, 0x02); Delay(1); Us2400WriteShortReg(RFCTL, 0x01); Delay(1); Us2400WriteShortReg(RFCTL, 0x00); }