RTC auf true

Committer:
kevman
Date:
Wed Mar 13 11:03:24 2019 +0000
Revision:
2:7aab896b1a3b
2019-03-13

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kevman 2:7aab896b1a3b 1 /*
kevman 2:7aab896b1a3b 2 * Copyright (c) 2018 ARM Limited. All rights reserved.
kevman 2:7aab896b1a3b 3 * SPDX-License-Identifier: Apache-2.0
kevman 2:7aab896b1a3b 4 * Licensed under the Apache License, Version 2.0 (the License); you may
kevman 2:7aab896b1a3b 5 * not use this file except in compliance with the License.
kevman 2:7aab896b1a3b 6 * You may obtain a copy of the License at
kevman 2:7aab896b1a3b 7 *
kevman 2:7aab896b1a3b 8 * http://www.apache.org/licenses/LICENSE-2.0
kevman 2:7aab896b1a3b 9 *
kevman 2:7aab896b1a3b 10 * Unless required by applicable law or agreed to in writing, software
kevman 2:7aab896b1a3b 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
kevman 2:7aab896b1a3b 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kevman 2:7aab896b1a3b 13 * See the License for the specific language governing permissions and
kevman 2:7aab896b1a3b 14 * limitations under the License.
kevman 2:7aab896b1a3b 15 */
kevman 2:7aab896b1a3b 16 #include "ns_types.h"
kevman 2:7aab896b1a3b 17 #include "rf_configuration.h"
kevman 2:7aab896b1a3b 18 #include "mbed_trace.h"
kevman 2:7aab896b1a3b 19
kevman 2:7aab896b1a3b 20 #define TRACE_GROUP "rfcf"
kevman 2:7aab896b1a3b 21
kevman 2:7aab896b1a3b 22 // Note that F_XO and F_DIG depends on the used clock frequency
kevman 2:7aab896b1a3b 23 #define F_XO 50000000
kevman 2:7aab896b1a3b 24 #define F_DIG 25000000
kevman 2:7aab896b1a3b 25 // Note that reference divider depends on REFDIV field in XO_RCO_CONF0 register
kevman 2:7aab896b1a3b 26 #define REF_DIVIDER 1
kevman 2:7aab896b1a3b 27 // Note that band selector depends on BS field in SYNT3 register
kevman 2:7aab896b1a3b 28 #define BAND_SELECTOR 4
kevman 2:7aab896b1a3b 29 #define DEF_2EXP33 8589934592
kevman 2:7aab896b1a3b 30 #define DEF_2EXP20 1048576
kevman 2:7aab896b1a3b 31 #define DEF_2EXP19 524288
kevman 2:7aab896b1a3b 32 #define DEF_2EXP16 65536
kevman 2:7aab896b1a3b 33 #define DEF_2EXP15 32768
kevman 2:7aab896b1a3b 34 // Use multiplier for better resolution
kevman 2:7aab896b1a3b 35 #define RESOLUTION_MULTIPLIER 1000000
kevman 2:7aab896b1a3b 36
kevman 2:7aab896b1a3b 37 void rf_conf_calculate_datarate_registers(uint32_t datarate, uint16_t *datarate_mantissa, uint8_t *datarate_exponent)
kevman 2:7aab896b1a3b 38 {
kevman 2:7aab896b1a3b 39 uint64_t datarate_m = (uint64_t)datarate * DEF_2EXP33;
kevman 2:7aab896b1a3b 40 uint8_t datarate_e = 1;
kevman 2:7aab896b1a3b 41 while (datarate_m >= DEF_2EXP16) {
kevman 2:7aab896b1a3b 42 datarate_e++;
kevman 2:7aab896b1a3b 43 uint16_t var_2exp_datarate_e = (uint32_t)2 << (datarate_e - 1);
kevman 2:7aab896b1a3b 44 datarate_m = (uint64_t)datarate * DEF_2EXP33;
kevman 2:7aab896b1a3b 45 datarate_m = datarate_m / ((uint64_t)var_2exp_datarate_e * F_DIG);
kevman 2:7aab896b1a3b 46 datarate_m -= DEF_2EXP16;
kevman 2:7aab896b1a3b 47 }
kevman 2:7aab896b1a3b 48 *datarate_mantissa = datarate_m;
kevman 2:7aab896b1a3b 49 *datarate_exponent = datarate_e;
kevman 2:7aab896b1a3b 50 }
kevman 2:7aab896b1a3b 51
kevman 2:7aab896b1a3b 52 void rf_conf_calculate_base_frequency_registers(uint32_t frequency, uint8_t *synt3, uint8_t *synt2, uint8_t *synt1, uint8_t *synt0)
kevman 2:7aab896b1a3b 53 {
kevman 2:7aab896b1a3b 54 uint64_t freq_tmp = (uint64_t)frequency * RESOLUTION_MULTIPLIER;
kevman 2:7aab896b1a3b 55 freq_tmp = (freq_tmp / (F_XO / ((BAND_SELECTOR / 2) * REF_DIVIDER)));
kevman 2:7aab896b1a3b 56 freq_tmp *= DEF_2EXP20;
kevman 2:7aab896b1a3b 57 freq_tmp /= RESOLUTION_MULTIPLIER;
kevman 2:7aab896b1a3b 58 *synt3 = (uint8_t)(freq_tmp >> 24);
kevman 2:7aab896b1a3b 59 *synt2 = (uint8_t)(freq_tmp >> 16);
kevman 2:7aab896b1a3b 60 *synt1 = (uint8_t)(freq_tmp >> 8);
kevman 2:7aab896b1a3b 61 *synt0 = (uint8_t)freq_tmp;
kevman 2:7aab896b1a3b 62 }
kevman 2:7aab896b1a3b 63
kevman 2:7aab896b1a3b 64 void rf_conf_calculate_deviation_registers(uint32_t deviation, uint8_t *fdev_m, uint8_t *fdev_e)
kevman 2:7aab896b1a3b 65 {
kevman 2:7aab896b1a3b 66 uint64_t fdev_m_tmp = 0xffff;
kevman 2:7aab896b1a3b 67 uint8_t fdev_e_tmp = 1;
kevman 2:7aab896b1a3b 68
kevman 2:7aab896b1a3b 69 while (fdev_m_tmp > 255) {
kevman 2:7aab896b1a3b 70 fdev_e_tmp++;
kevman 2:7aab896b1a3b 71 uint16_t var_2exp_datarate_e_minus_1 = (uint16_t)2 << ((fdev_e_tmp - 1) - 1);
kevman 2:7aab896b1a3b 72 fdev_m_tmp = (uint64_t)deviation * RESOLUTION_MULTIPLIER;
kevman 2:7aab896b1a3b 73 fdev_m_tmp = (((fdev_m_tmp / F_XO) * DEF_2EXP19 * BAND_SELECTOR * REF_DIVIDER * (8 / BAND_SELECTOR)) / var_2exp_datarate_e_minus_1);
kevman 2:7aab896b1a3b 74 fdev_m_tmp += RESOLUTION_MULTIPLIER / 2;
kevman 2:7aab896b1a3b 75 fdev_m_tmp /= RESOLUTION_MULTIPLIER;
kevman 2:7aab896b1a3b 76 fdev_m_tmp -= 256;
kevman 2:7aab896b1a3b 77 }
kevman 2:7aab896b1a3b 78 *fdev_m = (uint8_t)fdev_m_tmp;
kevman 2:7aab896b1a3b 79 *fdev_e = fdev_e_tmp;
kevman 2:7aab896b1a3b 80 }
kevman 2:7aab896b1a3b 81
kevman 2:7aab896b1a3b 82 int rf_conf_calculate_channel_spacing_registers(uint32_t channel_spacing, uint8_t *ch_space)
kevman 2:7aab896b1a3b 83 {
kevman 2:7aab896b1a3b 84 uint64_t ch_space_tmp = (uint64_t)channel_spacing * RESOLUTION_MULTIPLIER;
kevman 2:7aab896b1a3b 85 ch_space_tmp /= F_XO;
kevman 2:7aab896b1a3b 86 ch_space_tmp *= DEF_2EXP15;
kevman 2:7aab896b1a3b 87 ch_space_tmp += RESOLUTION_MULTIPLIER / 2;
kevman 2:7aab896b1a3b 88 ch_space_tmp /= RESOLUTION_MULTIPLIER;
kevman 2:7aab896b1a3b 89 // Check if channel spacing is too high
kevman 2:7aab896b1a3b 90 if (ch_space_tmp > 255) {
kevman 2:7aab896b1a3b 91 return -1;
kevman 2:7aab896b1a3b 92 }
kevman 2:7aab896b1a3b 93 *ch_space = (uint8_t)ch_space_tmp;
kevman 2:7aab896b1a3b 94 return 0;
kevman 2:7aab896b1a3b 95 }
kevman 2:7aab896b1a3b 96
kevman 2:7aab896b1a3b 97 /* Note: This function doesn't necessarily give the optimal RX filter settings.
kevman 2:7aab896b1a3b 98 * When accurate chflt_m and chflt_e settings are needed they must be computed manually.
kevman 2:7aab896b1a3b 99 * Function uses undefined values (900000, 852000, ...)
kevman 2:7aab896b1a3b 100 * to find the chflt_m and chflt_e settings from the RX filter table (see. S2-LP datasheet).
kevman 2:7aab896b1a3b 101 */
kevman 2:7aab896b1a3b 102 void rf_conf_calculate_rx_filter_bandwidth_registers(uint32_t rx_bandwidth, uint8_t *chflt_m, uint8_t *chflt_e)
kevman 2:7aab896b1a3b 103 {
kevman 2:7aab896b1a3b 104 uint8_t chflt_e_tmp = 0;
kevman 2:7aab896b1a3b 105 uint8_t chflt_m_tmp = 0;
kevman 2:7aab896b1a3b 106
kevman 2:7aab896b1a3b 107 while (rx_bandwidth < 900000 / (2 << chflt_e_tmp)) {
kevman 2:7aab896b1a3b 108 chflt_e_tmp++;
kevman 2:7aab896b1a3b 109 }
kevman 2:7aab896b1a3b 110 uint32_t rx_bandwidth_tmp = rx_bandwidth;
kevman 2:7aab896b1a3b 111 if (chflt_e_tmp > 0) {
kevman 2:7aab896b1a3b 112 rx_bandwidth_tmp = rx_bandwidth * (2 << (chflt_e_tmp - 1));
kevman 2:7aab896b1a3b 113 }
kevman 2:7aab896b1a3b 114 if (852000 > rx_bandwidth_tmp) {
kevman 2:7aab896b1a3b 115 chflt_m_tmp++;
kevman 2:7aab896b1a3b 116 }
kevman 2:7aab896b1a3b 117 if (806000 > rx_bandwidth_tmp) {
kevman 2:7aab896b1a3b 118 chflt_m_tmp++;
kevman 2:7aab896b1a3b 119 }
kevman 2:7aab896b1a3b 120 if (760000 > rx_bandwidth_tmp) {
kevman 2:7aab896b1a3b 121 chflt_m_tmp++;
kevman 2:7aab896b1a3b 122 }
kevman 2:7aab896b1a3b 123 if (724000 > rx_bandwidth_tmp) {
kevman 2:7aab896b1a3b 124 chflt_m_tmp++;
kevman 2:7aab896b1a3b 125 }
kevman 2:7aab896b1a3b 126 if (682000 > rx_bandwidth_tmp) {
kevman 2:7aab896b1a3b 127 chflt_m_tmp++;
kevman 2:7aab896b1a3b 128 }
kevman 2:7aab896b1a3b 129 if (650000 > rx_bandwidth_tmp) {
kevman 2:7aab896b1a3b 130 chflt_m_tmp++;
kevman 2:7aab896b1a3b 131 }
kevman 2:7aab896b1a3b 132 if (588000 > rx_bandwidth_tmp) {
kevman 2:7aab896b1a3b 133 chflt_m_tmp++;
kevman 2:7aab896b1a3b 134 }
kevman 2:7aab896b1a3b 135 if (542000 > rx_bandwidth_tmp) {
kevman 2:7aab896b1a3b 136 chflt_m_tmp++;
kevman 2:7aab896b1a3b 137 }
kevman 2:7aab896b1a3b 138 *chflt_m = chflt_m_tmp;
kevman 2:7aab896b1a3b 139 *chflt_e = chflt_e_tmp;
kevman 2:7aab896b1a3b 140 }
kevman 2:7aab896b1a3b 141
kevman 2:7aab896b1a3b 142 void rf_conf_calculate_rssi_threshold_registers(int16_t rssi_threshold, uint8_t *rssi_th)
kevman 2:7aab896b1a3b 143 {
kevman 2:7aab896b1a3b 144 *rssi_th = rssi_threshold + RSSI_OFFSET;
kevman 2:7aab896b1a3b 145 }