/******************************************************************** * FileName: Transceiver.c * Company: KRALICEK * * * Author Martin Kralicek Date 8/4/2010 Comment *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ********************************************************************/ // Including //=================================================================== #include // Hlavickovy soubor popisujici microcontroler #include #include #include #include "Transceiver.h" //=================================================================== // Declaration //============================================================== volatile N_ROTE_paket Paket_out, Paket_in; unsigned char ID_RX, my_ID; volatile unsigned char Receiv_int; // Function //=================================================================== /******************************************************************** * Function Name: delay * * Return Value: void * * Parameters: cas * * Description: Pauza vykonavajici prazdne cykly * * * ********************************************************************/ void delay(unsigned int cas) { while(--cas){ asm("nop"); } } /******************************************************************** * Function Name: Init_Transceiver * * Return Value: void * * Parameters: void * * Description: Nastaveni modulu a komunikace s modulem * * * ********************************************************************/ void Init_Transceiver(void) { // Start_SPI(); Start_SPI_soft(); //Nastaveni softwarove SPI komunikace Start_Inter(); //Nastaveni preruseni od RF modulu pro prijem delay(200); Low_power(); //Nastaveni RF modulu do Low Power modu delay(200); Init_RF(); //Aktivace RF modulu a jeho nastaveni pro komunikaci delay(200); FIFO_reset(); //Reset prijimaci pametu RF modulu delay(200); Write_cmd(0x0000); Write_cmd(0x0000); delay(200); } /******************************************************************** * Function Name: Start_SPI * * Return Value: void * * Parameters: void * * * * Description: Konfigurace SPI komunikace * * * ********************************************************************/ void Start_SPI(void){ DDRB = 0b00000010; //Nastaveni vstupu/vystupu PORTB = 0b00001001; //Nastaveni pull-up pro vstupu/vystupu SPCR = 0b01011011; } /******************************************************************** * Function Name: Start_SPI_soft * * Return Value: void * * Parameters: void * * * * Description: Konfigurace softwarove SPI komunikace * * * ********************************************************************/ void Start_SPI_soft(void){ DDRB = 0b10110010; //Nastaveni vstupu/vystupu PORTB = 0b00000000; //Nastaveni pull-up pro vstupu/vystupu CS_1; } /******************************************************************** * Function Name: Start_Inter * * Return Value: void * * Parameters: void * * * * Description: Konfigurace softwarove SPI komunikace * * * ********************************************************************/ void Start_Inter(void) { MCUCSR |= (1<> 8); while(!(SPSR & 0x80)) { if (!(SPSR & 0x40)) goto reset; } return SPDR; } */ /********************************************************************* * Function Name: Send_paket * * Return Value: void * * Parameters: * * Description: Funkce odesilani N-ROTE paketu * *********************************************************************/ // Paket_setting //=================================================================== //DB7 - (1 = příkazy, 0 = data) //DB6 - DB4 musí přijít v hodnotě 001 //DB3 - DB0 => délka datového/příkazového bloku //DB6 nastaví příjmač do 1, pokud souhlasí CRC, //DB5 nastaví příjmač pokud se adresa shoduje s adresou zařízení ; //DB4 nastaví příjmač do nuly, tím označí data za použitá, nepotřebná... //=================================================================== void Send_paket(void) { unsigned char x; unsigned int CRCin; cli(); //zakazani preruseni FIFO_reset(); //reset prijimaci pametu RF modulu CRCin=0; transmit_mode(); //nastaveni RF modulu do vysilaciho modu delay(500); Write_cmd(0x0000); Write_FSK(0xAA); //odesilani synchronizacnich dat Write_FSK(0xAA); Write_FSK(0xAA); Write_FSK(0x2D); Write_FSK(0xD4); Paket_out.Adr_RX = ID_RX; //nastaveni adresy prijimace Paket_out.Adr_TX = my_ID; //nastaveni vlastni identifikacni adresy Paket_out.Paket_setting = 0x1F; //nastaveni setting paketu Write_FSK(Paket_out.Adr_RX); //odeslani adresy prijimace Write_FSK(Paket_out.Adr_TX); //odeslani vlastni identifikacni adresy Write_FSK(Paket_out.Paket_setting); //odeslani setting paketu Write_FSK(Paket_out.Reserved); //odeslani reserved paketu CRCin += Paket_out.Adr_RX; //vypocet kontrolniho souctu CRCin += Paket_out.Adr_TX; CRCin += Paket_out.Paket_setting; CRCin += Paket_out.Reserved; for(x=0;x<11;x++) { Write_FSK(Paket_out.Data_buf[x]); //odesilani datovych bytu CRCin += Paket_out.Data_buf[x]; //vypocet kontrolniho souctu } Paket_out.CRC = (unsigned char)CRCin; Write_FSK(Paket_out.CRC); //odeslani kontrolniho souctu Write_FSK(0xAA); //odesilani synchronizacnich dat Write_FSK(0xAA); Write_FSK(0xAA); receive_mode(); //nastaveni RF modulu do prijimaciho modu FIFO_reset(); //reset prijimaci pametu RF modulu Clr_VDI(); //vynulování pinu VDI sei(); //povoleni preruseni } /********************************************************************* * Function Name: Receiv_paket * * Return Value: void * * Parameters: * * Description: Funkce prijmu N-ROTE paketu * *********************************************************************/ void Receiv_paket(void) { unsigned char x; unsigned int CRC; cli(); //zakazani preruseni CRC=0; Paket_in.Adr_RX = Rx_FIFO(); //prijem paketu s RX adresou Paket_in.Adr_TX = Rx_FIFO(); //prijem paketu s TX adresou Paket_in.Paket_setting = Rx_FIFO(); //prijem setting paketu Paket_in.Reserved = Rx_FIFO(); //prijem reserved paketu CRC += Paket_in.Adr_RX; //kotrolni soucet prijatych dat CRC += Paket_in.Adr_TX; CRC += Paket_in.Paket_setting; CRC += Paket_in.Reserved; for(x=0;x<11;x++) { Paket_in.Data_buf[x] = Rx_FIFO(); //prijem datovych paketu CRC += Paket_in.Data_buf[x]; //kotrolni soucet prijatych dat } Paket_in.CRC = Rx_FIFO(); //prijem kotrolniho souctu CRC &= 0x00FF; if ((unsigned char)CRC == Paket_in.CRC) //kontrola CRC... { Paket_in.Paket_setting |= 0x40; //data jou platná } if (my_ID == Paket_in.Adr_RX) //kontrola adresy { Paket_in.Paket_setting |= 0x20; //adresa vyhovuje my_ID } FIFO_reset(); //reset prijimaci pametu RF modulu Clr_VDI(); //vynulování pinu VDI sei(); //povoleni preruseni } /********************************************************************* * Function Name: Send_data * * Return Value: void * * Parameters: * * Description: Funkce odesilani dat * *********************************************************************/ void Send_data(unsigned char *buffer, unsigned char size) { unsigned char x; cli(); //zakazani preruseni FIFO_reset(); //reset prijimaci pametu RF modulu transmit_mode(); //nastaveni RF modulu do vysilaciho modu _delay_us(500); Write_cmd(0x0000); Write_FSK(0xAA); //odesilani synchronizacnich dat Write_FSK(0xAA); Write_FSK(0xAA); Write_FSK(0x2D); Write_FSK(0xD4); for(x=0;x