FINAL ACS TO BE USED FOR TESTING. COMMISSIONING, ACS MAIN, DATA ACQ ALL DONE.
Dependencies: FreescaleIAP mbed-rtos mbed
Fork of ACS_FULL_Flowchart_BAE by
BCN.cpp
00001 00002 #include "BCN.h" 00003 #include <stdio.h> 00004 #include "pin_config.h" 00005 //Check the pin names 00006 //Takes max 4.3 sec in void FCTN_BCN_TX_MAIN() (temp.calc. + long_beacon + short_beacon) 00007 00008 Serial pc_bcn(USBTX, USBRX); //tx,rx 00009 SPI spi(PIN16, PIN17, PIN15); // mosi, miso, sclk 00010 DigitalOut cs(PIN6); //slave select or chip select 00011 Timer t_i; 00012 Timeout rf_sl_timeout; 00013 Ticker loop; 00014 00015 //GLOBAL VARIABLES 00016 uint8_t BCN_INIT_STATUS = 0; 00017 uint8_t BCN_TX_MAIN_STATUS = 0; 00018 uint8_t BCN_TX_STATUS = 0; 00019 uint8_t BCN_TX_EN = 1; //hardcoding for now //check where is this variable toggled?? 00020 uint8_t BCN_FEN = 0; //hardcoding for now //write this value to flash 00021 uint8_t BCN_STANDBY = 0; //hardcoding for now //check where is this variable toggled?? 00022 uint8_t BCN_TS_BUFFER = 0; // For Temperature 00023 00024 void FCTN_BCN_INIT() 00025 { 00026 pc_bcn.printf("FCTN_BCN_INIT\n"); 00027 BCN_INIT_STATUS = 1; 00028 if(BCN_FEN == 0) 00029 rf_sl_timeout.attach(&FCTN_BCN_FEN, 30); 00030 Init_BEACON_HW(); 00031 BCN_INIT_STATUS = 0; 00032 } 00033 void FCTN_BCN_FEN() 00034 { 00035 pc_bcn.printf("FCTN_FEN\n"); 00036 BCN_FEN = 1;//write this value to flash 00037 } 00038 void FCTN_BCN_TX_MAIN() 00039 { 00040 pc_bcn.printf("FCTN_BCN_TX_MAIN\n"); 00041 t_i.start(); 00042 int begin = t_i.read_us(); 00043 BCN_TX_MAIN_STATUS = 1; 00044 00045 if(BCN_FEN == 1) 00046 { 00047 if(BCN_TX_EN == 1) 00048 { 00049 //Measure and store BCN temperature in BCN_TS_BUFFER 00050 BCN_TS_BUFFER = check_Temperature(); 00051 pc_bcn.printf("\n\ntemperature = %d\n\n",BCN_TS_BUFFER); 00052 //Get BCN_HK data from BCN HW(SPI) //Store BCN_HK data in BCN_HK_BUFFER 00053 if(BCN_STANDBY == 1 ) 00054 { 00055 Set_BCN_TX_STATUS(BCN_TX_STANDBY); 00056 BCN_TX_MAIN_STATUS = 0; 00057 00058 // break; 00059 } 00060 else 00061 { 00062 //transmit short beacon and long beacon 00063 //SHORT_BCN_TX(); 00064 LONG_BCN_TX(); 00065 00066 if(Check_ACK_RECEIVED() == 1) 00067 { 00068 Set_BCN_TX_STATUS(BCN_TX_SUCCESS); 00069 BCN_TX_MAIN_STATUS = 0; 00070 } 00071 else 00072 { 00073 Set_BCN_TX_STATUS(BCN_TX_FAILURE); 00074 BCN_TX_MAIN_STATUS = 0; 00075 00076 } 00077 } 00078 } 00079 else 00080 { 00081 Set_BCN_TX_STATUS(BCN_TX_DISABLED); 00082 BCN_TX_MAIN_STATUS = 0; 00083 } 00084 } 00085 else 00086 { 00087 Set_BCN_TX_STATUS(BCN_RF_SILENCE); //Window of RF Silence: None of the Txs should be on. 00088 BCN_TX_MAIN_STATUS = 0; 00089 } 00090 t_i.stop(); 00091 int end = t_i.read_us(); 00092 pc_bcn.printf("The time required for FCTN_BCN_TX_MAIN is %d useconds\r\n", end-begin); 00093 00094 } 00095 00096 void Set_BCN_TX_STATUS(uint8_t STATUS) 00097 { 00098 BCN_TX_STATUS = STATUS; 00099 } 00100 00101 uint8_t check_Temperature() 00102 { 00103 uint8_t temperature; 00104 writereg(RF22_REG_0F_ADC_CONFIGURATION,0x00); 00105 writereg(RF22_REG_12_Temperature_Sensor_Calibration,0x20); 00106 writereg(RF22_REG_0F_ADC_CONFIGURATION,0x80); 00107 wait(0.1); 00108 temperature = readreg(RF22_REG_11_ADC_Value); 00109 temperature = (float)temperature*0.5 - 64; 00110 return temperature; 00111 } 00112 00113 void SHORT_BCN_TX() 00114 { 00115 writereg(RF22_REG_6E_TX_DATA_RATE,0x01); 00116 writereg(RF22_REG_6F_TX_DATA_RATE,0x50);//160bps 00117 writereg(RF22_REG_3E_PACKET_LENGTH,SHORT_TX_DATA); //short packet length 00118 wait(0.02); 00119 00120 uint32_t timeout_count = 10e5; 00121 //extract values from short_beacon[] 00122 00123 struct Short_beacon 00124 { 00125 uint8_t Voltage[1]; 00126 uint8_t AngularSpeed[2]; 00127 uint8_t SubsystemStatus[1]; 00128 uint8_t Temp[3]; 00129 uint8_t ErrorFlag[1]; 00130 }Shortbeacon = { {0x88}, {0x99, 0xAA} , {0xAA},{0xAA,0xDD,0xEE}, {0x00} }; 00131 00132 //filling hk data 00133 //uint8_t short_beacon[] = { 0xAB, 0x8A, 0xE2, 0xBB, 0xB8, 0xA2, 0x8E,Shortbeacon.Voltage[0],Shortbeacon.AngularSpeed[0], Shortbeacon.AngularSpeed[1],Shortbeacon.SubsystemStatus[0],Shortbeacon.Temp[0],Shortbeacon.Temp[1],Shortbeacon.Temp[2],Shortbeacon.ErrorFlag[0]}; 00134 uint8_t short_beacon[] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,Shortbeacon.Voltage[0],Shortbeacon.AngularSpeed[0], Shortbeacon.AngularSpeed[1],Shortbeacon.SubsystemStatus[0],Shortbeacon.Temp[0],Shortbeacon.Temp[1],Shortbeacon.Temp[2],Shortbeacon.ErrorFlag[0]}; 00135 00136 clearTxBuf(); 00137 //writing data first time 00138 int byte = 0; 00139 cs = 0; 00140 spi.write(0xFF); 00141 00142 for (int byte_counter = 0; byte_counter <15 ; byte_counter++) 00143 { 00144 for(int j = 3; j >= 0 ; j--) 00145 { 00146 if((short_beacon[byte_counter] & (uint8_t) pow(2.0,(j*2+1)))!= pow(2.0,(j*2+1))) 00147 { 00148 byte=0x00; 00149 } 00150 else 00151 { 00152 byte=0xF0; 00153 } 00154 if((short_beacon[byte_counter] & (uint8_t) pow(2.0,j*2))!= pow(2.0,j*2)) 00155 { 00156 byte=byte | 0x00; 00157 } 00158 else 00159 { 00160 byte=byte | 0x0F; 00161 } 00162 spi.write(byte); 00163 } 00164 } 00165 00166 cs = 1; 00167 00168 //Set to Tx mode 00169 writereg(RF22_REG_07_OPERATING_MODE1,0x08);//* 00170 wait(0.1); 00171 //Check for fifoThresh 00172 while(timeout_count--)if((readreg(RF22_REG_03_INTERRUPT_STATUS1) & 0x20) == 0x20)break; 00173 timeout_count=10e5; 00174 00175 //Check for packet_sent 00176 while(timeout_count--)if((readreg(RF22_REG_03_INTERRUPT_STATUS1) & 0x04) == 0x04)break; 00177 00178 //pc_bcn.printf("Short packet sent\r\n"); 00179 00180 writereg(RF22_REG_07_OPERATING_MODE1,0x00); //standby mode 00181 00182 } 00183 void LONG_BCN_TX() 00184 { 00185 writereg(RF22_REG_6E_TX_DATA_RATE,0x08); 00186 writereg(RF22_REG_6F_TX_DATA_RATE,0x31);//1000 bps 00187 writereg(RF22_REG_3E_PACKET_LENGTH,LONG_TX_DATA); //long packet length 00188 wait(0.02); 00189 uint32_t timeout_count=10e5; 00190 00191 //get long_beacon array 00192 00193 uint8_t Long_beacon[125]; 00194 for(int i = 0;i<125;) 00195 { 00196 Long_beacon[i++] = 0xAA; 00197 } 00198 00199 00200 00201 00202 //setModeIdle(); 00203 clearTxBuf(); 00204 //writing data first time 00205 cs = 0; 00206 spi.write(0xFF); 00207 for(int i=0; i<60;i++) 00208 { 00209 spi.write(Long_beacon[i]); 00210 } 00211 cs = 1; 00212 00213 //Set to Tx mode 00214 writereg(RF22_REG_07_OPERATING_MODE1,0x08);//* 00215 wait(0.1); 00216 00217 //Check for fifoThresh 00218 while(timeout_count--)if((readreg(RF22_REG_03_INTERRUPT_STATUS1) & 0x20) == 0x20)break; 00219 timeout_count=10e5; 00220 00221 cs = 0; 00222 spi.write(0xFF); 00223 for(int i=60; i<125;i++) 00224 { 00225 spi.write(Long_beacon[i]); 00226 } 00227 cs = 1; 00228 wait(0.1); 00229 //Check for fifoThresh 00230 while(timeout_count--)if((readreg(RF22_REG_03_INTERRUPT_STATUS1) & 0x20) == 0x20)break; 00231 timeout_count=10e5; 00232 00233 //Check for packetsent interrupt 00234 while(timeout_count--)if((readreg(RF22_REG_03_INTERRUPT_STATUS1) & 0x04) == 0x04)break; 00235 00236 //pc_bcn.printf("Long packet sent\r\n"); 00237 00238 writereg(RF22_REG_07_OPERATING_MODE1,0x00); //standby mode 00239 } 00240 void reset_rfm() 00241 { 00242 FCTN_BCN_INIT(); 00243 } 00244 void writereg(uint8_t reg,uint8_t val) 00245 { 00246 uint8_t count = 0; 00247 for(;;count++) 00248 { 00249 int read_val =0; cs = 0;spi.write(reg | 0x80);spi.write(val);cs = 1; 00250 if(reg != 0x7 && reg != 0x58 && reg != 0xF) 00251 { 00252 read_val = readreg(reg); 00253 if (read_val == val) 00254 { 00255 break; 00256 } 00257 else if(count == 5) 00258 { 00259 reset_rfm(), printf("reg = 0x%X\n",reg);break; 00260 } 00261 } 00262 else 00263 break; 00264 } 00265 } 00266 uint8_t readreg(uint8_t reg) 00267 { 00268 uint8_t val;cs = 0;spi.write(reg & ~0x80);val = spi.write(0);cs = 1;return val; 00269 } 00270 void clearTxBuf() 00271 { 00272 writereg(RF22_REG_08_OPERATING_MODE2,0x01); 00273 writereg(RF22_REG_08_OPERATING_MODE2,0x00); 00274 } 00275 uint8_t setFrequency(double centre) 00276 { 00277 uint8_t fbsel = 0x40; 00278 if (centre >= 480.0) { 00279 centre /= 2; 00280 fbsel |= 0x20; 00281 } 00282 centre /= 10.0; 00283 double integerPart = floor(centre); 00284 double fractionalPart = centre - integerPart; 00285 00286 uint8_t fb = (uint8_t)integerPart - 24; // Range 0 to 23 00287 fbsel |= fb; 00288 uint16_t fc = fractionalPart * 64000; 00289 writereg(RF22_REG_73_FREQUENCY_OFFSET1, 0); // REVISIT 00290 writereg(RF22_REG_74_FREQUENCY_OFFSET2, 0); 00291 writereg(RF22_REG_75_FREQUENCY_BAND_SELECT, fbsel); 00292 writereg(RF22_REG_76_NOMINAL_CARRIER_FREQUENCY1, fc >> 8); 00293 writereg(RF22_REG_77_NOMINAL_CARRIER_FREQUENCY0, fc & 0xff); 00294 return 0; 00295 } 00296 00297 00298 void Init_BEACON_HW() 00299 { 00300 wait(0.1); 00301 cs=1; // chip must be deselected 00302 wait(0.1); 00303 spi.format(8,0); 00304 spi.frequency(10000000); //10MHz SCLK 00305 00306 //should either have a flag for invalid SPI or discard this for actual case or add reset 00307 if (readreg(RF22_REG_00_DEVICE_TYPE) == 0x08) 00308 pc_bcn.printf("spi connection valid\r\n"); 00309 else 00310 {pc_bcn.printf("error in spi connection\r\n"); 00311 reset_rfm(); 00312 } 00313 00314 writereg(RF22_REG_07_OPERATING_MODE1,0x80); //sw_reset 00315 wait(0.1); //takes time to reset 00316 00317 clearTxBuf(); 00318 00319 writereg(RF22_REG_07_OPERATING_MODE1,0x00); //standby mode 00320 00321 //txfifoalmostempty 00322 writereg(RF22_REG_7D_TX_FIFO_CONTROL2,30); 00323 00324 //Packet-engine registers 00325 writereg(RF22_REG_30_DATA_ACCESS_CONTROL,0x00); 00326 00327 writereg(RF22_REG_33_HEADER_CONTROL2,0x08); 00328 writereg(RF22_REG_34_PREAMBLE_LENGTH,0x00); 00329 00330 writereg(RF22_REG_0B_GPIO_CONFIGURATION0,0x15); // TX state 00331 writereg(RF22_REG_0C_GPIO_CONFIGURATION1,0x12); // RX state 00332 00333 setFrequency(435.0); 00334 00335 if((readreg(RF22_REG_02_DEVICE_STATUS)& 0x08)!= 0x00) 00336 { 00337 pc_bcn.printf("frequency not set properly\r\n"); 00338 reset_rfm(); 00339 } 00340 00341 //set Modem Configuration 00342 //writereg(RF22_REG_1C_IF_FILTER_BANDWIDTH,0xdf); 00343 //writereg(RF22_REG_1F_CLOCK_RECOVERY_GEARSHIFT_OVERRIDE,0x03); 00344 //writereg(RF22_REG_20_CLOCK_RECOVERY_OVERSAMPLING_RATE,0x39); 00345 //writereg(RF22_REG_21_CLOCK_RECOVERY_OFFSET2,0x20); 00346 //writereg(RF22_REG_22_CLOCK_RECOVERY_OFFSET1,0x68); //updated 20 to 25 reg values from excel sheet for 1.2 Khz freq. deviation,fsk 00347 //writereg(RF22_REG_23_CLOCK_RECOVERY_OFFSET0,0xdc); 00348 //writereg(RF22_REG_24_CLOCK_RECOVERY_TIMING_LOOP_GAIN1,0x00); 00349 //writereg(RF22_REG_25_CLOCK_RECOVERY_TIMING_LOOP_GAIN0,0x6B); 00350 //writereg(RF22_REG_2C_OOK_COUNTER_VALUE_1,0x2C); 00351 //writereg(RF22_REG_2D_OOK_COUNTER_VALUE_2,0x11); //not required for fsk (OOK counter value) 00352 //writereg(RF22_REG_2E_SLICER_PEAK_HOLD,0x2A); //?? 00353 writereg(RF22_REG_58,0x80); 00354 //writereg(RF22_REG_69_AGC_OVERRIDE1,0x60); 00355 00356 //Data rate set later 00357 00358 writereg(RF22_REG_70_MODULATION_CONTROL1,0x20); 00359 writereg(RF22_REG_71_MODULATION_CONTROL2,0x21);//ook = 0x21 00360 00361 //set tx power 00362 writereg(RF22_REG_6D_TX_POWER,0x07); //20dbm 00363 00364 //TX_packet_length written later 00365 } 00366 bool Check_ACK_RECEIVED() 00367 { 00368 if((readreg(RF22_REG_03_INTERRUPT_STATUS1) & 0x04) == 0x04) 00369 { 00370 printf("Packet sent: ACK received\r\n"); 00371 return 1; 00372 } 00373 else 00374 { 00375 pc_bcn.printf("Packet not sent\r\n"); 00376 return 0; 00377 } 00378 } 00379 /*int main() 00380 { 00381 FCTN_BCN_INIT(); 00382 00383 loop.attach(&FCTN_BCN_TX_MAIN, 10.0);//in actual case its 30.0 00384 00385 while(1); 00386 00387 }*/
Generated on Tue Jul 26 2022 18:25:34 by 1.7.2