parent
							
								
									c1c069e95f
								
							
						
					
					
						commit
						56c1142af6
					
				| @ -117,18 +117,6 @@ int16_t rx_rssi(CC1101* cc1101, const FreqConfig* config) { | |||||||
|     return rssi_dBm; |     return rssi_dBm; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void tx(CC1101* cc1101, const FreqConfig* config) { |  | ||||||
|     uint32_t freq_reg = config->band->base_freq * 1e6 / (F_OSC / 65536); |  | ||||||
|     cc1101->SetFreq((freq_reg >> 16) & 0xFF, (freq_reg >> 8) & 0xFF, (freq_reg)&0xFF); |  | ||||||
|     cc1101->SetChannel(config->channel); |  | ||||||
| 
 |  | ||||||
|     cc1101->SetTransmit(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void idle(CC1101* cc1101) { |  | ||||||
|     cc1101->SpiStrobe(CC1101_SIDLE); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void flp_config(CC1101* cc1101) { | void flp_config(CC1101* cc1101) { | ||||||
|     // cc1101->SpiWriteReg(CC1101_FSCTRL1, 0x06); //IF frequency
 |     // cc1101->SpiWriteReg(CC1101_FSCTRL1, 0x06); //IF frequency
 | ||||||
|     // cc1101->SpiWriteReg(CC1101_FSCTRL0, 0x00); //frequency offset before synthesizer
 |     // cc1101->SpiWriteReg(CC1101_FSCTRL0, 0x00); //frequency offset before synthesizer
 | ||||||
| @ -259,6 +247,34 @@ void async_config(CC1101* cc1101) { | |||||||
|     cc1101->SpiWriteReg(CC1101_FSCAL0, 0x1F); //Frequency Synthesizer Calibration
 |     cc1101->SpiWriteReg(CC1101_FSCAL0, 0x1F); //Frequency Synthesizer Calibration
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void tx_config(CC1101* cc1101) { | ||||||
|  |     // cc1101->SpiWriteReg(CC1101_IOCFG2,0x0B);  //GDO2 Output Pin Configuration
 | ||||||
|  |     // cc1101->SpiWriteReg(CC1101_IOCFG0,0x0C);  //GDO0 Output Pin Configuration
 | ||||||
|  |     cc1101->SpiSetRegValue(CC1101_IOCFG0, 13, 5, 0); // GDO0 Output Pin Configuration
 | ||||||
|  | 
 | ||||||
|  |     cc1101->SpiWriteReg(CC1101_FIFOTHR, 0x47); //RX FIFO and TX FIFO Thresholds
 | ||||||
|  |     cc1101->SpiWriteReg(CC1101_PKTCTRL0, 0x32); //Packet Automation Control
 | ||||||
|  |     cc1101->SpiWriteReg(CC1101_FSCTRL1, 0x06); //Frequency Synthesizer Control
 | ||||||
|  |     cc1101->SpiWriteReg(CC1101_FREQ2, 0x10); //Frequency Control Word, High Byte
 | ||||||
|  |     cc1101->SpiWriteReg(CC1101_FREQ1, 0xB0); //Frequency Control Word, Middle Byte
 | ||||||
|  |     cc1101->SpiWriteReg(CC1101_FREQ0, 0x71); //Frequency Control Word, Low Byte
 | ||||||
|  |     cc1101->SpiWriteReg(CC1101_MDMCFG4, 0x6A); //Modem Configuration
 | ||||||
|  |     cc1101->SpiWriteReg(CC1101_MDMCFG3, 0x2E); //Modem Configuration
 | ||||||
|  |     cc1101->SpiWriteReg(CC1101_MDMCFG2, 0x30); //Modem Configuration
 | ||||||
|  |     cc1101->SpiWriteReg(CC1101_DEVIATN, 0x15); //Modem Deviation Setting
 | ||||||
|  |     cc1101->SpiWriteReg(CC1101_MCSM0, 0x18); //Main Radio Control State Machine Configuration
 | ||||||
|  |     cc1101->SpiWriteReg(CC1101_FOCCFG, 0x16); //Frequency Offset Compensation Configuration
 | ||||||
|  |     cc1101->SpiWriteReg(CC1101_WORCTRL, 0xFB); //Wake On Radio Control
 | ||||||
|  |     cc1101->SpiWriteReg(CC1101_FREND0, 0x11); //Front End TX Configuration
 | ||||||
|  |     cc1101->SpiWriteReg(CC1101_FSCAL3, 0xE9); //Frequency Synthesizer Calibration
 | ||||||
|  |     cc1101->SpiWriteReg(CC1101_FSCAL2, 0x2A); //Frequency Synthesizer Calibration
 | ||||||
|  |     cc1101->SpiWriteReg(CC1101_FSCAL1, 0x00); //Frequency Synthesizer Calibration
 | ||||||
|  |     cc1101->SpiWriteReg(CC1101_FSCAL0, 0x1F); //Frequency Synthesizer Calibration
 | ||||||
|  |     cc1101->SpiWriteReg(CC1101_TEST2, 0x81); //Various Test Settings
 | ||||||
|  |     cc1101->SpiWriteReg(CC1101_TEST1, 0x35); //Various Test Settings
 | ||||||
|  |     cc1101->SpiWriteReg(CC1101_TEST0, 0x09); //Various Test Settings
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // f = (f_osc/65536) * (FREQ + CHAN * (256 + CH_SP_M) * 2^(CH_SP_E - 2))
 | // f = (f_osc/65536) * (FREQ + CHAN * (256 + CH_SP_M) * 2^(CH_SP_E - 2))
 | ||||||
| // FREQ = f / (f_osc/65536)
 | // FREQ = f / (f_osc/65536)
 | ||||||
| // CHAN = 0
 | // CHAN = 0
 | ||||||
| @ -429,6 +445,8 @@ extern "C" void cc1101_workaround(void* p) { | |||||||
|     printf("[cc1101] creating device\n"); |     printf("[cc1101] creating device\n"); | ||||||
|     GpioPin cs_pin = {CC1101_CS_GPIO_Port, CC1101_CS_Pin}; |     GpioPin cs_pin = {CC1101_CS_GPIO_Port, CC1101_CS_Pin}; | ||||||
| 
 | 
 | ||||||
|  |     gpio_init(&cc1101_g0_gpio, GpioModeInput); | ||||||
|  | 
 | ||||||
|     // TODO open record
 |     // TODO open record
 | ||||||
|     GpioPin* cs_pin_record = &cs_pin; |     GpioPin* cs_pin_record = &cs_pin; | ||||||
|     CC1101 cc1101(cs_pin_record); |     CC1101 cc1101(cs_pin_record); | ||||||
| @ -445,21 +463,20 @@ extern "C" void cc1101_workaround(void* p) { | |||||||
|     cc1101.SpiStrobe(CC1101_SIDLE); |     cc1101.SpiStrobe(CC1101_SIDLE); | ||||||
| 
 | 
 | ||||||
|     // flp_config(&cc1101);
 |     // flp_config(&cc1101);
 | ||||||
|     async_config(&cc1101); |     // async_config(&cc1101);
 | ||||||
|     setup_freq(&cc1101, &FREQ_LIST[4]); |     tx_config(&cc1101); | ||||||
|     enable_cc1101_irq(); |     // setup_freq(&cc1101, &FREQ_LIST[4]);
 | ||||||
|  |     // enable_cc1101_irq();
 | ||||||
| 
 | 
 | ||||||
|     printf("init ok\n"); |     printf("init ok\n"); | ||||||
| 
 | 
 | ||||||
|     // === Transparent mode ===
 |  | ||||||
| 
 |  | ||||||
|     // TODO open record
 |     // TODO open record
 | ||||||
|     GpioPin* led_record = (GpioPin*)&led_gpio[1]; |     GpioPin* led_record = (GpioPin*)&led_gpio[1]; | ||||||
| 
 | 
 | ||||||
|     // configure pin
 |     // configure pin
 | ||||||
|     gpio_init(led_record, GpioModeOutputOpenDrain); |     gpio_init(led_record, GpioModeOutputOpenDrain); | ||||||
| 
 | 
 | ||||||
|     const int16_t RSSI_THRESHOLD = -89; |     const int16_t RSSI_THRESHOLD = -60; | ||||||
| 
 | 
 | ||||||
|     // setup_freq(&cc1101, &FREQ_LIST[1]);
 |     // setup_freq(&cc1101, &FREQ_LIST[1]);
 | ||||||
| 
 | 
 | ||||||
| @ -467,7 +484,7 @@ extern "C" void cc1101_workaround(void* p) { | |||||||
| 
 | 
 | ||||||
|     AppEvent event; |     AppEvent event; | ||||||
|     while(1) { |     while(1) { | ||||||
|         osStatus_t event_status = osMessageQueueGet(event_queue, &event, NULL, 20); |         osStatus_t event_status = osMessageQueueGet(event_queue, &event, NULL, 100); | ||||||
|         State* state = (State*)acquire_mutex_block(&state_mutex); |         State* state = (State*)acquire_mutex_block(&state_mutex); | ||||||
| 
 | 
 | ||||||
|         if(event_status == osOK) { |         if(event_status == osOK) { | ||||||
| @ -509,26 +526,62 @@ extern "C" void cc1101_workaround(void* p) { | |||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } else { |         } else { | ||||||
|             if(!state->need_cc1101_conf && state->mode == ModeRx) { |  | ||||||
|                 state->last_rssi = rx_rssi(&cc1101, &FREQ_LIST[state->active_freq]); |  | ||||||
|             } |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if(state->need_cc1101_conf) { |         if(state->need_cc1101_conf) { | ||||||
|             if(state->mode == ModeRx) { |             if(state->mode == ModeRx) { | ||||||
|  |                 cc1101.SpiStrobe(CC1101_SIDLE); | ||||||
|  |                 gpio_init(&cc1101_g0_gpio, GpioModeInput); | ||||||
|  | 
 | ||||||
|                 setup_freq(&cc1101, &FREQ_LIST[state->active_freq]); |                 setup_freq(&cc1101, &FREQ_LIST[state->active_freq]); | ||||||
|  |                 cc1101.SetReceive(); | ||||||
|  | 
 | ||||||
|                 state->last_rssi = rx_rssi(&cc1101, &FREQ_LIST[state->active_freq]); |                 state->last_rssi = rx_rssi(&cc1101, &FREQ_LIST[state->active_freq]); | ||||||
|                 // idle(&cc1101);
 |  | ||||||
|             } else if(state->mode == ModeTx) { |             } else if(state->mode == ModeTx) { | ||||||
|                 tx(&cc1101, &FREQ_LIST[state->active_freq]); |                 cc1101.SpiStrobe(CC1101_SIDLE); | ||||||
|  | 
 | ||||||
|  |                 setup_freq(&cc1101, &FREQ_LIST[state->active_freq]); | ||||||
|  |                 cc1101.SetTransmit(); | ||||||
|  |                 gpio_init(&cc1101_g0_gpio, GpioModeOutputPushPull); | ||||||
|  |                 gpio_write(&cc1101_g0_gpio, false); | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             state->need_cc1101_conf = false; |             state->need_cc1101_conf = false; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         gpio_write( |         if(!state->need_cc1101_conf && state->mode == ModeRx) { | ||||||
|             led_record, |             state->last_rssi = rx_rssi(&cc1101, &FREQ_LIST[state->active_freq]); | ||||||
|             (state->last_rssi > RSSI_THRESHOLD && !state->need_cc1101_conf) ? false : true); | 
 | ||||||
|  |             gpio_write(led_record, state->last_rssi < RSSI_THRESHOLD); | ||||||
|  |         } else if(!state->need_cc1101_conf && state->mode == ModeTx) { | ||||||
|  |             /*
 | ||||||
|  |             const uint8_t data = 0xA5; | ||||||
|  | 
 | ||||||
|  |             for(uint8_t i = 0; i < 8; i++) { | ||||||
|  |                 gpio_write(&cc1101_g0_gpio, (data & (1 << i)) > 0); | ||||||
|  |                 osDelay(1); | ||||||
|  |             } | ||||||
|  |             gpio_write(&cc1101_g0_gpio, false); | ||||||
|  |             */ | ||||||
|  | 
 | ||||||
|  |             const uint16_t HALF_PERIOD = 500; | ||||||
|  | 
 | ||||||
|  |             for(uint8_t n = 0; n < 4; n++) { | ||||||
|  |                 for(uint8_t i = 0; i < 4; i++) { | ||||||
|  |                     gpio_write(&cc1101_g0_gpio, true); | ||||||
|  |                     delay_us(3 * HALF_PERIOD); | ||||||
|  |                     gpio_write(&cc1101_g0_gpio, false); | ||||||
|  |                     delay_us(HALF_PERIOD); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 for(uint8_t i = 0; i < 40; i++) { | ||||||
|  |                     gpio_write(&cc1101_g0_gpio, true); | ||||||
|  |                     delay_us(HALF_PERIOD); | ||||||
|  |                     gpio_write(&cc1101_g0_gpio, false); | ||||||
|  |                     delay_us(HALF_PERIOD); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
| 
 | 
 | ||||||
|         release_mutex(&state_mutex, state); |         release_mutex(&state_mutex, state); | ||||||
|         widget_update(widget); |         widget_update(widget); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 coreglitch
						coreglitch