ISM RF transmitter library for MAX4146X family devices

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

Committer:
Erman Komurcu
Date:
Thu May 02 12:51:33 2019 +0300
Revision:
0:4040347d719c
Child:
1:ccf0e1d28860
Initial Commit

Who changed what in which revision?

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