diff --git a/applications/cc1101-workaround/cc1101-workaround.cpp b/applications/cc1101-workaround/cc1101-workaround.cpp index ef8565a7..42fb1dac 100644 --- a/applications/cc1101-workaround/cc1101-workaround.cpp +++ b/applications/cc1101-workaround/cc1101-workaround.cpp @@ -117,18 +117,6 @@ int16_t rx_rssi(CC1101* cc1101, const FreqConfig* config) { 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) { // cc1101->SpiWriteReg(CC1101_FSCTRL1, 0x06); //IF frequency // 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 } +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)) // FREQ = f / (f_osc/65536) // CHAN = 0 @@ -429,6 +445,8 @@ extern "C" void cc1101_workaround(void* p) { printf("[cc1101] creating device\n"); GpioPin cs_pin = {CC1101_CS_GPIO_Port, CC1101_CS_Pin}; + gpio_init(&cc1101_g0_gpio, GpioModeInput); + // TODO open record GpioPin* cs_pin_record = &cs_pin; CC1101 cc1101(cs_pin_record); @@ -445,21 +463,20 @@ extern "C" void cc1101_workaround(void* p) { cc1101.SpiStrobe(CC1101_SIDLE); // flp_config(&cc1101); - async_config(&cc1101); - setup_freq(&cc1101, &FREQ_LIST[4]); - enable_cc1101_irq(); + // async_config(&cc1101); + tx_config(&cc1101); + // setup_freq(&cc1101, &FREQ_LIST[4]); + // enable_cc1101_irq(); printf("init ok\n"); - // === Transparent mode === - // TODO open record GpioPin* led_record = (GpioPin*)&led_gpio[1]; // configure pin gpio_init(led_record, GpioModeOutputOpenDrain); - const int16_t RSSI_THRESHOLD = -89; + const int16_t RSSI_THRESHOLD = -60; // setup_freq(&cc1101, &FREQ_LIST[1]); @@ -467,7 +484,7 @@ extern "C" void cc1101_workaround(void* p) { AppEvent event; 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); if(event_status == osOK) { @@ -509,26 +526,62 @@ extern "C" void cc1101_workaround(void* p) { } } } 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->mode == ModeRx) { + cc1101.SpiStrobe(CC1101_SIDLE); + gpio_init(&cc1101_g0_gpio, GpioModeInput); + setup_freq(&cc1101, &FREQ_LIST[state->active_freq]); + cc1101.SetReceive(); + state->last_rssi = rx_rssi(&cc1101, &FREQ_LIST[state->active_freq]); - // idle(&cc1101); } 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; } - gpio_write( - led_record, - (state->last_rssi > RSSI_THRESHOLD && !state->need_cc1101_conf) ? false : true); + if(!state->need_cc1101_conf && state->mode == ModeRx) { + state->last_rssi = rx_rssi(&cc1101, &FREQ_LIST[state->active_freq]); + + 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); widget_update(widget);