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…
Reference in New Issue
Block a user