ISM RF transmitter library for MAX4146X family devices

Library for MAX41460, MAX41461, MAX41462, MAX41463, MAX41464 RF Transmitter ICs.

Committer:
Ibrahim Tilki
Date:
Thu Jan 13 13:27:54 2022 +0300
Revision:
2:80969d8f6d2b
Parent:
1:ccf0e1d28860
change crystal freq range, remove unused block from send_data

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Erman Komurcu 0:4040347d719c 1 /*******************************************************************************
Erman Komurcu 1:ccf0e1d28860 2 * Copyright (C) 2019 Maxim Integrated Products, Inc., All rights Reserved.
Erman Komurcu 1:ccf0e1d28860 3 *
Erman Komurcu 1:ccf0e1d28860 4 * This software is protected by copyright laws of the United States and
Erman Komurcu 1:ccf0e1d28860 5 * of foreign countries. This material may also be protected by patent laws
Erman Komurcu 1:ccf0e1d28860 6 * and technology transfer regulations of the United States and of foreign
Erman Komurcu 1:ccf0e1d28860 7 * countries. This software is furnished under a license agreement and/or a
Erman Komurcu 1:ccf0e1d28860 8 * nondisclosure agreement and may only be used or reproduced in accordance
Erman Komurcu 1:ccf0e1d28860 9 * with the terms of those agreements. Dissemination of this information to
Erman Komurcu 1:ccf0e1d28860 10 * any party or parties not specified in the license agreement and/or
Erman Komurcu 1:ccf0e1d28860 11 * nondisclosure agreement is expressly prohibited.
Erman Komurcu 1:ccf0e1d28860 12 *
Erman Komurcu 1:ccf0e1d28860 13 * The above copyright notice and this permission notice shall be included
Erman Komurcu 1:ccf0e1d28860 14 * in all copies or substantial portions of the Software.
Erman Komurcu 1:ccf0e1d28860 15 *
Erman Komurcu 1:ccf0e1d28860 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
Erman Komurcu 1:ccf0e1d28860 17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Erman Komurcu 1:ccf0e1d28860 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
Erman Komurcu 1:ccf0e1d28860 19 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
Erman Komurcu 1:ccf0e1d28860 20 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
Erman Komurcu 1:ccf0e1d28860 21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
Erman Komurcu 1:ccf0e1d28860 22 * OTHER DEALINGS IN THE SOFTWARE.
Erman Komurcu 1:ccf0e1d28860 23 *
Erman Komurcu 1:ccf0e1d28860 24 * Except as contained in this notice, the name of Maxim Integrated
Erman Komurcu 1:ccf0e1d28860 25 * Products, Inc. shall not be used except as stated in the Maxim Integrated
Erman Komurcu 1:ccf0e1d28860 26 * Products, Inc. Branding Policy.
Erman Komurcu 1:ccf0e1d28860 27 *
Erman Komurcu 1:ccf0e1d28860 28 * The mere transfer of this software does not imply any licenses
Erman Komurcu 1:ccf0e1d28860 29 * of trade secrets, proprietary technology, copyrights, patents,
Erman Komurcu 1:ccf0e1d28860 30 * trademarks, maskwork rights, or any other form of intellectual
Erman Komurcu 1:ccf0e1d28860 31 * property whatsoever. Maxim Integrated Products, Inc. retains all
Erman Komurcu 1:ccf0e1d28860 32 * ownership rights.
Erman Komurcu 1:ccf0e1d28860 33 *******************************************************************************
Erman Komurcu 1:ccf0e1d28860 34 */
Erman Komurcu 0:4040347d719c 35
Erman Komurcu 0:4040347d719c 36 #include "Max4146x.h"
Erman Komurcu 0:4040347d719c 37 #include <iostream>
Erman Komurcu 0:4040347d719c 38
Erman Komurcu 0:4040347d719c 39 using namespace std;
Erman Komurcu 0:4040347d719c 40
Erman Komurcu 0:4040347d719c 41 const uint8_t default_register_value_0[17] = {0x90, 0x81, 0x03, 0x00, 0x00, 0x04, 0x80, 0x80, 0x60, 0x00,
Erman Komurcu 0:4040347d719c 42 0x00, 0xC4, 0xDE, 0x98, 0x28, 0x04, 0x02};
Erman Komurcu 0:4040347d719c 43 const uint8_t default_register_value_1[20] = {0x90, 0x81, 0x03, 0x00, 0x00, 0x04, 0x80, 0x80, 0x60, 0x00,
Erman Komurcu 0:4040347d719c 44 0x00, 0xC4, 0xDE, 0x98, 0x28, 0x04, 0x04, 0x00, 0xFF, 0x00};
Erman Komurcu 0:4040347d719c 45
Erman Komurcu 0:4040347d719c 46 template <class REG>
Erman Komurcu 0:4040347d719c 47 MAX4146X<REG>::MAX4146X(REG *reg, SPI *spi, DigitalOut *cs)
Erman Komurcu 0:4040347d719c 48 {
Erman Komurcu 0:4040347d719c 49 operation_mode = UNINITIALIZED;
Erman Komurcu 0:4040347d719c 50
Erman Komurcu 0:4040347d719c 51 if (reg == NULL) {
Erman Komurcu 0:4040347d719c 52 return;
Erman Komurcu 0:4040347d719c 53 }
Erman Komurcu 0:4040347d719c 54
Erman Komurcu 0:4040347d719c 55 if (cs == NULL) {
Erman Komurcu 0:4040347d719c 56 return;
Erman Komurcu 0:4040347d719c 57 }
Erman Komurcu 0:4040347d719c 58
Erman Komurcu 0:4040347d719c 59 this->reg = reg;
Erman Komurcu 0:4040347d719c 60 ssel = cs;
Erman Komurcu 0:4040347d719c 61
Erman Komurcu 0:4040347d719c 62 if (spi == NULL) {
Erman Komurcu 0:4040347d719c 63 return;
Erman Komurcu 0:4040347d719c 64 }
Erman Komurcu 0:4040347d719c 65
Erman Komurcu 0:4040347d719c 66 spi_handler = spi;
Erman Komurcu 0:4040347d719c 67 i2c_handler = NULL;
Erman Komurcu 0:4040347d719c 68 preset_mode = 0;
Erman Komurcu 0:4040347d719c 69
Erman Komurcu 0:4040347d719c 70 if (initial_programming() < 0) {
Erman Komurcu 0:4040347d719c 71 return;
Erman Komurcu 0:4040347d719c 72 }
Erman Komurcu 0:4040347d719c 73
Erman Komurcu 0:4040347d719c 74 this->crystal_frequency = 16.0;
Erman Komurcu 0:4040347d719c 75 this->center_frequency = 315.0;
Erman Komurcu 0:4040347d719c 76 this->baud_rate = 5000.0; //5 kHz
Erman Komurcu 0:4040347d719c 77
Erman Komurcu 0:4040347d719c 78 operation_mode = INITIALIZED;
Erman Komurcu 0:4040347d719c 79 }
Erman Komurcu 0:4040347d719c 80
Erman Komurcu 0:4040347d719c 81 template <class REG>
Erman Komurcu 0:4040347d719c 82 MAX4146X<REG>::MAX4146X(REG *reg, SPI *spi)
Erman Komurcu 0:4040347d719c 83 {
Erman Komurcu 0:4040347d719c 84 operation_mode = UNINITIALIZED;
Erman Komurcu 0:4040347d719c 85
Erman Komurcu 0:4040347d719c 86 if (reg == NULL) {
Erman Komurcu 0:4040347d719c 87 return;
Erman Komurcu 0:4040347d719c 88 }
Erman Komurcu 0:4040347d719c 89
Erman Komurcu 0:4040347d719c 90 this->reg = reg;
Erman Komurcu 0:4040347d719c 91
Erman Komurcu 0:4040347d719c 92 if (spi == NULL) {
Erman Komurcu 0:4040347d719c 93 return;
Erman Komurcu 0:4040347d719c 94 }
Erman Komurcu 0:4040347d719c 95
Erman Komurcu 0:4040347d719c 96 spi_handler = spi;
Erman Komurcu 0:4040347d719c 97 i2c_handler = NULL;
Erman Komurcu 0:4040347d719c 98 ssel = NULL;
Erman Komurcu 0:4040347d719c 99 preset_mode = 0;
Erman Komurcu 0:4040347d719c 100
Erman Komurcu 0:4040347d719c 101 if (initial_programming() < 0) {
Erman Komurcu 0:4040347d719c 102 return;
Erman Komurcu 0:4040347d719c 103 }
Erman Komurcu 0:4040347d719c 104
Erman Komurcu 0:4040347d719c 105 this->crystal_frequency = 16.0;
Erman Komurcu 0:4040347d719c 106 this->center_frequency = 315.0;
Erman Komurcu 0:4040347d719c 107 this->baud_rate = 5000.0; //5 kHz
Erman Komurcu 0:4040347d719c 108
Erman Komurcu 0:4040347d719c 109 operation_mode = INITIALIZED;
Erman Komurcu 0:4040347d719c 110 }
Erman Komurcu 0:4040347d719c 111
Erman Komurcu 0:4040347d719c 112 template <class REG>
Erman Komurcu 0:4040347d719c 113 MAX4146X<REG>::MAX4146X(REG *reg, I2C *i2c)
Erman Komurcu 0:4040347d719c 114 {
Erman Komurcu 0:4040347d719c 115 operation_mode = UNINITIALIZED;
Erman Komurcu 0:4040347d719c 116
Erman Komurcu 0:4040347d719c 117 if (reg == NULL) {
Erman Komurcu 0:4040347d719c 118 return;
Erman Komurcu 0:4040347d719c 119 }
Erman Komurcu 0:4040347d719c 120
Erman Komurcu 0:4040347d719c 121 this->reg = reg;
Erman Komurcu 0:4040347d719c 122
Erman Komurcu 0:4040347d719c 123 if (i2c == NULL) {
Erman Komurcu 0:4040347d719c 124 return;
Erman Komurcu 0:4040347d719c 125 }
Erman Komurcu 0:4040347d719c 126
Erman Komurcu 0:4040347d719c 127 i2c_handler = i2c;
Erman Komurcu 0:4040347d719c 128 spi_handler = NULL;
Erman Komurcu 0:4040347d719c 129 ssel = NULL;
Erman Komurcu 0:4040347d719c 130 preset_mode = 0;
Erman Komurcu 0:4040347d719c 131
Erman Komurcu 0:4040347d719c 132 if (initial_programming() < 0) {
Erman Komurcu 0:4040347d719c 133 return;
Erman Komurcu 0:4040347d719c 134 }
Erman Komurcu 0:4040347d719c 135
Erman Komurcu 0:4040347d719c 136 this->crystal_frequency = 16.0;
Erman Komurcu 0:4040347d719c 137 this->center_frequency = 315.0;
Erman Komurcu 0:4040347d719c 138 this->baud_rate = 5000.0; //5 kHz
Erman Komurcu 0:4040347d719c 139
Erman Komurcu 0:4040347d719c 140 operation_mode = INITIALIZED;
Erman Komurcu 0:4040347d719c 141 }
Erman Komurcu 0:4040347d719c 142
Erman Komurcu 0:4040347d719c 143 template <class REG>
Erman Komurcu 0:4040347d719c 144 MAX4146X<REG>::MAX4146X(DigitalOut *cs)
Erman Komurcu 0:4040347d719c 145 {
Erman Komurcu 0:4040347d719c 146 operation_mode = UNINITIALIZED;
Erman Komurcu 0:4040347d719c 147
Erman Komurcu 0:4040347d719c 148 if (cs == NULL) {
Erman Komurcu 0:4040347d719c 149 return;
Erman Komurcu 0:4040347d719c 150 }
Erman Komurcu 0:4040347d719c 151
Erman Komurcu 0:4040347d719c 152 data_sent = cs;
Erman Komurcu 0:4040347d719c 153
Erman Komurcu 0:4040347d719c 154 data_rate = 5;
Erman Komurcu 0:4040347d719c 155
Erman Komurcu 0:4040347d719c 156 this->reg = NULL;
Erman Komurcu 0:4040347d719c 157 this->ssel = NULL;
Erman Komurcu 0:4040347d719c 158 spi_handler = NULL;
Erman Komurcu 0:4040347d719c 159 i2c_handler = NULL;
Erman Komurcu 0:4040347d719c 160 preset_mode = 1;
Erman Komurcu 0:4040347d719c 161
Erman Komurcu 0:4040347d719c 162 operation_mode = INITIALIZED;
Erman Komurcu 0:4040347d719c 163 }
Erman Komurcu 0:4040347d719c 164
Erman Komurcu 0:4040347d719c 165 template <>
Erman Komurcu 0:4040347d719c 166 int MAX4146X<max41460_reg_map_t>::read_register(uint8_t reg, uint8_t *value, uint8_t len)
Erman Komurcu 0:4040347d719c 167 {
Erman Komurcu 0:4040347d719c 168 int rtn_val = -1;
Erman Komurcu 0:4040347d719c 169
Erman Komurcu 0:4040347d719c 170 if (value == NULL) {
Erman Komurcu 0:4040347d719c 171 return -1;
Erman Komurcu 0:4040347d719c 172 }
Erman Komurcu 0:4040347d719c 173
Erman Komurcu 0:4040347d719c 174 if (this->reg == NULL) {
Erman Komurcu 0:4040347d719c 175 return -1;
Erman Komurcu 0:4040347d719c 176 }
Erman Komurcu 0:4040347d719c 177
Erman Komurcu 0:4040347d719c 178 if (ssel != NULL) {
Erman Komurcu 0:4040347d719c 179 *ssel = 0;
Erman Komurcu 0:4040347d719c 180 }
Erman Komurcu 0:4040347d719c 181 spi_handler->write((uint8_t)0x80 | reg);
Erman Komurcu 0:4040347d719c 182 for (uint8_t i = 0; i < len; i++) {
Erman Komurcu 0:4040347d719c 183 *(value++) = spi_handler->write(0x00); // read back data bytes
Erman Komurcu 0:4040347d719c 184 }
Erman Komurcu 0:4040347d719c 185 if (ssel != NULL) {
Erman Komurcu 0:4040347d719c 186 *ssel = 1;
Erman Komurcu 0:4040347d719c 187 }
Erman Komurcu 0:4040347d719c 188 return 0;
Erman Komurcu 0:4040347d719c 189 }
Erman Komurcu 0:4040347d719c 190
Erman Komurcu 0:4040347d719c 191 template <class REG>
Erman Komurcu 0:4040347d719c 192 int MAX4146X<REG>::read_register(uint8_t reg, uint8_t *value, uint8_t len)
Erman Komurcu 0:4040347d719c 193 {
Erman Komurcu 0:4040347d719c 194 int rtn_val = -1;
Erman Komurcu 0:4040347d719c 195
Erman Komurcu 0:4040347d719c 196 if (value == NULL) {
Erman Komurcu 0:4040347d719c 197 return -1;
Erman Komurcu 0:4040347d719c 198 }
Erman Komurcu 0:4040347d719c 199
Erman Komurcu 0:4040347d719c 200 if (this->reg == NULL) {
Erman Komurcu 0:4040347d719c 201 return -1;
Erman Komurcu 0:4040347d719c 202 }
Erman Komurcu 0:4040347d719c 203
Erman Komurcu 0:4040347d719c 204 rtn_val = i2c_handler->write(I2C_ADDRESS, (const char *)&reg, 1, true);
Erman Komurcu 0:4040347d719c 205 if (rtn_val != 0) {
Erman Komurcu 0:4040347d719c 206 return -1;
Erman Komurcu 0:4040347d719c 207 }
Erman Komurcu 0:4040347d719c 208
Erman Komurcu 0:4040347d719c 209 rtn_val = i2c_handler->read(I2C_ADDRESS, (char *) value, len, false);
Erman Komurcu 0:4040347d719c 210 if (rtn_val < 0) {
Erman Komurcu 0:4040347d719c 211 return rtn_val;
Erman Komurcu 0:4040347d719c 212 }
Erman Komurcu 0:4040347d719c 213
Erman Komurcu 0:4040347d719c 214 return 0;
Erman Komurcu 0:4040347d719c 215 }
Erman Komurcu 0:4040347d719c 216
Erman Komurcu 0:4040347d719c 217 template <>
Erman Komurcu 0:4040347d719c 218 int MAX4146X<max41460_reg_map_t>::write_register(uint8_t reg, const uint8_t *value, uint8_t len)
Erman Komurcu 0:4040347d719c 219 {
Erman Komurcu 0:4040347d719c 220 int rtn_val = -1;
Erman Komurcu 0:4040347d719c 221 uint8_t local_data[1 + len];
Erman Komurcu 0:4040347d719c 222
Erman Komurcu 0:4040347d719c 223 if (value == NULL) {
Erman Komurcu 0:4040347d719c 224 return -1;
Erman Komurcu 0:4040347d719c 225 }
Erman Komurcu 0:4040347d719c 226
Erman Komurcu 0:4040347d719c 227 memcpy(&local_data[0], value, len);
Erman Komurcu 0:4040347d719c 228
Erman Komurcu 0:4040347d719c 229 rtn_val = spi_handler->write(0x7F & reg); // write mode and adress send
Erman Komurcu 0:4040347d719c 230 for (int i = 0; i < len; i++) {
Erman Komurcu 0:4040347d719c 231 rtn_val = spi_handler->write(local_data[i]); // write adress
Erman Komurcu 0:4040347d719c 232 }
Erman Komurcu 0:4040347d719c 233 if (rtn_val != 0) {
Erman Komurcu 0:4040347d719c 234 return rtn_val;
Erman Komurcu 0:4040347d719c 235 }
Erman Komurcu 0:4040347d719c 236
Erman Komurcu 0:4040347d719c 237 return 0;
Erman Komurcu 0:4040347d719c 238 }
Erman Komurcu 0:4040347d719c 239
Erman Komurcu 0:4040347d719c 240 template <class REG>
Erman Komurcu 0:4040347d719c 241 int MAX4146X<REG>::write_register(uint8_t reg, const uint8_t *value, uint8_t len)
Erman Komurcu 0:4040347d719c 242 {
Erman Komurcu 0:4040347d719c 243 int rtn_val = -1;
Erman Komurcu 0:4040347d719c 244 uint8_t local_data[1 + len];
Erman Komurcu 0:4040347d719c 245
Erman Komurcu 0:4040347d719c 246 if (value == NULL) {
Erman Komurcu 0:4040347d719c 247 return -1;
Erman Komurcu 0:4040347d719c 248 }
Erman Komurcu 0:4040347d719c 249
Erman Komurcu 0:4040347d719c 250 local_data[0] = reg;
Erman Komurcu 0:4040347d719c 251
Erman Komurcu 0:4040347d719c 252 memcpy(&local_data[1], value, len);
Erman Komurcu 0:4040347d719c 253
Erman Komurcu 0:4040347d719c 254 rtn_val = i2c_handler->write(I2C_ADDRESS, (const char *)local_data,
Erman Komurcu 0:4040347d719c 255 sizeof(local_data));
Erman Komurcu 0:4040347d719c 256 if (rtn_val != 0) {
Erman Komurcu 0:4040347d719c 257 return -1;
Erman Komurcu 0:4040347d719c 258 }
Erman Komurcu 0:4040347d719c 259
Erman Komurcu 0:4040347d719c 260 return 0;
Erman Komurcu 0:4040347d719c 261 }
Erman Komurcu 0:4040347d719c 262
Erman Komurcu 0:4040347d719c 263 #define SET_BIT_FIELD(address, reg_name, bit_field_name, value) \
Erman Komurcu 0:4040347d719c 264 int ret; \
Erman Komurcu 0:4040347d719c 265 ret = read_register(address, (uint8_t *)&(reg_name), 1); \
Erman Komurcu 0:4040347d719c 266 if (ret) { \
Erman Komurcu 0:4040347d719c 267 return ret; \
Erman Komurcu 0:4040347d719c 268 } \
Erman Komurcu 0:4040347d719c 269 bit_field_name = value; \
Erman Komurcu 0:4040347d719c 270 ret = write_register(address, (uint8_t *)&(reg_name), 1); \
Erman Komurcu 0:4040347d719c 271 if (ret) { \
Erman Komurcu 0:4040347d719c 272 return ret; \
Erman Komurcu 0:4040347d719c 273 }
Erman Komurcu 0:4040347d719c 274
Erman Komurcu 0:4040347d719c 275 template <class REG>
Erman Komurcu 0:4040347d719c 276 int MAX4146X<REG>::set_crystal_frequency(float freq)
Erman Komurcu 0:4040347d719c 277 {
Ibrahim Tilki 2:80969d8f6d2b 278 if (freq < 12.7 || freq > 19.3) {
Erman Komurcu 0:4040347d719c 279 return -1;
Erman Komurcu 0:4040347d719c 280 }
Erman Komurcu 0:4040347d719c 281 this->crystal_frequency = freq;
Erman Komurcu 0:4040347d719c 282
Erman Komurcu 0:4040347d719c 283 return 0;
Erman Komurcu 0:4040347d719c 284 }
Erman Komurcu 0:4040347d719c 285
Erman Komurcu 0:4040347d719c 286 template <class REG>
Erman Komurcu 0:4040347d719c 287 float MAX4146X<REG>::get_crystal_frequency()
Erman Komurcu 0:4040347d719c 288 {
Erman Komurcu 0:4040347d719c 289 return this->crystal_frequency;
Erman Komurcu 0:4040347d719c 290 }
Erman Komurcu 0:4040347d719c 291
Erman Komurcu 0:4040347d719c 292 template <class REG>
Erman Komurcu 0:4040347d719c 293 int MAX4146X<REG>::set_center_frequency(float freq)
Erman Komurcu 0:4040347d719c 294 {
Erman Komurcu 0:4040347d719c 295 if (freq < 250 || freq > 950) {
Erman Komurcu 0:4040347d719c 296 return -1;
Erman Komurcu 0:4040347d719c 297 }
Erman Komurcu 0:4040347d719c 298
Erman Komurcu 0:4040347d719c 299 this->center_frequency = freq;
Erman Komurcu 0:4040347d719c 300
Erman Komurcu 0:4040347d719c 301 uint32_t value = (uint32_t)((65536 * freq) / this->crystal_frequency); //65536 is constant defined in the datasheet
Erman Komurcu 0:4040347d719c 302
Erman Komurcu 0:4040347d719c 303 return this->set_frequency(value);
Erman Komurcu 0:4040347d719c 304 }
Erman Komurcu 0:4040347d719c 305
Erman Komurcu 0:4040347d719c 306 template <class REG>
Erman Komurcu 0:4040347d719c 307 float MAX4146X<REG>::get_center_frequency()
Erman Komurcu 0:4040347d719c 308 {
Erman Komurcu 0:4040347d719c 309 return this->center_frequency;
Erman Komurcu 0:4040347d719c 310 }
Erman Komurcu 0:4040347d719c 311
Erman Komurcu 0:4040347d719c 312 template <class REG>
Erman Komurcu 0:4040347d719c 313 int MAX4146X<REG>::adjust_baudrate(float rate)
Erman Komurcu 0:4040347d719c 314 {
Erman Komurcu 0:4040347d719c 315 if (rate < 195.3 || rate > 200000.0) {
Erman Komurcu 0:4040347d719c 316 return -1;
Erman Komurcu 0:4040347d719c 317 }
Erman Komurcu 0:4040347d719c 318
Erman Komurcu 0:4040347d719c 319 if (this->preset_mode == 1) {
Erman Komurcu 0:4040347d719c 320 this->baud_rate = rate;
Erman Komurcu 0:4040347d719c 321 }
Erman Komurcu 0:4040347d719c 322
Erman Komurcu 0:4040347d719c 323 int error = 0;
Erman Komurcu 0:4040347d719c 324 uint8_t prediv = 3;
Erman Komurcu 0:4040347d719c 325
Erman Komurcu 0:4040347d719c 326 if (rate < 12500.0) {
Erman Komurcu 0:4040347d719c 327 error = this->set_bclk_postdiv(this->BCLK_POSTDIV_BY_5);
Erman Komurcu 0:4040347d719c 328 prediv = (uint8_t)((50000.0 / rate) - 1);
Erman Komurcu 0:4040347d719c 329 } else if (rate < 25000.0) {
Erman Komurcu 0:4040347d719c 330 error = this->set_bclk_postdiv(this->BCLK_POSTDIV_BY_4);
Erman Komurcu 0:4040347d719c 331 prediv = (uint8_t)((100000.0 / rate) - 1);
Erman Komurcu 0:4040347d719c 332 } else if (rate < 50000.0) {
Erman Komurcu 0:4040347d719c 333 error = this->set_bclk_postdiv(this->BCLK_POSTDIV_BY_3);
Erman Komurcu 0:4040347d719c 334 prediv = (uint8_t)((200000.0 / rate) - 1);
Erman Komurcu 0:4040347d719c 335 } else if (rate < 100000.0) {
Erman Komurcu 0:4040347d719c 336 error = this->set_bclk_postdiv(this->BCLK_POSTDIV_BY_2);
Erman Komurcu 0:4040347d719c 337 prediv = (uint8_t)((400000.0 / rate) - 1);
Erman Komurcu 0:4040347d719c 338 } else {
Erman Komurcu 0:4040347d719c 339 error = this->set_bclk_postdiv(this->BCLK_POSTDIV_BY_1);
Erman Komurcu 0:4040347d719c 340 prediv = (uint8_t)((800000.0 / rate) - 1);
Erman Komurcu 0:4040347d719c 341 }
Erman Komurcu 0:4040347d719c 342
Erman Komurcu 0:4040347d719c 343 if (error < 0) {
Erman Komurcu 0:4040347d719c 344 return -1;
Erman Komurcu 0:4040347d719c 345 }
Erman Komurcu 0:4040347d719c 346
Erman Komurcu 0:4040347d719c 347 return this->set_bclk_prediv(prediv);
Erman Komurcu 0:4040347d719c 348 }
Erman Komurcu 0:4040347d719c 349
Erman Komurcu 0:4040347d719c 350 template <class REG>
Erman Komurcu 0:4040347d719c 351 float MAX4146X<REG>::get_baudrate()
Erman Komurcu 0:4040347d719c 352 {
Erman Komurcu 0:4040347d719c 353 return this->baud_rate;
Erman Komurcu 0:4040347d719c 354 }
Erman Komurcu 0:4040347d719c 355
Erman Komurcu 0:4040347d719c 356 template <class REG>
Erman Komurcu 0:4040347d719c 357 int MAX4146X<REG>::adjust_frequency_deviation(float deviation)
Erman Komurcu 0:4040347d719c 358 {
Erman Komurcu 0:4040347d719c 359 uint8_t dev = 0;
Erman Komurcu 0:4040347d719c 360
Erman Komurcu 0:4040347d719c 361 if (this->read_register(CFG1_ADDR, (uint8_t *) & (this->reg->reg_cfg1), 1) < 0) {
Erman Komurcu 0:4040347d719c 362 return -1;
Erman Komurcu 0:4040347d719c 363 }
Erman Komurcu 0:4040347d719c 364
Erman Komurcu 0:4040347d719c 365 if (this->reg->reg_cfg1.bits.fskshape == 0) {
Erman Komurcu 0:4040347d719c 366 dev = (uint8_t)(deviation * 8.192 / crystal_frequency);
Erman Komurcu 0:4040347d719c 367 if (dev < 127) {
Erman Komurcu 0:4040347d719c 368 return this->set_deltaf(dev);
Erman Komurcu 0:4040347d719c 369 }
Erman Komurcu 0:4040347d719c 370 } else {
Erman Komurcu 0:4040347d719c 371 dev = (uint8_t)(deviation * 81.92 / crystal_frequency); // crystal_frequency in MHz form
Erman Komurcu 0:4040347d719c 372 if (dev < 15) {
Erman Komurcu 0:4040347d719c 373 return this->set_deltaf_shape(dev);
Erman Komurcu 0:4040347d719c 374 }
Erman Komurcu 0:4040347d719c 375 }
Erman Komurcu 0:4040347d719c 376
Erman Komurcu 0:4040347d719c 377 return -1;
Erman Komurcu 0:4040347d719c 378 }
Erman Komurcu 0:4040347d719c 379
Erman Komurcu 0:4040347d719c 380 template <class REG>
Erman Komurcu 0:4040347d719c 381 int MAX4146X<REG>::adjust_manchester_bitrate(char rate)
Erman Komurcu 0:4040347d719c 382 {
Erman Komurcu 0:4040347d719c 383 this->data_rate = rate;
Erman Komurcu 0:4040347d719c 384
Erman Komurcu 0:4040347d719c 385 return 0;
Erman Komurcu 0:4040347d719c 386 }
Erman Komurcu 0:4040347d719c 387
Erman Komurcu 0:4040347d719c 388 template <class REG>
Erman Komurcu 0:4040347d719c 389 char MAX4146X<REG>::get_manchester_bitrate()
Erman Komurcu 0:4040347d719c 390 {
Erman Komurcu 0:4040347d719c 391 return this->data_rate;
Erman Komurcu 0:4040347d719c 392 }
Erman Komurcu 0:4040347d719c 393
Erman Komurcu 0:4040347d719c 394 template <>
Erman Komurcu 0:4040347d719c 395 int MAX4146X<max41460_reg_map_t>::send_data(uint8_t *data, uint32_t length)
Erman Komurcu 0:4040347d719c 396 {
Erman Komurcu 0:4040347d719c 397 if (this->preset_mode == 0) {
Erman Komurcu 0:4040347d719c 398
Erman Komurcu 0:4040347d719c 399 if (ssel != NULL) {
Erman Komurcu 0:4040347d719c 400 *ssel = 0;
Erman Komurcu 0:4040347d719c 401 }
Erman Komurcu 0:4040347d719c 402
Erman Komurcu 0:4040347d719c 403 spi_handler->write(0x7F & 0x0A); /*write mode and adress send*/
Erman Komurcu 0:4040347d719c 404
Erman Komurcu 0:4040347d719c 405 spi_handler->write(0x01); /*write data SPI_EN1 clear*/
Erman Komurcu 0:4040347d719c 406
Erman Komurcu 0:4040347d719c 407
Erman Komurcu 0:4040347d719c 408 if (ssel != NULL) {
Erman Komurcu 0:4040347d719c 409 *ssel = 1;
Erman Komurcu 0:4040347d719c 410 }
Erman Komurcu 0:4040347d719c 411
Erman Komurcu 0:4040347d719c 412 wait_us(300); /* for waiting another SPI operation*/
Erman Komurcu 0:4040347d719c 413
Erman Komurcu 0:4040347d719c 414 if (ssel != NULL) {
Erman Komurcu 0:4040347d719c 415 *ssel = 0;
Erman Komurcu 0:4040347d719c 416 }
Erman Komurcu 0:4040347d719c 417
Erman Komurcu 0:4040347d719c 418 spi_handler->write(0x7F & 0x10); /*write mode and adress send*/
Erman Komurcu 0:4040347d719c 419
Erman Komurcu 0:4040347d719c 420 spi_handler->write(0x03); /*write data SPI_EN2 set*/
Erman Komurcu 0:4040347d719c 421
Erman Komurcu 0:4040347d719c 422 if (ssel != NULL) {
Erman Komurcu 0:4040347d719c 423 *ssel = 0;
Erman Komurcu 0:4040347d719c 424 }
Erman Komurcu 0:4040347d719c 425
Erman Komurcu 0:4040347d719c 426 wait_us(300); /* for waiting another SPI operation*/
Erman Komurcu 0:4040347d719c 427
Erman Komurcu 0:4040347d719c 428 }
Erman Komurcu 0:4040347d719c 429
Erman Komurcu 0:4040347d719c 430 return this->io_write(data, length);
Erman Komurcu 0:4040347d719c 431 }
Erman Komurcu 0:4040347d719c 432
Erman Komurcu 0:4040347d719c 433 template <class REG>
Erman Komurcu 0:4040347d719c 434 int MAX4146X<REG>::send_data(uint8_t *data, uint32_t length)
Erman Komurcu 0:4040347d719c 435 {
Erman Komurcu 0:4040347d719c 436 if (this->preset_mode == 0) {
Erman Komurcu 0:4040347d719c 437 if (length > 32767) {
Erman Komurcu 0:4040347d719c 438 return -100;
Erman Komurcu 0:4040347d719c 439 }
Erman Komurcu 0:4040347d719c 440
Erman Komurcu 0:4040347d719c 441 this->adjust_baudrate(this->baud_rate);
Erman Komurcu 0:4040347d719c 442
Erman Komurcu 0:4040347d719c 443 // this->set_i2c_txen1(I2C_TXEN1_DISABLE);
Erman Komurcu 0:4040347d719c 444
Erman Komurcu 0:4040347d719c 445 uint8_t local_data[4+length];
Erman Komurcu 0:4040347d719c 446
Erman Komurcu 0:4040347d719c 447 local_data[0] = CFG7_ADDR;
Erman Komurcu 0:4040347d719c 448 local_data[1] = 0x04;
Erman Komurcu 0:4040347d719c 449 local_data[2] = (uint8_t)((length >> 8) | 0x80);
Erman Komurcu 0:4040347d719c 450 local_data[3] = (uint8_t)((length) & 0x0FF);
Erman Komurcu 0:4040347d719c 451
Erman Komurcu 0:4040347d719c 452 memcpy(&local_data[4], data, length);
Erman Komurcu 0:4040347d719c 453
Erman Komurcu 0:4040347d719c 454 i2c_handler->write(I2C_ADDRESS, (const char *)local_data, sizeof(local_data), false);
Erman Komurcu 0:4040347d719c 455
Erman Komurcu 0:4040347d719c 456 } else {
Erman Komurcu 0:4040347d719c 457 this->io_write(data, length);
Erman Komurcu 0:4040347d719c 458 }
Erman Komurcu 0:4040347d719c 459
Erman Komurcu 0:4040347d719c 460 return 0;
Erman Komurcu 0:4040347d719c 461 }
Erman Komurcu 0:4040347d719c 462
Erman Komurcu 0:4040347d719c 463 template <class REG>
Erman Komurcu 0:4040347d719c 464 int MAX4146X<REG>::io_write(uint8_t *data, uint32_t length)
Erman Komurcu 0:4040347d719c 465 {
Erman Komurcu 0:4040347d719c 466 //manchester array
Erman Komurcu 0:4040347d719c 467 manchester_bit_array = new unsigned char[length * 2 * 8];
Erman Komurcu 0:4040347d719c 468
Erman Komurcu 0:4040347d719c 469 //bit array
Erman Komurcu 0:4040347d719c 470 bits_array = new unsigned char[length * 8];
Erman Komurcu 0:4040347d719c 471
Erman Komurcu 0:4040347d719c 472 //byte to bit conversion
Erman Komurcu 0:4040347d719c 473 for (int i = 0; i < length; i++) {
Erman Komurcu 0:4040347d719c 474 for (int j = 0; j < 8; j++) {
Erman Komurcu 0:4040347d719c 475 // Mask each bit in the byte and store it
Erman Komurcu 0:4040347d719c 476 if (data[i] & (mask << j)) {
Erman Komurcu 0:4040347d719c 477 bits_array[i * 8 + j] = 1;
Erman Komurcu 0:4040347d719c 478 } else {
Erman Komurcu 0:4040347d719c 479 bits_array[i * 8 + j] = 0;
Erman Komurcu 0:4040347d719c 480 }
Erman Komurcu 0:4040347d719c 481 }
Erman Komurcu 0:4040347d719c 482 }
Erman Komurcu 0:4040347d719c 483
Erman Komurcu 0:4040347d719c 484 //manchester encode
Erman Komurcu 0:4040347d719c 485 for (int i = 0; i < length * 8; i++) {
Erman Komurcu 0:4040347d719c 486 if (bits_array[i] == 0) {
Erman Komurcu 0:4040347d719c 487 //falling edge
Erman Komurcu 0:4040347d719c 488 manchester_bit_array[2 * i] = 1;
Erman Komurcu 0:4040347d719c 489 manchester_bit_array[2 * i + 1] = 0;
Erman Komurcu 0:4040347d719c 490 } else {
Erman Komurcu 0:4040347d719c 491 //rising edge
Erman Komurcu 0:4040347d719c 492 manchester_bit_array[2 * i] = 0;
Erman Komurcu 0:4040347d719c 493 manchester_bit_array[2 * i + 1] = 1;
Erman Komurcu 0:4040347d719c 494 }
Erman Komurcu 0:4040347d719c 495 }
Erman Komurcu 0:4040347d719c 496
Erman Komurcu 0:4040347d719c 497 delete[] bits_array; //delete bit array anymore not used
Erman Komurcu 0:4040347d719c 498
Erman Komurcu 0:4040347d719c 499 float result = (500.0 / data_rate);
Erman Komurcu 0:4040347d719c 500
Erman Komurcu 0:4040347d719c 501 bool rxFinished = false;
Erman Komurcu 0:4040347d719c 502 Timer t;
Erman Komurcu 0:4040347d719c 503 core_util_critical_section_enter();
Erman Komurcu 0:4040347d719c 504 *this->data_sent = 0;
Erman Komurcu 0:4040347d719c 505 wait_us(100);
Erman Komurcu 0:4040347d719c 506 *this->data_sent = 1;
Erman Komurcu 0:4040347d719c 507 wait_us(350);
Erman Komurcu 0:4040347d719c 508 *this->data_sent = 0;
Erman Komurcu 0:4040347d719c 509 wait_us(10);
Erman Komurcu 0:4040347d719c 510 t.start();
Erman Komurcu 0:4040347d719c 511 int manch_bit_counter = 0;
Erman Komurcu 0:4040347d719c 512 do {
Erman Komurcu 0:4040347d719c 513 if (t.read_us() >= (result * manch_bit_counter)) {
Erman Komurcu 0:4040347d719c 514 if (manchester_bit_array[manch_bit_counter] == 0) {
Erman Komurcu 0:4040347d719c 515 *this->data_sent = 0;
Erman Komurcu 0:4040347d719c 516 } else {
Erman Komurcu 0:4040347d719c 517 *this->data_sent = 1;
Erman Komurcu 0:4040347d719c 518 }
Erman Komurcu 0:4040347d719c 519
Erman Komurcu 0:4040347d719c 520 manch_bit_counter++;
Erman Komurcu 0:4040347d719c 521
Erman Komurcu 0:4040347d719c 522 if (manch_bit_counter >= (length * 2 * 8)) {
Erman Komurcu 0:4040347d719c 523 rxFinished = true;
Erman Komurcu 0:4040347d719c 524 t.stop();
Erman Komurcu 0:4040347d719c 525 if (this->ssel != NULL) {
Erman Komurcu 0:4040347d719c 526 *this->ssel = 1;
Erman Komurcu 0:4040347d719c 527 }
Erman Komurcu 0:4040347d719c 528 }
Erman Komurcu 0:4040347d719c 529
Erman Komurcu 0:4040347d719c 530 }
Erman Komurcu 0:4040347d719c 531 } while (!rxFinished);
Erman Komurcu 0:4040347d719c 532 *this->data_sent = 0;
Erman Komurcu 0:4040347d719c 533 core_util_critical_section_exit();
Erman Komurcu 0:4040347d719c 534
Erman Komurcu 0:4040347d719c 535 delete[] manchester_bit_array; //manchester array clean
Erman Komurcu 0:4040347d719c 536
Erman Komurcu 0:4040347d719c 537 return 0;
Erman Komurcu 0:4040347d719c 538 }
Erman Komurcu 0:4040347d719c 539
Erman Komurcu 0:4040347d719c 540 template <class REG>
Erman Komurcu 0:4040347d719c 541 int MAX4146X<REG>::set_softreset(softreset_t softreset)
Erman Komurcu 0:4040347d719c 542 {
Erman Komurcu 0:4040347d719c 543 SET_BIT_FIELD(CFG8_ADDR, this->reg->reg_cfg8, this->reg->reg_cfg8.bits.softreset, softreset);
Erman Komurcu 0:4040347d719c 544
Erman Komurcu 0:4040347d719c 545 return 0;
Erman Komurcu 0:4040347d719c 546 }
Erman Komurcu 0:4040347d719c 547
Erman Komurcu 0:4040347d719c 548 template <class REG>
Erman Komurcu 0:4040347d719c 549 int MAX4146X<REG>::set_xoclkdelay(xoclkdelay_t delay)
Erman Komurcu 0:4040347d719c 550 {
Erman Komurcu 0:4040347d719c 551 SET_BIT_FIELD(CFG1_ADDR, this->reg->reg_cfg1, this->reg->reg_cfg1.bits.xoclkdelay, delay);
Erman Komurcu 0:4040347d719c 552
Erman Komurcu 0:4040347d719c 553 return 0;
Erman Komurcu 0:4040347d719c 554 }
Erman Komurcu 0:4040347d719c 555
Erman Komurcu 0:4040347d719c 556 template <class REG>
Erman Komurcu 0:4040347d719c 557 int MAX4146X<REG>::get_xoclkdelay(xoclkdelay_t *delay)
Erman Komurcu 0:4040347d719c 558 {
Erman Komurcu 0:4040347d719c 559 int ret;
Erman Komurcu 0:4040347d719c 560
Erman Komurcu 0:4040347d719c 561 ret = read_register(CFG1_ADDR, (uint8_t *) & (this->reg->reg_cfg1), 1);
Erman Komurcu 0:4040347d719c 562 if (ret < 0) {
Erman Komurcu 0:4040347d719c 563 return ret;
Erman Komurcu 0:4040347d719c 564 }
Erman Komurcu 0:4040347d719c 565
Erman Komurcu 0:4040347d719c 566 *delay = (xoclkdelay_t)this->reg->reg_cfg1.bits.xoclkdelay;
Erman Komurcu 0:4040347d719c 567
Erman Komurcu 0:4040347d719c 568 return 0;
Erman Komurcu 0:4040347d719c 569 }
Erman Komurcu 0:4040347d719c 570
Erman Komurcu 0:4040347d719c 571 template <class REG>
Erman Komurcu 0:4040347d719c 572 int MAX4146X<REG>::get_fifo_flags(uint8_t *fifo_flags)
Erman Komurcu 0:4040347d719c 573 {
Erman Komurcu 0:4040347d719c 574 return read_register(I2C6_ADDR, fifo_flags, 1);
Erman Komurcu 0:4040347d719c 575 }
Erman Komurcu 0:4040347d719c 576
Erman Komurcu 0:4040347d719c 577 template <class REG>
Erman Komurcu 0:4040347d719c 578 int MAX4146X<REG>::get_pktcomplete(uint8_t *pktcomplete)
Erman Komurcu 0:4040347d719c 579 {
Erman Komurcu 0:4040347d719c 580 int ret;
Erman Komurcu 0:4040347d719c 581
Erman Komurcu 0:4040347d719c 582 ret = read_register(I2C4_ADDR, (uint8_t *) & (this->reg->reg_i2c4), 1);
Erman Komurcu 0:4040347d719c 583 if (ret < 0) {
Erman Komurcu 0:4040347d719c 584 return ret;
Erman Komurcu 0:4040347d719c 585 }
Erman Komurcu 0:4040347d719c 586
Erman Komurcu 0:4040347d719c 587 *pktcomplete = (uint8_t)this->reg->reg_i2c4.bits.pktcomplete;
Erman Komurcu 0:4040347d719c 588
Erman Komurcu 0:4040347d719c 589 return 0;
Erman Komurcu 0:4040347d719c 590 }
Erman Komurcu 0:4040347d719c 591
Erman Komurcu 0:4040347d719c 592 template <class REG>
Erman Komurcu 0:4040347d719c 593 int MAX4146X<REG>::get_tx_pktlen(uint16_t *pktlen)
Erman Komurcu 0:4040347d719c 594 {
Erman Komurcu 0:4040347d719c 595 int ret;
Erman Komurcu 0:4040347d719c 596
Erman Komurcu 0:4040347d719c 597 ret = read_register(I2C4_ADDR, (uint8_t *) & (this->reg->reg_i2c4), 2);
Erman Komurcu 0:4040347d719c 598 if (ret < 0) {
Erman Komurcu 0:4040347d719c 599 return ret;
Erman Komurcu 0:4040347d719c 600 }
Erman Komurcu 0:4040347d719c 601
Erman Komurcu 0:4040347d719c 602 *pktlen = (uint16_t)(((this->reg->reg_i2c4.bits.tx_pktlen_14_to_8) << 8) + (this->reg->reg_i2c5.raw)) ;
Erman Komurcu 0:4040347d719c 603
Erman Komurcu 0:4040347d719c 604 return 0;
Erman Komurcu 0:4040347d719c 605 }
Erman Komurcu 0:4040347d719c 606
Erman Komurcu 0:4040347d719c 607 template <class REG>
Erman Komurcu 0:4040347d719c 608 int MAX4146X<REG>::set_xoclkdiv(xoclkdiv_t div)
Erman Komurcu 0:4040347d719c 609 {
Erman Komurcu 0:4040347d719c 610 SET_BIT_FIELD(CFG1_ADDR, this->reg->reg_cfg1, this->reg->reg_cfg1.bits.xoclkdiv, div);
Erman Komurcu 0:4040347d719c 611
Erman Komurcu 0:4040347d719c 612 return 0;
Erman Komurcu 0:4040347d719c 613 }
Erman Komurcu 0:4040347d719c 614
Erman Komurcu 0:4040347d719c 615 template <class REG>
Erman Komurcu 0:4040347d719c 616 int MAX4146X<REG>::get_xoclkdiv(xoclkdiv_t* div)
Erman Komurcu 0:4040347d719c 617 {
Erman Komurcu 0:4040347d719c 618 int ret;
Erman Komurcu 0:4040347d719c 619
Erman Komurcu 0:4040347d719c 620 ret = read_register(CFG1_ADDR, (uint8_t *) & (this->reg->reg_cfg1), 1);
Erman Komurcu 0:4040347d719c 621 if (ret < 0) {
Erman Komurcu 0:4040347d719c 622 return ret;
Erman Komurcu 0:4040347d719c 623 }
Erman Komurcu 0:4040347d719c 624
Erman Komurcu 0:4040347d719c 625 *div = (xoclkdiv_t)this->reg->reg_cfg1.bits.xoclkdiv;
Erman Komurcu 0:4040347d719c 626
Erman Komurcu 0:4040347d719c 627 return 0;
Erman Komurcu 0:4040347d719c 628 }
Erman Komurcu 0:4040347d719c 629
Erman Komurcu 0:4040347d719c 630 template <class REG>
Erman Komurcu 0:4040347d719c 631 int MAX4146X<REG>::set_fskshape(fskshape_t shape)
Erman Komurcu 0:4040347d719c 632 {
Erman Komurcu 0:4040347d719c 633 SET_BIT_FIELD(CFG1_ADDR, this->reg->reg_cfg1, this->reg->reg_cfg1.bits.fskshape, shape);
Erman Komurcu 0:4040347d719c 634
Erman Komurcu 0:4040347d719c 635 return 0;
Erman Komurcu 0:4040347d719c 636 }
Erman Komurcu 0:4040347d719c 637
Erman Komurcu 0:4040347d719c 638 template <class REG>
Erman Komurcu 0:4040347d719c 639 int MAX4146X<REG>::get_fskshape(fskshape_t* shape)
Erman Komurcu 0:4040347d719c 640 {
Erman Komurcu 0:4040347d719c 641 int ret;
Erman Komurcu 0:4040347d719c 642
Erman Komurcu 0:4040347d719c 643 ret = read_register(CFG1_ADDR, (uint8_t *) & (this->reg->reg_cfg1), 1);
Erman Komurcu 0:4040347d719c 644 if (ret < 0) {
Erman Komurcu 0:4040347d719c 645 return ret;
Erman Komurcu 0:4040347d719c 646 }
Erman Komurcu 0:4040347d719c 647
Erman Komurcu 0:4040347d719c 648 *shape = (fskshape_t)this->reg->reg_cfg1.bits.fskshape;
Erman Komurcu 0:4040347d719c 649
Erman Komurcu 0:4040347d719c 650 return 0;
Erman Komurcu 0:4040347d719c 651 }
Erman Komurcu 0:4040347d719c 652
Erman Komurcu 0:4040347d719c 653 template <class REG>
Erman Komurcu 0:4040347d719c 654 int MAX4146X<REG>::set_sync(sync_t state)
Erman Komurcu 0:4040347d719c 655 {
Erman Komurcu 0:4040347d719c 656 SET_BIT_FIELD(CFG1_ADDR, this->reg->reg_cfg1, this->reg->reg_cfg1.bits.sync, state);
Erman Komurcu 0:4040347d719c 657
Erman Komurcu 0:4040347d719c 658 return 0;
Erman Komurcu 0:4040347d719c 659 }
Erman Komurcu 0:4040347d719c 660
Erman Komurcu 0:4040347d719c 661 template <class REG>
Erman Komurcu 0:4040347d719c 662 int MAX4146X<REG>::get_sync(sync_t* state)
Erman Komurcu 0:4040347d719c 663 {
Erman Komurcu 0:4040347d719c 664 int ret;
Erman Komurcu 0:4040347d719c 665
Erman Komurcu 0:4040347d719c 666 ret = read_register(CFG1_ADDR, (uint8_t *) & (this->reg->reg_cfg1), 1);
Erman Komurcu 0:4040347d719c 667 if (ret < 0) {
Erman Komurcu 0:4040347d719c 668 return ret;
Erman Komurcu 0:4040347d719c 669 }
Erman Komurcu 0:4040347d719c 670
Erman Komurcu 0:4040347d719c 671 *state = (sync_t)this->reg->reg_cfg1.bits.sync;
Erman Komurcu 0:4040347d719c 672
Erman Komurcu 0:4040347d719c 673 return 0;
Erman Komurcu 0:4040347d719c 674 }
Erman Komurcu 0:4040347d719c 675
Erman Komurcu 0:4040347d719c 676 template <class REG>
Erman Komurcu 0:4040347d719c 677 int MAX4146X<REG>::set_modmode(modmode_t mode)
Erman Komurcu 0:4040347d719c 678 {
Erman Komurcu 0:4040347d719c 679 SET_BIT_FIELD(CFG1_ADDR, this->reg->reg_cfg1, this->reg->reg_cfg1.bits.modmode, mode);
Erman Komurcu 0:4040347d719c 680
Erman Komurcu 0:4040347d719c 681 return 0;
Erman Komurcu 0:4040347d719c 682 }
Erman Komurcu 0:4040347d719c 683
Erman Komurcu 0:4040347d719c 684 template <class REG>
Erman Komurcu 0:4040347d719c 685 int MAX4146X<REG>::get_modmode(modmode_t* mode)
Erman Komurcu 0:4040347d719c 686 {
Erman Komurcu 0:4040347d719c 687 int ret;
Erman Komurcu 0:4040347d719c 688
Erman Komurcu 0:4040347d719c 689 ret = read_register(CFG1_ADDR, (uint8_t *) & (this->reg->reg_cfg1), 1);
Erman Komurcu 0:4040347d719c 690 if (ret < 0) {
Erman Komurcu 0:4040347d719c 691 return ret;
Erman Komurcu 0:4040347d719c 692 }
Erman Komurcu 0:4040347d719c 693
Erman Komurcu 0:4040347d719c 694 *mode = (modmode_t)this->reg->reg_cfg1.bits.modmode;
Erman Komurcu 0:4040347d719c 695
Erman Komurcu 0:4040347d719c 696 return 0;
Erman Komurcu 0:4040347d719c 697 }
Erman Komurcu 0:4040347d719c 698
Erman Komurcu 0:4040347d719c 699 template <class REG>
Erman Komurcu 0:4040347d719c 700 int MAX4146X<REG>::set_clkout_delay(clkout_delay_t delay)
Erman Komurcu 0:4040347d719c 701 {
Erman Komurcu 0:4040347d719c 702 SET_BIT_FIELD(CFG2_ADDR, this->reg->reg_cfg2, this->reg->reg_cfg2.bits.clkout_delay, delay);
Erman Komurcu 0:4040347d719c 703
Erman Komurcu 0:4040347d719c 704 return 0;
Erman Komurcu 0:4040347d719c 705 }
Erman Komurcu 0:4040347d719c 706
Erman Komurcu 0:4040347d719c 707 template <class REG>
Erman Komurcu 0:4040347d719c 708 int MAX4146X<REG>::get_clkout_delay(clkout_delay_t* delay)
Erman Komurcu 0:4040347d719c 709 {
Erman Komurcu 0:4040347d719c 710 int ret;
Erman Komurcu 0:4040347d719c 711
Erman Komurcu 0:4040347d719c 712 ret = read_register(CFG2_ADDR, (uint8_t *) & (this->reg->reg_cfg2), 1);
Erman Komurcu 0:4040347d719c 713 if (ret < 0) {
Erman Komurcu 0:4040347d719c 714 return ret;
Erman Komurcu 0:4040347d719c 715 }
Erman Komurcu 0:4040347d719c 716
Erman Komurcu 0:4040347d719c 717 *delay = (clkout_delay_t)this->reg->reg_cfg2.bits.clkout_delay;
Erman Komurcu 0:4040347d719c 718
Erman Komurcu 0:4040347d719c 719 return 0;
Erman Komurcu 0:4040347d719c 720 }
Erman Komurcu 0:4040347d719c 721
Erman Komurcu 0:4040347d719c 722 template <class REG>
Erman Komurcu 0:4040347d719c 723 int MAX4146X<REG>::set_bclk_postdiv(bclk_postdiv_t div)
Erman Komurcu 0:4040347d719c 724 {
Erman Komurcu 0:4040347d719c 725 SET_BIT_FIELD(CFG2_ADDR, this->reg->reg_cfg2, this->reg->reg_cfg2.bits.bclk_postdiv, div);
Erman Komurcu 0:4040347d719c 726
Erman Komurcu 0:4040347d719c 727 return 0;
Erman Komurcu 0:4040347d719c 728 }
Erman Komurcu 0:4040347d719c 729
Erman Komurcu 0:4040347d719c 730 template <class REG>
Erman Komurcu 0:4040347d719c 731 int MAX4146X<REG>::get_bclk_postdiv(bclk_postdiv_t* div)
Erman Komurcu 0:4040347d719c 732 {
Erman Komurcu 0:4040347d719c 733 int ret;
Erman Komurcu 0:4040347d719c 734
Erman Komurcu 0:4040347d719c 735 ret = read_register(CFG2_ADDR, (uint8_t *) & (this->reg->reg_cfg2), 1);
Erman Komurcu 0:4040347d719c 736 if (ret < 0) {
Erman Komurcu 0:4040347d719c 737 return ret;
Erman Komurcu 0:4040347d719c 738 }
Erman Komurcu 0:4040347d719c 739
Erman Komurcu 0:4040347d719c 740 *div = (bclk_postdiv_t)this->reg->reg_cfg2.bits.bclk_postdiv;
Erman Komurcu 0:4040347d719c 741
Erman Komurcu 0:4040347d719c 742 return 0;
Erman Komurcu 0:4040347d719c 743 }
Erman Komurcu 0:4040347d719c 744
Erman Komurcu 0:4040347d719c 745 template <class REG>
Erman Komurcu 0:4040347d719c 746 int MAX4146X<REG>::set_bclk_prediv(uint8_t prediv)
Erman Komurcu 0:4040347d719c 747 {
Erman Komurcu 0:4040347d719c 748 if (prediv < 3) {
Erman Komurcu 0:4040347d719c 749 return -1;
Erman Komurcu 0:4040347d719c 750 }
Erman Komurcu 0:4040347d719c 751
Erman Komurcu 0:4040347d719c 752 SET_BIT_FIELD(CFG3_ADDR, this->reg->reg_cfg3, this->reg->reg_cfg3.bits.bclk_prediv, prediv);
Erman Komurcu 0:4040347d719c 753
Erman Komurcu 0:4040347d719c 754 return 0;
Erman Komurcu 0:4040347d719c 755 }
Erman Komurcu 0:4040347d719c 756
Erman Komurcu 0:4040347d719c 757 template <class REG>
Erman Komurcu 0:4040347d719c 758 int MAX4146X<REG>::get_bclk_prediv(uint8_t* prediv)
Erman Komurcu 0:4040347d719c 759 {
Erman Komurcu 0:4040347d719c 760 int ret;
Erman Komurcu 0:4040347d719c 761
Erman Komurcu 0:4040347d719c 762 ret = read_register(CFG3_ADDR, (uint8_t *) & (this->reg->reg_cfg3), 1);
Erman Komurcu 0:4040347d719c 763 if (ret < 0) {
Erman Komurcu 0:4040347d719c 764 return ret;
Erman Komurcu 0:4040347d719c 765 }
Erman Komurcu 0:4040347d719c 766
Erman Komurcu 0:4040347d719c 767 *prediv = (uint8_t)this->reg->reg_cfg3.bits.bclk_prediv;
Erman Komurcu 0:4040347d719c 768
Erman Komurcu 0:4040347d719c 769 return 0;
Erman Komurcu 0:4040347d719c 770 }
Erman Komurcu 0:4040347d719c 771
Erman Komurcu 0:4040347d719c 772 template <class REG>
Erman Komurcu 0:4040347d719c 773 int MAX4146X<REG>::set_pwdn_mode(pwdn_mode_t pwdn_mode)
Erman Komurcu 0:4040347d719c 774 {
Erman Komurcu 0:4040347d719c 775 SET_BIT_FIELD(CFG4_ADDR, this->reg->reg_cfg4, this->reg->reg_cfg4.bits.pwdn_mode, pwdn_mode);
Erman Komurcu 0:4040347d719c 776
Erman Komurcu 0:4040347d719c 777 return 0;
Erman Komurcu 0:4040347d719c 778 }
Erman Komurcu 0:4040347d719c 779
Erman Komurcu 0:4040347d719c 780 template <class REG>
Erman Komurcu 0:4040347d719c 781 int MAX4146X<REG>::get_pwdn_mode(pwdn_mode_t* pwdn_mode)
Erman Komurcu 0:4040347d719c 782 {
Erman Komurcu 0:4040347d719c 783 int ret;
Erman Komurcu 0:4040347d719c 784
Erman Komurcu 0:4040347d719c 785 ret = read_register(CFG4_ADDR, (uint8_t *) & (this->reg->reg_cfg4), 1);
Erman Komurcu 0:4040347d719c 786 if (ret < 0) {
Erman Komurcu 0:4040347d719c 787 return ret;
Erman Komurcu 0:4040347d719c 788 }
Erman Komurcu 0:4040347d719c 789
Erman Komurcu 0:4040347d719c 790 *pwdn_mode = (pwdn_mode_t)this->reg->reg_cfg4.bits.pwdn_mode;
Erman Komurcu 0:4040347d719c 791
Erman Komurcu 0:4040347d719c 792 return 0;
Erman Komurcu 0:4040347d719c 793 }
Erman Komurcu 0:4040347d719c 794
Erman Komurcu 0:4040347d719c 795 template <class REG>
Erman Komurcu 0:4040347d719c 796 int MAX4146X<REG>::set_tstep(uint8_t tstep)
Erman Komurcu 0:4040347d719c 797 {
Erman Komurcu 0:4040347d719c 798 SET_BIT_FIELD(CFG5_ADDR, this->reg->reg_cfg5, this->reg->reg_cfg5.bits.tstep, tstep);
Erman Komurcu 0:4040347d719c 799
Erman Komurcu 0:4040347d719c 800 return 0;
Erman Komurcu 0:4040347d719c 801 }
Erman Komurcu 0:4040347d719c 802
Erman Komurcu 0:4040347d719c 803 template <class REG>
Erman Komurcu 0:4040347d719c 804 int MAX4146X<REG>::get_tstep(uint8_t* tstep)
Erman Komurcu 0:4040347d719c 805 {
Erman Komurcu 0:4040347d719c 806 int ret;
Erman Komurcu 0:4040347d719c 807
Erman Komurcu 0:4040347d719c 808 ret = read_register(CFG5_ADDR, (uint8_t *) & (this->reg->reg_cfg5), 1);
Erman Komurcu 0:4040347d719c 809 if (ret < 0) {
Erman Komurcu 0:4040347d719c 810 return ret;
Erman Komurcu 0:4040347d719c 811 }
Erman Komurcu 0:4040347d719c 812
Erman Komurcu 0:4040347d719c 813 *tstep = (uint8_t)this->reg->reg_cfg5.bits.tstep;
Erman Komurcu 0:4040347d719c 814
Erman Komurcu 0:4040347d719c 815 return 0;
Erman Komurcu 0:4040347d719c 816 }
Erman Komurcu 0:4040347d719c 817
Erman Komurcu 0:4040347d719c 818 template <class REG>
Erman Komurcu 0:4040347d719c 819 int MAX4146X<REG>::set_pa_boost(pa_boost_t pa_boost)
Erman Komurcu 0:4040347d719c 820 {
Erman Komurcu 0:4040347d719c 821 SET_BIT_FIELD(SHDN_ADDR, this->reg->reg_shdn, this->reg->reg_shdn.bits.pa_boost, pa_boost);
Erman Komurcu 0:4040347d719c 822
Erman Komurcu 0:4040347d719c 823 return 0;
Erman Komurcu 0:4040347d719c 824 }
Erman Komurcu 0:4040347d719c 825
Erman Komurcu 0:4040347d719c 826 template <class REG>
Erman Komurcu 0:4040347d719c 827 int MAX4146X<REG>::get_pa_boost(pa_boost_t* pa_boost)
Erman Komurcu 0:4040347d719c 828 {
Erman Komurcu 0:4040347d719c 829 int ret;
Erman Komurcu 0:4040347d719c 830
Erman Komurcu 0:4040347d719c 831 ret = read_register(CFG5_ADDR, (uint8_t *) & (this->reg->reg_shdn), 1);
Erman Komurcu 0:4040347d719c 832 if (ret < 0) {
Erman Komurcu 0:4040347d719c 833 return ret;
Erman Komurcu 0:4040347d719c 834 }
Erman Komurcu 0:4040347d719c 835
Erman Komurcu 0:4040347d719c 836 *pa_boost = (pa_boost_t)this->reg->reg_shdn.bits.pa_boost;
Erman Komurcu 0:4040347d719c 837
Erman Komurcu 0:4040347d719c 838 return 0;
Erman Komurcu 0:4040347d719c 839 }
Erman Komurcu 0:4040347d719c 840
Erman Komurcu 0:4040347d719c 841 template <class REG>
Erman Komurcu 0:4040347d719c 842 int MAX4146X<REG>::set_papwr(papwr_t papwr)
Erman Komurcu 0:4040347d719c 843 {
Erman Komurcu 0:4040347d719c 844 SET_BIT_FIELD(PA1_ADDR, this->reg->reg_pa1, this->reg->reg_pa1.bits.papwr, papwr);
Erman Komurcu 0:4040347d719c 845
Erman Komurcu 0:4040347d719c 846 return 0;
Erman Komurcu 0:4040347d719c 847 }
Erman Komurcu 0:4040347d719c 848
Erman Komurcu 0:4040347d719c 849 template <class REG>
Erman Komurcu 0:4040347d719c 850 int MAX4146X<REG>::get_papwr(papwr_t* papwr)
Erman Komurcu 0:4040347d719c 851 {
Erman Komurcu 0:4040347d719c 852 int ret;
Erman Komurcu 0:4040347d719c 853
Erman Komurcu 0:4040347d719c 854 ret = read_register(PA1_ADDR, (uint8_t *) & (this->reg->reg_pa1), 1);
Erman Komurcu 0:4040347d719c 855 if (ret < 0) {
Erman Komurcu 0:4040347d719c 856 return ret;
Erman Komurcu 0:4040347d719c 857 }
Erman Komurcu 0:4040347d719c 858
Erman Komurcu 0:4040347d719c 859 *papwr = (papwr_t)this->reg->reg_pa1.bits.papwr;
Erman Komurcu 0:4040347d719c 860
Erman Komurcu 0:4040347d719c 861 return 0;
Erman Komurcu 0:4040347d719c 862 }
Erman Komurcu 0:4040347d719c 863
Erman Komurcu 0:4040347d719c 864 template <class REG>
Erman Komurcu 0:4040347d719c 865 int MAX4146X<REG>::set_pacap(pacap_t pacap)
Erman Komurcu 0:4040347d719c 866 {
Erman Komurcu 0:4040347d719c 867 SET_BIT_FIELD(PA2_ADDR, this->reg->reg_pa2, this->reg->reg_pa2.bits.pacap, pacap);
Erman Komurcu 0:4040347d719c 868
Erman Komurcu 0:4040347d719c 869 return 0;
Erman Komurcu 0:4040347d719c 870 }
Erman Komurcu 0:4040347d719c 871
Erman Komurcu 0:4040347d719c 872 template <class REG>
Erman Komurcu 0:4040347d719c 873 int MAX4146X<REG>::get_pacap(pacap_t* pacap)
Erman Komurcu 0:4040347d719c 874 {
Erman Komurcu 0:4040347d719c 875 int ret;
Erman Komurcu 0:4040347d719c 876
Erman Komurcu 0:4040347d719c 877 ret = read_register(CFG5_ADDR, (uint8_t *) & (this->reg->reg_pa2), 1);
Erman Komurcu 0:4040347d719c 878 if (ret < 0) {
Erman Komurcu 0:4040347d719c 879 return ret;
Erman Komurcu 0:4040347d719c 880 }
Erman Komurcu 0:4040347d719c 881
Erman Komurcu 0:4040347d719c 882 *pacap = (pacap_t)this->reg->reg_pa2.bits.pacap;
Erman Komurcu 0:4040347d719c 883
Erman Komurcu 0:4040347d719c 884 return 0;
Erman Komurcu 0:4040347d719c 885 }
Erman Komurcu 0:4040347d719c 886
Erman Komurcu 0:4040347d719c 887 template <class REG>
Erman Komurcu 0:4040347d719c 888 int MAX4146X<REG>::set_cplin(cplin_t cplin)
Erman Komurcu 0:4040347d719c 889 {
Erman Komurcu 0:4040347d719c 890 SET_BIT_FIELD(PLL1_ADDR, this->reg->reg_pll1, this->reg->reg_pll1.bits.cplin, cplin);
Erman Komurcu 0:4040347d719c 891
Erman Komurcu 0:4040347d719c 892 return 0;
Erman Komurcu 0:4040347d719c 893 }
Erman Komurcu 0:4040347d719c 894
Erman Komurcu 0:4040347d719c 895 template <class REG>
Erman Komurcu 0:4040347d719c 896 int MAX4146X<REG>::get_cplin(cplin_t* cplin)
Erman Komurcu 0:4040347d719c 897 {
Erman Komurcu 0:4040347d719c 898 int ret;
Erman Komurcu 0:4040347d719c 899
Erman Komurcu 0:4040347d719c 900 ret = read_register(PLL1_ADDR, (uint8_t *) & (this->reg->reg_pll1), 1);
Erman Komurcu 0:4040347d719c 901 if (ret < 0) {
Erman Komurcu 0:4040347d719c 902 return ret;
Erman Komurcu 0:4040347d719c 903 }
Erman Komurcu 0:4040347d719c 904
Erman Komurcu 0:4040347d719c 905 *cplin = (cplin_t)this->reg->reg_pll1.bits.cplin;
Erman Komurcu 0:4040347d719c 906
Erman Komurcu 0:4040347d719c 907 return 0;
Erman Komurcu 0:4040347d719c 908 }
Erman Komurcu 0:4040347d719c 909
Erman Komurcu 0:4040347d719c 910 template <class REG>
Erman Komurcu 0:4040347d719c 911 int MAX4146X<REG>::set_fracmode(fracmode_t fracmode)
Erman Komurcu 0:4040347d719c 912 {
Erman Komurcu 0:4040347d719c 913 SET_BIT_FIELD(PLL1_ADDR, this->reg->reg_pll1, this->reg->reg_pll1.bits.fracmode, fracmode);
Erman Komurcu 0:4040347d719c 914
Erman Komurcu 0:4040347d719c 915 return 0;
Erman Komurcu 0:4040347d719c 916 }
Erman Komurcu 0:4040347d719c 917
Erman Komurcu 0:4040347d719c 918 template <class REG>
Erman Komurcu 0:4040347d719c 919 int MAX4146X<REG>::get_fracmode(fracmode_t* fracmode)
Erman Komurcu 0:4040347d719c 920 {
Erman Komurcu 0:4040347d719c 921 int ret;
Erman Komurcu 0:4040347d719c 922
Erman Komurcu 0:4040347d719c 923 ret = read_register(PLL1_ADDR, (uint8_t *) & (this->reg->reg_pll1), 1);
Erman Komurcu 0:4040347d719c 924 if (ret < 0) {
Erman Komurcu 0:4040347d719c 925 return ret;
Erman Komurcu 0:4040347d719c 926 }
Erman Komurcu 0:4040347d719c 927
Erman Komurcu 0:4040347d719c 928 *fracmode = (fracmode_t)this->reg->reg_pll1.bits.fracmode;
Erman Komurcu 0:4040347d719c 929
Erman Komurcu 0:4040347d719c 930 return 0;
Erman Komurcu 0:4040347d719c 931 }
Erman Komurcu 0:4040347d719c 932
Erman Komurcu 0:4040347d719c 933 template <class REG>
Erman Komurcu 0:4040347d719c 934 int MAX4146X<REG>::set_lodiv(lodiv_t lodiv)
Erman Komurcu 0:4040347d719c 935 {
Erman Komurcu 0:4040347d719c 936 SET_BIT_FIELD(PLL1_ADDR, this->reg->reg_pll1, this->reg->reg_pll1.bits.lodiv, lodiv);
Erman Komurcu 0:4040347d719c 937
Erman Komurcu 0:4040347d719c 938 return 0;
Erman Komurcu 0:4040347d719c 939 }
Erman Komurcu 0:4040347d719c 940
Erman Komurcu 0:4040347d719c 941 template <class REG>
Erman Komurcu 0:4040347d719c 942 int MAX4146X<REG>::get_lodiv(lodiv_t* lodiv)
Erman Komurcu 0:4040347d719c 943 {
Erman Komurcu 0:4040347d719c 944 int ret;
Erman Komurcu 0:4040347d719c 945
Erman Komurcu 0:4040347d719c 946 ret = read_register(PLL1_ADDR, (uint8_t *) & (this->reg->reg_pll1), 1);
Erman Komurcu 0:4040347d719c 947 if (ret < 0) {
Erman Komurcu 0:4040347d719c 948 return ret;
Erman Komurcu 0:4040347d719c 949 }
Erman Komurcu 0:4040347d719c 950
Erman Komurcu 0:4040347d719c 951 *lodiv = (lodiv_t)this->reg->reg_pll1.bits.lodiv;
Erman Komurcu 0:4040347d719c 952
Erman Komurcu 0:4040347d719c 953 return 0;
Erman Komurcu 0:4040347d719c 954 }
Erman Komurcu 0:4040347d719c 955
Erman Komurcu 0:4040347d719c 956 template <class REG>
Erman Komurcu 0:4040347d719c 957 int MAX4146X<REG>::set_lomode(lomode_t lomode)
Erman Komurcu 0:4040347d719c 958 {
Erman Komurcu 0:4040347d719c 959 SET_BIT_FIELD(PLL1_ADDR, this->reg->reg_pll1, this->reg->reg_pll1.bits.lomode, lomode);
Erman Komurcu 0:4040347d719c 960
Erman Komurcu 0:4040347d719c 961 return 0;
Erman Komurcu 0:4040347d719c 962 }
Erman Komurcu 0:4040347d719c 963
Erman Komurcu 0:4040347d719c 964 template <class REG>
Erman Komurcu 0:4040347d719c 965 int MAX4146X<REG>::get_lomode(lomode_t* lomode)
Erman Komurcu 0:4040347d719c 966 {
Erman Komurcu 0:4040347d719c 967 int ret;
Erman Komurcu 0:4040347d719c 968
Erman Komurcu 0:4040347d719c 969 ret = read_register(PLL1_ADDR, (uint8_t *) & (this->reg->reg_pll1), 1);
Erman Komurcu 0:4040347d719c 970 if (ret < 0) {
Erman Komurcu 0:4040347d719c 971 return ret;
Erman Komurcu 0:4040347d719c 972 }
Erman Komurcu 0:4040347d719c 973
Erman Komurcu 0:4040347d719c 974 *lomode = (lomode_t)this->reg->reg_pll1.bits.lomode;
Erman Komurcu 0:4040347d719c 975
Erman Komurcu 0:4040347d719c 976 return 0;
Erman Komurcu 0:4040347d719c 977 }
Erman Komurcu 0:4040347d719c 978
Erman Komurcu 0:4040347d719c 979 template <class REG>
Erman Komurcu 0:4040347d719c 980 int MAX4146X<REG>::set_cpval(cpval_t cpval)
Erman Komurcu 0:4040347d719c 981 {
Erman Komurcu 0:4040347d719c 982
Erman Komurcu 0:4040347d719c 983 SET_BIT_FIELD(PLL2_ADDR, this->reg->reg_pll2, this->reg->reg_pll2.bits.cpval, cpval);
Erman Komurcu 0:4040347d719c 984
Erman Komurcu 0:4040347d719c 985 return 0;
Erman Komurcu 0:4040347d719c 986 }
Erman Komurcu 0:4040347d719c 987
Erman Komurcu 0:4040347d719c 988 template <class REG>
Erman Komurcu 0:4040347d719c 989 int MAX4146X<REG>::get_cpval(cpval_t* cpval)
Erman Komurcu 0:4040347d719c 990 {
Erman Komurcu 0:4040347d719c 991 int ret;
Erman Komurcu 0:4040347d719c 992
Erman Komurcu 0:4040347d719c 993 ret = read_register(PLL2_ADDR, (uint8_t *) & (this->reg->reg_pll2), 1);
Erman Komurcu 0:4040347d719c 994 if (ret < 0) {
Erman Komurcu 0:4040347d719c 995 return ret;
Erman Komurcu 0:4040347d719c 996 }
Erman Komurcu 0:4040347d719c 997
Erman Komurcu 0:4040347d719c 998 *cpval = (cpval_t)this->reg->reg_pll2.bits.cpval;
Erman Komurcu 0:4040347d719c 999
Erman Komurcu 0:4040347d719c 1000 return 0;
Erman Komurcu 0:4040347d719c 1001 }
Erman Komurcu 0:4040347d719c 1002
Erman Komurcu 0:4040347d719c 1003 template <class REG>
Erman Komurcu 0:4040347d719c 1004 int MAX4146X<REG>::set_frequency(uint32_t freq)
Erman Komurcu 0:4040347d719c 1005 {
Erman Komurcu 0:4040347d719c 1006 uint8_t value[3] = {(uint8_t)(freq >> 16), (uint8_t)(freq >> 8), (uint8_t)freq};
Erman Komurcu 0:4040347d719c 1007
Erman Komurcu 0:4040347d719c 1008 return write_register(PLL3_ADDR, (uint8_t *)&value, 3);
Erman Komurcu 0:4040347d719c 1009
Erman Komurcu 0:4040347d719c 1010 }
Erman Komurcu 0:4040347d719c 1011
Erman Komurcu 0:4040347d719c 1012 template <class REG>
Erman Komurcu 0:4040347d719c 1013 int MAX4146X<REG>::get_frequency(uint32_t* freq)
Erman Komurcu 0:4040347d719c 1014 {
Erman Komurcu 0:4040347d719c 1015 int ret;
Erman Komurcu 0:4040347d719c 1016
Erman Komurcu 0:4040347d719c 1017 uint8_t value[3];
Erman Komurcu 0:4040347d719c 1018
Erman Komurcu 0:4040347d719c 1019 ret = read_register(PLL3_ADDR, (uint8_t *)&value, 3);
Erman Komurcu 0:4040347d719c 1020 if (ret < 0) {
Erman Komurcu 0:4040347d719c 1021 return ret;
Erman Komurcu 0:4040347d719c 1022 }
Erman Komurcu 0:4040347d719c 1023
Erman Komurcu 0:4040347d719c 1024 *freq = (uint32_t)((value[0] << 16) + (value[1] << 8) + value[2]);
Erman Komurcu 0:4040347d719c 1025
Erman Komurcu 0:4040347d719c 1026 return 0;
Erman Komurcu 0:4040347d719c 1027 }
Erman Komurcu 0:4040347d719c 1028
Erman Komurcu 0:4040347d719c 1029 template <class REG>
Erman Komurcu 0:4040347d719c 1030 int MAX4146X<REG>::set_deltaf(uint8_t deltaf)
Erman Komurcu 0:4040347d719c 1031 {
Erman Komurcu 0:4040347d719c 1032 if (deltaf > 127) {
Erman Komurcu 0:4040347d719c 1033 return -1;
Erman Komurcu 0:4040347d719c 1034 }
Erman Komurcu 0:4040347d719c 1035
Erman Komurcu 0:4040347d719c 1036 SET_BIT_FIELD(PLL6_ADDR, this->reg->reg_pll6, this->reg->reg_pll6.bits.deltaf, deltaf);
Erman Komurcu 0:4040347d719c 1037
Erman Komurcu 0:4040347d719c 1038 return 0;
Erman Komurcu 0:4040347d719c 1039 }
Erman Komurcu 0:4040347d719c 1040
Erman Komurcu 0:4040347d719c 1041 template <class REG>
Erman Komurcu 0:4040347d719c 1042 int MAX4146X<REG>::get_deltaf(uint8_t* deltaf)
Erman Komurcu 0:4040347d719c 1043 {
Erman Komurcu 0:4040347d719c 1044 int ret;
Erman Komurcu 0:4040347d719c 1045
Erman Komurcu 0:4040347d719c 1046 ret = read_register(PLL6_ADDR, (uint8_t *) & (this->reg->reg_pll6), 1);
Erman Komurcu 0:4040347d719c 1047 if (ret < 0) {
Erman Komurcu 0:4040347d719c 1048 return ret;
Erman Komurcu 0:4040347d719c 1049 }
Erman Komurcu 0:4040347d719c 1050
Erman Komurcu 0:4040347d719c 1051 *deltaf = (uint8_t)this->reg->reg_pll6.bits.deltaf;
Erman Komurcu 0:4040347d719c 1052
Erman Komurcu 0:4040347d719c 1053 return 0;
Erman Komurcu 0:4040347d719c 1054 }
Erman Komurcu 0:4040347d719c 1055
Erman Komurcu 0:4040347d719c 1056 template <class REG>
Erman Komurcu 0:4040347d719c 1057 int MAX4146X<REG>::set_deltaf_shape(uint8_t deltaf_shape)
Erman Komurcu 0:4040347d719c 1058 {
Erman Komurcu 0:4040347d719c 1059 if (deltaf_shape > 15) {
Erman Komurcu 0:4040347d719c 1060 return -1;
Erman Komurcu 0:4040347d719c 1061 }
Erman Komurcu 0:4040347d719c 1062
Erman Komurcu 0:4040347d719c 1063 SET_BIT_FIELD(PLL7_ADDR, this->reg->reg_pll7, this->reg->reg_pll7.bits.deltaf_shape, deltaf_shape);
Erman Komurcu 0:4040347d719c 1064
Erman Komurcu 0:4040347d719c 1065 return 0;
Erman Komurcu 0:4040347d719c 1066 }
Erman Komurcu 0:4040347d719c 1067
Erman Komurcu 0:4040347d719c 1068 template <class REG>
Erman Komurcu 0:4040347d719c 1069 int MAX4146X<REG>::get_deltaf_shape(uint8_t* deltaf_shape)
Erman Komurcu 0:4040347d719c 1070 {
Erman Komurcu 0:4040347d719c 1071 int ret;
Erman Komurcu 0:4040347d719c 1072
Erman Komurcu 0:4040347d719c 1073 ret = read_register(PLL7_ADDR, (uint8_t *) & (this->reg->reg_pll7), 1);
Erman Komurcu 0:4040347d719c 1074 if (ret < 0) {
Erman Komurcu 0:4040347d719c 1075 return ret;
Erman Komurcu 0:4040347d719c 1076 }
Erman Komurcu 0:4040347d719c 1077
Erman Komurcu 0:4040347d719c 1078 *deltaf_shape = (uint8_t)this->reg->reg_pll7.bits.deltaf_shape;
Erman Komurcu 0:4040347d719c 1079
Erman Komurcu 0:4040347d719c 1080 return 0;
Erman Komurcu 0:4040347d719c 1081 }
Erman Komurcu 0:4040347d719c 1082
Erman Komurcu 0:4040347d719c 1083 template <class REG>
Erman Komurcu 0:4040347d719c 1084 int MAX4146X<REG>::set_pktlen_mode(pktlen_mode_t pktlen_mode)
Erman Komurcu 0:4040347d719c 1085 {
Erman Komurcu 0:4040347d719c 1086 SET_BIT_FIELD(I2C1_ADDR, this->reg->reg_i2c1, this->reg->reg_i2c1.bits.pktlen_mode, pktlen_mode);
Erman Komurcu 0:4040347d719c 1087
Erman Komurcu 0:4040347d719c 1088 return 0;
Erman Komurcu 0:4040347d719c 1089 }
Erman Komurcu 0:4040347d719c 1090
Erman Komurcu 0:4040347d719c 1091 template <class REG>
Erman Komurcu 0:4040347d719c 1092 int MAX4146X<REG>::get_pktlen_mode(pktlen_mode_t* pktlen_mode)
Erman Komurcu 0:4040347d719c 1093 {
Erman Komurcu 0:4040347d719c 1094 int ret;
Erman Komurcu 0:4040347d719c 1095
Erman Komurcu 0:4040347d719c 1096 ret = read_register(I2C1_ADDR, (uint8_t *) & (this->reg->reg_i2c1), 1);
Erman Komurcu 0:4040347d719c 1097 if (ret < 0) {
Erman Komurcu 0:4040347d719c 1098 return ret;
Erman Komurcu 0:4040347d719c 1099 }
Erman Komurcu 0:4040347d719c 1100
Erman Komurcu 0:4040347d719c 1101 *pktlen_mode = (pktlen_mode_t)this->reg->reg_i2c1.bits.pktlen_mode;
Erman Komurcu 0:4040347d719c 1102
Erman Komurcu 0:4040347d719c 1103 return 0;
Erman Komurcu 0:4040347d719c 1104 }
Erman Komurcu 0:4040347d719c 1105
Erman Komurcu 0:4040347d719c 1106
Erman Komurcu 0:4040347d719c 1107 template <class REG>
Erman Komurcu 0:4040347d719c 1108 int MAX4146X<REG>::set_i2c_pktlen(uint16_t pktlen)
Erman Komurcu 0:4040347d719c 1109 {
Erman Komurcu 0:4040347d719c 1110 if (pktlen > 0x7FF) {
Erman Komurcu 0:4040347d719c 1111 return -1;
Erman Komurcu 0:4040347d719c 1112 }
Erman Komurcu 0:4040347d719c 1113
Erman Komurcu 0:4040347d719c 1114 SET_BIT_FIELD(I2C1_ADDR, this->reg->reg_i2c1, this->reg->reg_i2c1.bits.pktlen_14_to_8, (uint8_t)((pktlen >> 8) & 0x07));
Erman Komurcu 0:4040347d719c 1115
Erman Komurcu 0:4040347d719c 1116 uint8_t value = (uint8_t)(pktlen & 0xFF);
Erman Komurcu 0:4040347d719c 1117
Erman Komurcu 0:4040347d719c 1118 return write_register(I2C2_ADDR, (uint8_t *)&value, 1);
Erman Komurcu 0:4040347d719c 1119 }
Erman Komurcu 0:4040347d719c 1120
Erman Komurcu 0:4040347d719c 1121 template <class REG>
Erman Komurcu 0:4040347d719c 1122 int MAX4146X<REG>::get_i2c_pktlen(uint16_t* pktlen)
Erman Komurcu 0:4040347d719c 1123 {
Erman Komurcu 0:4040347d719c 1124 int ret;
Erman Komurcu 0:4040347d719c 1125
Erman Komurcu 0:4040347d719c 1126 ret = read_register(I2C1_ADDR, (uint8_t *) & (this->reg->reg_i2c1), 1);
Erman Komurcu 0:4040347d719c 1127 if (ret < 0) {
Erman Komurcu 0:4040347d719c 1128 return ret;
Erman Komurcu 0:4040347d719c 1129 }
Erman Komurcu 0:4040347d719c 1130
Erman Komurcu 0:4040347d719c 1131 ret = read_register(I2C2_ADDR, (uint8_t *) & (this->reg->reg_i2c2), 1);
Erman Komurcu 0:4040347d719c 1132 if (ret < 0) {
Erman Komurcu 0:4040347d719c 1133 return ret;
Erman Komurcu 0:4040347d719c 1134 }
Erman Komurcu 0:4040347d719c 1135
Erman Komurcu 0:4040347d719c 1136 *pktlen = (uint16_t)(((this->reg->reg_i2c1.raw & 0x7F)<<8) + (this->reg->reg_i2c2.raw &0x7F));
Erman Komurcu 0:4040347d719c 1137
Erman Komurcu 0:4040347d719c 1138 return 0;
Erman Komurcu 0:4040347d719c 1139 }
Erman Komurcu 0:4040347d719c 1140
Erman Komurcu 0:4040347d719c 1141 template <class REG>
Erman Komurcu 0:4040347d719c 1142 int MAX4146X<REG>::initial_programming(void)
Erman Komurcu 0:4040347d719c 1143 {
Erman Komurcu 0:4040347d719c 1144 uint8_t value = 0x80;
Erman Komurcu 0:4040347d719c 1145 write_register(ADDL2_ADDR, (uint8_t *)&value, 1);
Erman Komurcu 0:4040347d719c 1146
Erman Komurcu 0:4040347d719c 1147 return write_register(CFG1_ADDR, default_register_value_1, 20);
Erman Komurcu 0:4040347d719c 1148 }
Erman Komurcu 0:4040347d719c 1149
Erman Komurcu 0:4040347d719c 1150 template <>
Erman Komurcu 0:4040347d719c 1151 int MAX4146X<max41460_reg_map_t>::initial_programming(void)
Erman Komurcu 0:4040347d719c 1152 {
Erman Komurcu 0:4040347d719c 1153 if (this->ssel != NULL){
Erman Komurcu 0:4040347d719c 1154 *this->ssel = 0;
Erman Komurcu 0:4040347d719c 1155 wait_us(100);
Erman Komurcu 0:4040347d719c 1156 }
Erman Komurcu 0:4040347d719c 1157
Erman Komurcu 0:4040347d719c 1158 int rtn = write_register(CFG1_ADDR, default_register_value_0, 17);
Erman Komurcu 0:4040347d719c 1159
Erman Komurcu 0:4040347d719c 1160 if (this->ssel != NULL){
Erman Komurcu 0:4040347d719c 1161 wait_us(90);
Erman Komurcu 0:4040347d719c 1162 *this->ssel = 1;
Erman Komurcu 0:4040347d719c 1163 }
Erman Komurcu 0:4040347d719c 1164
Erman Komurcu 0:4040347d719c 1165 return rtn;
Erman Komurcu 0:4040347d719c 1166 }
Erman Komurcu 0:4040347d719c 1167
Erman Komurcu 0:4040347d719c 1168
Erman Komurcu 0:4040347d719c 1169 template class MAX4146X<max41460_reg_map_t>;
Erman Komurcu 0:4040347d719c 1170 template class MAX4146X<max41461_2_reg_map_t>;
Erman Komurcu 0:4040347d719c 1171 template class MAX4146X<max41463_4_reg_map_t>;
Erman Komurcu 0:4040347d719c 1172
Erman Komurcu 0:4040347d719c 1173