43 #include "cc112x_def.h" 44 #include "radio_drv.h" 45 #include "hal_spi_rf.h" 46 #include "hal_nop_delay.h" 56 #define RF_XTAL_FREQ RF_XTAL 57 #define RF_LO_DIVIDER 4 62 uint8_t rf_end_packet = 0;
85 const registerSetting_t preferredSettings_1200bps[]=
97 {PREAMBLE_CFG1, 0x18},
101 {SYMBOL_RATE2, 0x43},
102 {SYMBOL_RATE1, 0xA9},
103 {SYMBOL_RATE0, 0x2A},
109 {SETTLING_CFG, 0x0B},
131 {FS_REG_DIV_CML, 0x14},
156 const registerSetting_t preferredSettings_38400bps[]=
168 {MODCFG_DEV_E, 0x0D},
170 {PREAMBLE_CFG1, 0x18},
174 {SYMBOL_RATE2, 0x93},
175 {SYMBOL_RATE1, 0xA9},
176 {SYMBOL_RATE0, 0x2A},
181 {SETTLING_CFG, 0x0B},
206 {FS_REG_DIV_CML, 0x14},
231 const registerSetting_t preferredSettings_50kbps[]=
244 {MODCFG_DEV_E, 0x0D},
246 {PREAMBLE_CFG1, 0x18},
247 {PREAMBLE_CFG0, 0x2A},
253 {SYMBOL_RATE2, 0x99},
254 {SYMBOL_RATE1, 0x99},
255 {SYMBOL_RATE0, 0x99},
261 {SETTLING_CFG, 0x0B},
287 {FS_REG_DIV_CML, 0x14},
311 const registerSetting_t trial_Settings[]=
319 {PREAMBLE_CFG1, 0x18},
348 {FS_REG_DIV_CML, 0x14},
370 int radio_init(uint8_t config_select) {
372 uint8_t i, writeByte, preferredSettings_length;
374 registerSetting_t *preferredSettings;
380 hal_gpio_cfg_output (RF_RESET_PIN, 1);
381 hal_gpio_pin_set (RF_RESET_PIN);
382 hal_nop_delay_ms (1);
383 hal_gpio_pin_clear (RF_RESET_PIN);
384 hal_nop_delay_ms (1);
385 hal_gpio_pin_set (RF_RESET_PIN);
386 trxRfSpiInterfaceInit();
387 log_printf(
"%s\n", __func__);
395 trxSpiCmdStrobe(SRES);
398 hal_nop_delay_us (16000);
400 switch (config_select) {
402 preferredSettings_length =
sizeof(preferredSettings_1200bps)/
sizeof(registerSetting_t);
403 preferredSettings = (registerSetting_t *)preferredSettings_1200bps;
407 preferredSettings_length =
sizeof(preferredSettings_38400bps)/
sizeof(registerSetting_t);
408 preferredSettings = (registerSetting_t *)preferredSettings_38400bps;
412 preferredSettings_length =
sizeof(preferredSettings_50kbps)/
sizeof(registerSetting_t);
413 preferredSettings = (registerSetting_t *)preferredSettings_50kbps;
417 preferredSettings_length =
sizeof(trial_Settings)/
sizeof(registerSetting_t);
418 preferredSettings = (registerSetting_t *)trial_Settings;
422 preferredSettings_length =
sizeof(preferredSettings_1200bps)/
sizeof(registerSetting_t);
423 preferredSettings = (registerSetting_t *)preferredSettings_1200bps;
429 for(i = 0; i < preferredSettings_length; i++) {
431 if(preferredSettings[i].addr < 0x2F) {
432 writeByte = preferredSettings[i].data;
433 trx8BitRegAccess(RADIO_WRITE_ACCESS, preferredSettings[i].addr, &writeByte, 1);
435 writeByte = preferredSettings[i].data;
436 trx16BitRegAccess(RADIO_WRITE_ACCESS, 0x2F , (0xFF & preferredSettings[i].addr),
442 #ifdef ENABLE_RANGE_EXTENDER 443 range_extender_init();
464 int radio_prepare(uint8_t *payload, uint16_t payload_len) {
465 trx8BitRegAccess(RADIO_WRITE_ACCESS+RADIO_BURST_ACCESS, TXFIFO, payload, payload_len);
486 int radio_transmit(
void) {
489 #ifdef ENABLE_RANGE_EXTENDER 490 range_extender_txon();
494 trxSpiCmdStrobe(STX);
513 int radio_receive_on(
void) {
515 trxSpiCmdStrobe(SFRX);
517 #ifdef ENABLE_RANGE_EXTENDER 518 range_extender_rxon();
522 trxSpiCmdStrobe(SRX);
544 int radio_send(uint8_t *payload, uint16_t payload_len) {
547 trxSpiCmdStrobe (SFTX);
550 trx8BitRegAccess(RADIO_WRITE_ACCESS|RADIO_BURST_ACCESS, TXFIFO, payload, payload_len);
555 trx16BitRegAccess(RADIO_READ_ACCESS|RADIO_BURST_ACCESS, 0x2F, 0xff & NUM_TXBYTES, &pktLen, 1);
559 #ifdef ENABLE_RANGE_EXTENDER 560 range_extender_txon();
564 trxSpiCmdStrobe(STX);
586 int radio_read(uint8_t *buf, uint8_t *buf_len) {
591 trx16BitRegAccess(RADIO_READ_ACCESS, 0x2F, 0xff & NUM_RXBYTES, &pktLen, 1);
596 if ((pktLen > 0) && (pktLen <= *buf_len)) {
599 trx8BitRegAccess(RADIO_READ_ACCESS|RADIO_BURST_ACCESS, RXFIFO, buf, pktLen);
605 trx16BitRegAccess(RADIO_READ_ACCESS, 0x2F, 0xff & LQI_VAL, &status, 1);
608 status = status & CRC_OK;
609 trxSpiCmdStrobe(SFRX);
615 log_printf(
"Wrong..!!");
618 trxSpiCmdStrobe(SFRX);
643 int radio_channel_clear(
void) {
647 trx16BitRegAccess(RADIO_READ_ACCESS, 0x2F, 0xff & RSSI0, &status, 1);
650 return(status & 0x04);
674 int radio_wait_for_idle(uint16_t max_hold) {
680 trx16BitRegAccess(RADIO_READ_ACCESS, 0x2F, 0xff & MARCSTATE, ®_status, 1);
683 reg_status = (reg_status & 0x1F);
686 if(!(reg_status == MARCSTATE_IDLE)) {
709 if(rf_end_packet == 0) {
713 #ifdef ENABLE_RANGE_EXTENDER 714 range_extender_idle();
734 int radio_is_busy(
void) {
762 int radio_pending_packet(
void) {
767 return rf_end_packet;
784 int radio_clear_pending_packet(
void) {
809 int radio_set_pwr(
int tx_pwr) {
829 int radio_set_freq(uint64_t freq) {
831 uint8_t freq_regs[3];
832 uint32_t freq_regs_uint32;
836 f_vco = freq * RF_LO_DIVIDER;
839 f_vco = f_vco * (1/(float)RF_XTAL_FREQ);
842 f_vco = f_vco * 65536;
845 freq_regs_uint32 = (uint32_t) f_vco;
848 freq_regs[2] = ((uint8_t*)&freq_regs_uint32)[0];
849 freq_regs[1] = ((uint8_t*)&freq_regs_uint32)[1];
850 freq_regs[0] = ((uint8_t*)&freq_regs_uint32)[2];
853 trx16BitRegAccess(RADIO_WRITE_ACCESS | RADIO_BURST_ACCESS, 0x2F, (0xFF & FREQ2), freq_regs, 3);
874 int radio_idle(
void) {
876 #ifdef ENABLE_RANGE_EXTENDER 877 range_extender_idle();
884 trxSpiCmdStrobe(SIDLE);
887 trxSpiCmdStrobe(SFRX);
888 trxSpiCmdStrobe(SFTX);
907 int radio_sleep(
void) {
910 #ifdef ENABLE_RANGE_EXTENDER 911 range_extender_idle();
915 trxSpiCmdStrobe(SIDLE);
918 trxSpiCmdStrobe(SPWD);
937 int radio_wake(
void) {
940 trxSpiCmdStrobe(SIDLE);
943 hal_nop_delay_us (1000);
965 int radio_freq_error(
void) {
967 uint64_t freq_error_est;
968 long freq_error_est_int;
969 uint8_t sign, regState, regState1;
970 uint32_t freq_reg_error;
973 trx16BitRegAccess(RADIO_READ_ACCESS, 0x2F, (0xFF & FREQOFF_EST0), ®State, 1);
974 trx16BitRegAccess(RADIO_READ_ACCESS, 0x2F, (0xFF & FREQOFF_EST1), ®State1, 1);
977 freq_reg_error = ((uint32_t)regState1 << 8) + regState;
980 if (freq_reg_error > 32768) {
981 freq_error_est = -(freq_reg_error - 65535);
984 freq_error_est = freq_reg_error;
989 freq_error_est = (freq_error_est * (RF_XTAL_FREQ/RF_LO_DIVIDER)) >> 8;
990 freq_error_est = (freq_error_est * 1000) >> 10;
994 freq_error_est_int = -freq_error_est;
996 freq_error_est_int = freq_error_est;
999 return freq_error_est_int;
1003 int radio_check_status_flag (uint8_t status_bits)
1006 trx16BitRegAccess((RADIO_READ_ACCESS | RADIO_BURST_ACCESS), 0x2F,
1007 (0x00FF & MARC_STATUS1), &marc_sts1, 1);
1009 if((status_bits & marc_sts1) == status_bits)
1021 int radio_get_rssi_val (
void)
1023 uint8_t rssi_regs[2];
1025 trx16BitRegAccess (RADIO_READ_ACCESS, 0x2F, (0xFF & RSSI1), rssi_regs,
1027 if(rssi_regs[1] & RSSI0_RSSI_VALID)
1033 rssi_val = 0xFF - (rssi_regs[0] -1);