void RF_Init(void) { #ifndef RF_Int_Init_DEF //ustawienia pocz�tkowe uk�adu RF_Status.RF_Status = _pRF_Status; RF_Status.RF_Status(); //konstruktor pse�do-klasy RF_Status //Konfiguracja wst�pna #ifdef RF_Master RF_Status.EnTx=1; RF_Status.EnRx=0; #else RF_Status.EnRx=1; RF_Status.EnTx=0; #endif RF_Status.Init=1; IntCA81Flag=0; SPI_SendWord(0x80E7,Cs_RF); //EL,EF,868band,12.0pF - pierwszy rozkaz konfiguracji #endif }//_____________________________________________________________________________
//----------------------------------------------------------------------------- //! Nazwa funkcji : RF_transmit //! Funkcja wysy�a dane przez RF12 //----------------------------------------------------------------------------- void RF_transmit(void) { if ((RF_Tx.BytesToSend==0) || (AT91C_BASE_PIOA->PIO_PDSR & RfIntBUS)) return; if (RF_Status.Transmit==0) { SPI_SendWord(0x0000,Cs_RF); //Delay(0xFFFF); //RF_Status.Transmit=1; }else{ char BTS=RF_Tx.Buff[0]; RF_Tx.BytesToSend--; for (char i=0; i<RF_Tx.BytesToSend; i++) RF_Tx.Buff[i]=RF_Tx.Buff[i+1]; //przesu� kolejke SPI_SendWord((0xB800 | BTS),Cs_RF); //wy�lij bajt } }
u16 __ARM_SC_WriteData(u8 iChip, u16 iEngine, u8 iAdrs, u16 iData) { unsigned int iCommand = 0; u16 wReadData; // Generate the command // RW COMMAND (0 = WRITE) iCommand = ((((u16)(iChip)) << 12 ) & 0x7000) | // Chip address ((((u16)(iEngine)) << 8 ) & 0x0F00) | ((((u16)(iAdrs)) ) & 0x00FF); // Memory Address // Send it via SPI // __MCU_ASIC_Deactivate_CS(); //__MCU_ASIC_Activate_CS(); SPI_SendWord(iCommand); wReadData = SPI_SendWord(iData); //__MCU_ASIC_Deactivate_CS(); return wReadData; }
//Uruchomienie trybu Nadajnika void _RF_EnableTX(void) { RF_Status.EnRx=0; RF_Status.EnTx=0; RF_Status.Transmit=0; RF_Tx.BytesToSend=0; RF_Status.EnRxWait=0; SPI_SendWord(0x8239,Cs_RF); }
void RF_Int(void) { unsigned int status = AT91F_PIO_GetInterruptStatus(PIO_RfIntBUS); if (status & RfIntBUS) { if ((( AT91C_BASE_PIOA->PIO_PDSR) & RfIntBUS)==0) { //je�eli uka�d dzia�a jako odbiornik if (RF_Status.EnRx) { if (RF_Status.Init==0) { SPI_SendWord(0x0000,Cs_RF); } } //je�eli uka�d dzia�a jako nadajnik else if ((RF_Status.EnTx) && (RF_Status.Transmit==1)) { if (RF_Tx.BytesToSend>0) { RF_transmit(); } else if (RF_Status.EnRxWait) { RF_Status.Transmit=0; RF_Status.EnRxWait=0; RF_Status.EnableRX(); } else { RF_Status.Transmit=0; } } } } }//_____________________________________________________________________________
//Uruchomienie trybu odbiornika void _RF_EnableRX(void) { //Je�eli przy prubie prze��czenia wysy�ane s� dane to poczekaj na zako�czenie wysy�ki if ((RF_Tx.BytesToSend>0)) { RF_Status.EnRxWait=1; }else{ for (int aaa=0; aaa<0x5FF; aaa++) asm( "nop" ); //u�pienie ~200us - wymagany czas prze��czenia z nadajnika na odbiornik RF_Status.EnTx=0; RF_Status.EnRx=0; RF_Tx.BytesToSend=0; SPI_SendWord(0x8299,Cs_RF); } }
u16 __ARM_SC_ReadData (u8 iChip, u16 iEngine, u8 iAdrs) { u16 iCommand = 0; u16 wTemp; // Send it via SPI // Generate the command iCommand = (ASIC_SPI_RW_COMMAND) | // RW COMMAND (1 = Read) ((((u16)iChip) << 12 ) & 0x7000) | // Chip address ((((u16)iEngine ) << 8 ) & 0x0F00) | ((((u16)iAdrs ) ) & 0x00FF); // Memory Address // We're on an 8 chip model // __MCU_ASIC_Deactivate_CS(); //__MCU_ASIC_Activate_CS(); SPI_SendWord(iCommand); wTemp = SPI_ReadWord(); // __MCU_ASIC_Deactivate_CS(); return wTemp; }
//----------------------------------------------------------------------------- //! Nazwa funkcji : RF_ReciveByte //! Funkcja interpretacji otrzymanego bajtu //----------------------------------------------------------------------------- void RF_ReciveByte(char Res) { for (char i=0; i<RF_BuffSizeRX-1; i++) {RF_Rx.Buff[i]=RF_Rx.Buff[i+1];} RF_Rx.Buff[RF_BuffSizeRX-1]=Res; RF_Rx.ReciveBytes++; //sprawdzenie ko�ca if ( (RF_Rx.Buff[RF_BuffSizeRX-3]==Preambu[0]) && (RF_Rx.Buff[RF_BuffSizeRX-2]==Preambu[1]) && (RF_Rx.Buff[RF_BuffSizeRX-1]==Preambu[2])) { RF_Rx.ReciveBytes -=3; //zmiejszenie ilo�ci odebranych danych o preambu�e //je�eli danych wi�cej ni� max ilo�� bajt�w w rozkazie to pr�ba dopasowania if (RF_Rx.ReciveBytes>8) { pRF_Command=(_pRF_Command)&(RF_Rx.Buff[6+3]); //rzutowanie na struktur� rozkazu if (pRF_Command->B6.CRC == crc16(pRF_Command->Streem, 4)) RF_Rx.ReciveBytes=6; pRF_Command=(_pRF_Command)&(RF_Rx.Buff[8+3]); //rzutowanie na struktur� rozkazu if (pRF_Command->B6.CRC == crc16(pRF_Command->Streem, 6)) RF_Rx.ReciveBytes=8; } pRF_Command=(_pRF_Command)&(RF_Rx.Buff[RF_BuffSizeRX-(RF_Rx.ReciveBytes+3)]); //rzutowanie na struktur� rozkazu abcd=crc16(pRF_Command->Streem, RF_Rx.ReciveBytes-2); if ( ((RF_Rx.ReciveBytes==6) && (pRF_Command->B6.CRC == crc16(pRF_Command->Streem, RF_Rx.ReciveBytes-2))) || ((RF_Rx.ReciveBytes==8) && (pRF_Command->B8.CRC == crc16(pRF_Command->Streem, RF_Rx.ReciveBytes-2))) ) { g_RF_TimeOutCounter=0; //Restart timeoutu ///Sprawdzenie zgodno�ci ID //if (pRF_Command->ID == RF_ID) //{ RF_ExecuteOrder(pRF_Command); //realizacja rozkazu //} //Testowe dla mastera // if (pRF_Command->ID == RF_ID_Master) // { poprawnych++; odb[IndWys]++; // } RF_Rx.ReciveBytes=0; // TRACE_INFO("\n\r"); // for (char i=0; i<20; i++) TRACE_INFO("%X ", RF_Rx.Buff[i]); /* if ((RF_Rx.Buff[RF_BuffSizeRX-9]==0x45) ) { } else if ((RF_Rx.Buff[RF_BuffSizeRX-9]==0x35) ) { } */ }else { RF_Rx.ReciveBytes=0; } if (!RF_Tx.BytesToSend) SPI_SendWord(0xCA81,Cs_RF); } else{ if ((( AT91C_BASE_PIOA->PIO_PDSR) & RfIntBUS)==0) SPI_SendWord(0x0000,Cs_RF); } }
char SPI_RFM12_Execute(char *Buffer_Tx, char *Buffer_Rx) { int Order= Buffer_Tx[0] | Buffer_Tx[1]<<8; //Je�eli uk�ad RF12 w trakcie inicjalizacji pierwotnej--------------------- cztmp[0]=RF_SetFreqReg(0); if (RF_Status.Init) { RF_Status.Ch=0; if (Order==0x80E7) { if (RF_Status.EnRx) RF_Status.EnableRX(); else RF_Status.EnableTX(); } //Rozkaz: 0x80E7 - EL,EF,868band,12.0pF if ((Order==0x8299) || (Order==0x8239) ) { SPI_SendWord(0xA000 | RF_SetFreqReg(RF_Status.Ch),Cs_RF); } //Rozkaz: 0xA6xx Cz�stotliwo�� bazowa (Kana� 0) - oryginalnie by�o 0xA640 - 868,0Mhz if (Order==(0xA000 | RF_SetFreqReg(RF_Status.Ch))) { SPI_SendWord(0xC607,Cs_RF); } //Rozkaz: 0xC607 Szybko�� transmisji 43kb/s - oryginalnie by�o 0xC647 - 4,8kb/s if (Order==0xC607) { SPI_SendWord(0x94A0,Cs_RF); } //Rozkaz: 0x94A0 VDI,FAST,134kHz,0dBm,-103dBm if (Order==0x94A0) { SPI_SendWord(0xC2AC,Cs_RF); } //Rozkaz: 0xC2AC AL,!ml,DIG,DQD4 if (Order==0xC2AC) { SPI_SendWord(0xCA81,Cs_RF); } //Rozkaz: 0xCA81 FIFO8,SYNC,!ff,DR if ((Order==0xCA81) && (IntCA81Flag==0)) { SPI_SendWord(0xCED4,Cs_RF); IntCA81Flag=1; Order=0xFFFF;} //Rozkaz: 0xCED4 ustawienie s�owa synchronizacyjnego na 0x2DD4 if (Order==0xCED4) { SPI_SendWord(0xC493,Cs_RF); } //Rozkaz: 0xC493 @PWR, AFC:-80+75Khz ,!st,!fi,OE,EN - oryginalnie 0xC483 @PWR,AFC - NO RSTRIC,!st,!fi,OE,EN if (Order==0xC493) { SPI_SendWord(0x9850,Cs_RF); } //Rozkaz: 0x9850 !mp,dewiacja +-90kHz ,MAX OUT if (Order==0x9850) { SPI_SendWord(0xCC17,Cs_RF); } //Rozkaz: 0xCC17 OB1�COB0, LPX,�Iddy�CDDIT�C if (Order==0xCC17) { SPI_SendWord(0xE000,Cs_RF); } //Rozkaz: 0xE000 if (Order==0xE000) { SPI_SendWord(0xC800,Cs_RF); } //Rozkaz: 0xC800 if (Order==0xC800) { SPI_SendWord(0xC040,Cs_RF); } //Rozkaz: 0xC040 1.66MHz,2.2V if (Order==0xC040) { SPI_SendWord(0xCA81,Cs_RF); } //Rozkaz: 0xCA81 Start fifo RX if ((Order==0xCA81) && (IntCA81Flag==1)) { SPI_SendWord(0xCA83,Cs_RF); } //Rozkaz: 0xCA83 Restart fifo RX if (Order==0xCA83) { RF_Status.EnRx=1; RF_Status.Init=0; //ustawienie przerwania ConfigureRFBus(); // Configure and enable the Vbus detection interrupt AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, ID_RfIntBUS, RF_INT_PRIOR, //AT91C_AIC_PRIOR_LOWEST, AT91C_AIC_PRIOR_HIGHEST 3,//AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, RF_Int); AT91F_PIO_InterruptEnable(PIO_RfIntBUS, RfIntBUS); AT91F_AIC_EnableIt(AT91C_BASE_AIC, ID_RfIntBUS); } }//Aktywny RX --------------------------------------------------------------- else if ((RF_Status.EnRx) && (RF_Status.Init==0)) { if ((Order==0x0000) && (Buffer_Rx[1]&0x80)) { SPI_SendWord(0xB000,Cs_RF); } if (Order==0xCA81) { SPI_SendWord(0xCA83,Cs_RF); } if (Order==0xCA83) { SPI_SendWord(0x0000,Cs_RF); } if (Order==0xB000) { RF_ReciveByte(Buffer_Rx[0]); } }//Aktywny TX --------------------------------------------------------------- else if (RF_Status.EnTx) { /* if ((RF_Status.Transmit==0) && (Order==0x0000)) { RF_Status.Transmit=1; RF_transmit(); } */ if ((RF_Status.Transmit==0) && (Order==0x0000)) { //TRACE_INFO("Tx %X \n\r ", Buffer_Rx[1]); if (Buffer_Rx[1]&0x20) { SPI_SendWord(0x0000,Cs_RF); } else { RF_Status.Transmit=1; RF_transmit(); } } } //W��czenie Odbiornika else if ((RF_Status.EnRx==0) && (RF_Status.EnTx==0) && (Order==0x8299)) { RF_Status.EnRx=1; SPI_SendWord(0x0000,Cs_RF); } //W��czenie Nadajnika else if ((RF_Status.EnRx==0) && (RF_Status.EnTx==0) && (Order==0x8239)) { for (int aaa=0; aaa<0x5FF; aaa++) asm( "nop" ); //u�pienie ~200us - wymagany czas prze��czenia z odbiornika na nadajnik RF_Status.EnTx=1; if (RF_Tx.BytesToSend>0) { RF_transmit(); } } } _RF_Command *pRF_Command;