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 14:11:03 2019 +0300
Revision:
1:ccf0e1d28860
Parent:
0:4040347d719c
Child:
2:80969d8f6d2b
Copyright notice changed

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 {
Erman Komurcu 0:4040347d719c 278 if (freq < 250 || freq > 950) {
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 char * value = (char *)malloc(17 * sizeof(char));
Erman Komurcu 0:4040347d719c 446
Erman Komurcu 0:4040347d719c 447 if (value == NULL) {
Erman Komurcu 0:4040347d719c 448 return -99;
Erman Komurcu 0:4040347d719c 449 }
Erman Komurcu 0:4040347d719c 450
Erman Komurcu 0:4040347d719c 451 int rtn_val = i2c_handler->write(I2C_ADDRESS, (char *) 0x00, 1, true);
Erman Komurcu 0:4040347d719c 452 rtn_val = i2c_handler->read(I2C_ADDRESS, value, length, true);
Erman Komurcu 0:4040347d719c 453 if (rtn_val != 0) {
Erman Komurcu 0:4040347d719c 454 return rtn_val;
Erman Komurcu 0:4040347d719c 455 }
Erman Komurcu 0:4040347d719c 456
Erman Komurcu 0:4040347d719c 457 free(value);
Erman Komurcu 0:4040347d719c 458
Erman Komurcu 0:4040347d719c 459 uint8_t local_data[4+length];
Erman Komurcu 0:4040347d719c 460
Erman Komurcu 0:4040347d719c 461 local_data[0] = CFG7_ADDR;
Erman Komurcu 0:4040347d719c 462 local_data[1] = 0x04;
Erman Komurcu 0:4040347d719c 463 local_data[2] = (uint8_t)((length >> 8) | 0x80);
Erman Komurcu 0:4040347d719c 464 local_data[3] = (uint8_t)((length) & 0x0FF);
Erman Komurcu 0:4040347d719c 465
Erman Komurcu 0:4040347d719c 466 memcpy(&local_data[4], data, length);
Erman Komurcu 0:4040347d719c 467
Erman Komurcu 0:4040347d719c 468 i2c_handler->write(I2C_ADDRESS, (const char *)local_data, sizeof(local_data), false);
Erman Komurcu 0:4040347d719c 469
Erman Komurcu 0:4040347d719c 470 } else {
Erman Komurcu 0:4040347d719c 471 this->io_write(data, length);
Erman Komurcu 0:4040347d719c 472 }
Erman Komurcu 0:4040347d719c 473
Erman Komurcu 0:4040347d719c 474 return 0;
Erman Komurcu 0:4040347d719c 475 }
Erman Komurcu 0:4040347d719c 476
Erman Komurcu 0:4040347d719c 477 template <class REG>
Erman Komurcu 0:4040347d719c 478 int MAX4146X<REG>::io_write(uint8_t *data, uint32_t length)
Erman Komurcu 0:4040347d719c 479 {
Erman Komurcu 0:4040347d719c 480 //manchester array
Erman Komurcu 0:4040347d719c 481 manchester_bit_array = new unsigned char[length * 2 * 8];
Erman Komurcu 0:4040347d719c 482
Erman Komurcu 0:4040347d719c 483 //bit array
Erman Komurcu 0:4040347d719c 484 bits_array = new unsigned char[length * 8];
Erman Komurcu 0:4040347d719c 485
Erman Komurcu 0:4040347d719c 486 //byte to bit conversion
Erman Komurcu 0:4040347d719c 487 for (int i = 0; i < length; i++) {
Erman Komurcu 0:4040347d719c 488 for (int j = 0; j < 8; j++) {
Erman Komurcu 0:4040347d719c 489 // Mask each bit in the byte and store it
Erman Komurcu 0:4040347d719c 490 if (data[i] & (mask << j)) {
Erman Komurcu 0:4040347d719c 491 bits_array[i * 8 + j] = 1;
Erman Komurcu 0:4040347d719c 492 } else {
Erman Komurcu 0:4040347d719c 493 bits_array[i * 8 + j] = 0;
Erman Komurcu 0:4040347d719c 494 }
Erman Komurcu 0:4040347d719c 495 }
Erman Komurcu 0:4040347d719c 496 }
Erman Komurcu 0:4040347d719c 497
Erman Komurcu 0:4040347d719c 498 //manchester encode
Erman Komurcu 0:4040347d719c 499 for (int i = 0; i < length * 8; i++) {
Erman Komurcu 0:4040347d719c 500 if (bits_array[i] == 0) {
Erman Komurcu 0:4040347d719c 501 //falling edge
Erman Komurcu 0:4040347d719c 502 manchester_bit_array[2 * i] = 1;
Erman Komurcu 0:4040347d719c 503 manchester_bit_array[2 * i + 1] = 0;
Erman Komurcu 0:4040347d719c 504 } else {
Erman Komurcu 0:4040347d719c 505 //rising edge
Erman Komurcu 0:4040347d719c 506 manchester_bit_array[2 * i] = 0;
Erman Komurcu 0:4040347d719c 507 manchester_bit_array[2 * i + 1] = 1;
Erman Komurcu 0:4040347d719c 508 }
Erman Komurcu 0:4040347d719c 509 }
Erman Komurcu 0:4040347d719c 510
Erman Komurcu 0:4040347d719c 511 delete[] bits_array; //delete bit array anymore not used
Erman Komurcu 0:4040347d719c 512
Erman Komurcu 0:4040347d719c 513 float result = (500.0 / data_rate);
Erman Komurcu 0:4040347d719c 514
Erman Komurcu 0:4040347d719c 515 bool rxFinished = false;
Erman Komurcu 0:4040347d719c 516 Timer t;
Erman Komurcu 0:4040347d719c 517 core_util_critical_section_enter();
Erman Komurcu 0:4040347d719c 518 *this->data_sent = 0;
Erman Komurcu 0:4040347d719c 519 wait_us(100);
Erman Komurcu 0:4040347d719c 520 *this->data_sent = 1;
Erman Komurcu 0:4040347d719c 521 wait_us(350);
Erman Komurcu 0:4040347d719c 522 *this->data_sent = 0;
Erman Komurcu 0:4040347d719c 523 wait_us(10);
Erman Komurcu 0:4040347d719c 524 t.start();
Erman Komurcu 0:4040347d719c 525 int manch_bit_counter = 0;
Erman Komurcu 0:4040347d719c 526 do {
Erman Komurcu 0:4040347d719c 527 if (t.read_us() >= (result * manch_bit_counter)) {
Erman Komurcu 0:4040347d719c 528 if (manchester_bit_array[manch_bit_counter] == 0) {
Erman Komurcu 0:4040347d719c 529 *this->data_sent = 0;
Erman Komurcu 0:4040347d719c 530 } else {
Erman Komurcu 0:4040347d719c 531 *this->data_sent = 1;
Erman Komurcu 0:4040347d719c 532 }
Erman Komurcu 0:4040347d719c 533
Erman Komurcu 0:4040347d719c 534 manch_bit_counter++;
Erman Komurcu 0:4040347d719c 535
Erman Komurcu 0:4040347d719c 536 if (manch_bit_counter >= (length * 2 * 8)) {
Erman Komurcu 0:4040347d719c 537 rxFinished = true;
Erman Komurcu 0:4040347d719c 538 t.stop();
Erman Komurcu 0:4040347d719c 539 if (this->ssel != NULL) {
Erman Komurcu 0:4040347d719c 540 *this->ssel = 1;
Erman Komurcu 0:4040347d719c 541 }
Erman Komurcu 0:4040347d719c 542 }
Erman Komurcu 0:4040347d719c 543
Erman Komurcu 0:4040347d719c 544 }
Erman Komurcu 0:4040347d719c 545 } while (!rxFinished);
Erman Komurcu 0:4040347d719c 546 *this->data_sent = 0;
Erman Komurcu 0:4040347d719c 547 core_util_critical_section_exit();
Erman Komurcu 0:4040347d719c 548
Erman Komurcu 0:4040347d719c 549 delete[] manchester_bit_array; //manchester array clean
Erman Komurcu 0:4040347d719c 550
Erman Komurcu 0:4040347d719c 551 return 0;
Erman Komurcu 0:4040347d719c 552 }
Erman Komurcu 0:4040347d719c 553
Erman Komurcu 0:4040347d719c 554 template <class REG>
Erman Komurcu 0:4040347d719c 555 int MAX4146X<REG>::set_softreset(softreset_t softreset)
Erman Komurcu 0:4040347d719c 556 {
Erman Komurcu 0:4040347d719c 557 SET_BIT_FIELD(CFG8_ADDR, this->reg->reg_cfg8, this->reg->reg_cfg8.bits.softreset, softreset);
Erman Komurcu 0:4040347d719c 558
Erman Komurcu 0:4040347d719c 559 return 0;
Erman Komurcu 0:4040347d719c 560 }
Erman Komurcu 0:4040347d719c 561
Erman Komurcu 0:4040347d719c 562 template <class REG>
Erman Komurcu 0:4040347d719c 563 int MAX4146X<REG>::set_xoclkdelay(xoclkdelay_t delay)
Erman Komurcu 0:4040347d719c 564 {
Erman Komurcu 0:4040347d719c 565 SET_BIT_FIELD(CFG1_ADDR, this->reg->reg_cfg1, this->reg->reg_cfg1.bits.xoclkdelay, delay);
Erman Komurcu 0:4040347d719c 566
Erman Komurcu 0:4040347d719c 567 return 0;
Erman Komurcu 0:4040347d719c 568 }
Erman Komurcu 0:4040347d719c 569
Erman Komurcu 0:4040347d719c 570 template <class REG>
Erman Komurcu 0:4040347d719c 571 int MAX4146X<REG>::get_xoclkdelay(xoclkdelay_t *delay)
Erman Komurcu 0:4040347d719c 572 {
Erman Komurcu 0:4040347d719c 573 int ret;
Erman Komurcu 0:4040347d719c 574
Erman Komurcu 0:4040347d719c 575 ret = read_register(CFG1_ADDR, (uint8_t *) & (this->reg->reg_cfg1), 1);
Erman Komurcu 0:4040347d719c 576 if (ret < 0) {
Erman Komurcu 0:4040347d719c 577 return ret;
Erman Komurcu 0:4040347d719c 578 }
Erman Komurcu 0:4040347d719c 579
Erman Komurcu 0:4040347d719c 580 *delay = (xoclkdelay_t)this->reg->reg_cfg1.bits.xoclkdelay;
Erman Komurcu 0:4040347d719c 581
Erman Komurcu 0:4040347d719c 582 return 0;
Erman Komurcu 0:4040347d719c 583 }
Erman Komurcu 0:4040347d719c 584
Erman Komurcu 0:4040347d719c 585 template <class REG>
Erman Komurcu 0:4040347d719c 586 int MAX4146X<REG>::get_fifo_flags(uint8_t *fifo_flags)
Erman Komurcu 0:4040347d719c 587 {
Erman Komurcu 0:4040347d719c 588 return read_register(I2C6_ADDR, fifo_flags, 1);
Erman Komurcu 0:4040347d719c 589 }
Erman Komurcu 0:4040347d719c 590
Erman Komurcu 0:4040347d719c 591 template <class REG>
Erman Komurcu 0:4040347d719c 592 int MAX4146X<REG>::get_pktcomplete(uint8_t *pktcomplete)
Erman Komurcu 0:4040347d719c 593 {
Erman Komurcu 0:4040347d719c 594 int ret;
Erman Komurcu 0:4040347d719c 595
Erman Komurcu 0:4040347d719c 596 ret = read_register(I2C4_ADDR, (uint8_t *) & (this->reg->reg_i2c4), 1);
Erman Komurcu 0:4040347d719c 597 if (ret < 0) {
Erman Komurcu 0:4040347d719c 598 return ret;
Erman Komurcu 0:4040347d719c 599 }
Erman Komurcu 0:4040347d719c 600
Erman Komurcu 0:4040347d719c 601 *pktcomplete = (uint8_t)this->reg->reg_i2c4.bits.pktcomplete;
Erman Komurcu 0:4040347d719c 602
Erman Komurcu 0:4040347d719c 603 return 0;
Erman Komurcu 0:4040347d719c 604 }
Erman Komurcu 0:4040347d719c 605
Erman Komurcu 0:4040347d719c 606 template <class REG>
Erman Komurcu 0:4040347d719c 607 int MAX4146X<REG>::get_tx_pktlen(uint16_t *pktlen)
Erman Komurcu 0:4040347d719c 608 {
Erman Komurcu 0:4040347d719c 609 int ret;
Erman Komurcu 0:4040347d719c 610
Erman Komurcu 0:4040347d719c 611 ret = read_register(I2C4_ADDR, (uint8_t *) & (this->reg->reg_i2c4), 2);
Erman Komurcu 0:4040347d719c 612 if (ret < 0) {
Erman Komurcu 0:4040347d719c 613 return ret;
Erman Komurcu 0:4040347d719c 614 }
Erman Komurcu 0:4040347d719c 615
Erman Komurcu 0:4040347d719c 616 *pktlen = (uint16_t)(((this->reg->reg_i2c4.bits.tx_pktlen_14_to_8) << 8) + (this->reg->reg_i2c5.raw)) ;
Erman Komurcu 0:4040347d719c 617
Erman Komurcu 0:4040347d719c 618 return 0;
Erman Komurcu 0:4040347d719c 619 }
Erman Komurcu 0:4040347d719c 620
Erman Komurcu 0:4040347d719c 621 template <class REG>
Erman Komurcu 0:4040347d719c 622 int MAX4146X<REG>::set_xoclkdiv(xoclkdiv_t div)
Erman Komurcu 0:4040347d719c 623 {
Erman Komurcu 0:4040347d719c 624 SET_BIT_FIELD(CFG1_ADDR, this->reg->reg_cfg1, this->reg->reg_cfg1.bits.xoclkdiv, div);
Erman Komurcu 0:4040347d719c 625
Erman Komurcu 0:4040347d719c 626 return 0;
Erman Komurcu 0:4040347d719c 627 }
Erman Komurcu 0:4040347d719c 628
Erman Komurcu 0:4040347d719c 629 template <class REG>
Erman Komurcu 0:4040347d719c 630 int MAX4146X<REG>::get_xoclkdiv(xoclkdiv_t* div)
Erman Komurcu 0:4040347d719c 631 {
Erman Komurcu 0:4040347d719c 632 int ret;
Erman Komurcu 0:4040347d719c 633
Erman Komurcu 0:4040347d719c 634 ret = read_register(CFG1_ADDR, (uint8_t *) & (this->reg->reg_cfg1), 1);
Erman Komurcu 0:4040347d719c 635 if (ret < 0) {
Erman Komurcu 0:4040347d719c 636 return ret;
Erman Komurcu 0:4040347d719c 637 }
Erman Komurcu 0:4040347d719c 638
Erman Komurcu 0:4040347d719c 639 *div = (xoclkdiv_t)this->reg->reg_cfg1.bits.xoclkdiv;
Erman Komurcu 0:4040347d719c 640
Erman Komurcu 0:4040347d719c 641 return 0;
Erman Komurcu 0:4040347d719c 642 }
Erman Komurcu 0:4040347d719c 643
Erman Komurcu 0:4040347d719c 644 template <class REG>
Erman Komurcu 0:4040347d719c 645 int MAX4146X<REG>::set_fskshape(fskshape_t shape)
Erman Komurcu 0:4040347d719c 646 {
Erman Komurcu 0:4040347d719c 647 SET_BIT_FIELD(CFG1_ADDR, this->reg->reg_cfg1, this->reg->reg_cfg1.bits.fskshape, shape);
Erman Komurcu 0:4040347d719c 648
Erman Komurcu 0:4040347d719c 649 return 0;
Erman Komurcu 0:4040347d719c 650 }
Erman Komurcu 0:4040347d719c 651
Erman Komurcu 0:4040347d719c 652 template <class REG>
Erman Komurcu 0:4040347d719c 653 int MAX4146X<REG>::get_fskshape(fskshape_t* shape)
Erman Komurcu 0:4040347d719c 654 {
Erman Komurcu 0:4040347d719c 655 int ret;
Erman Komurcu 0:4040347d719c 656
Erman Komurcu 0:4040347d719c 657 ret = read_register(CFG1_ADDR, (uint8_t *) & (this->reg->reg_cfg1), 1);
Erman Komurcu 0:4040347d719c 658 if (ret < 0) {
Erman Komurcu 0:4040347d719c 659 return ret;
Erman Komurcu 0:4040347d719c 660 }
Erman Komurcu 0:4040347d719c 661
Erman Komurcu 0:4040347d719c 662 *shape = (fskshape_t)this->reg->reg_cfg1.bits.fskshape;
Erman Komurcu 0:4040347d719c 663
Erman Komurcu 0:4040347d719c 664 return 0;
Erman Komurcu 0:4040347d719c 665 }
Erman Komurcu 0:4040347d719c 666
Erman Komurcu 0:4040347d719c 667 template <class REG>
Erman Komurcu 0:4040347d719c 668 int MAX4146X<REG>::set_sync(sync_t state)
Erman Komurcu 0:4040347d719c 669 {
Erman Komurcu 0:4040347d719c 670 SET_BIT_FIELD(CFG1_ADDR, this->reg->reg_cfg1, this->reg->reg_cfg1.bits.sync, state);
Erman Komurcu 0:4040347d719c 671
Erman Komurcu 0:4040347d719c 672 return 0;
Erman Komurcu 0:4040347d719c 673 }
Erman Komurcu 0:4040347d719c 674
Erman Komurcu 0:4040347d719c 675 template <class REG>
Erman Komurcu 0:4040347d719c 676 int MAX4146X<REG>::get_sync(sync_t* state)
Erman Komurcu 0:4040347d719c 677 {
Erman Komurcu 0:4040347d719c 678 int ret;
Erman Komurcu 0:4040347d719c 679
Erman Komurcu 0:4040347d719c 680 ret = read_register(CFG1_ADDR, (uint8_t *) & (this->reg->reg_cfg1), 1);
Erman Komurcu 0:4040347d719c 681 if (ret < 0) {
Erman Komurcu 0:4040347d719c 682 return ret;
Erman Komurcu 0:4040347d719c 683 }
Erman Komurcu 0:4040347d719c 684
Erman Komurcu 0:4040347d719c 685 *state = (sync_t)this->reg->reg_cfg1.bits.sync;
Erman Komurcu 0:4040347d719c 686
Erman Komurcu 0:4040347d719c 687 return 0;
Erman Komurcu 0:4040347d719c 688 }
Erman Komurcu 0:4040347d719c 689
Erman Komurcu 0:4040347d719c 690 template <class REG>
Erman Komurcu 0:4040347d719c 691 int MAX4146X<REG>::set_modmode(modmode_t mode)
Erman Komurcu 0:4040347d719c 692 {
Erman Komurcu 0:4040347d719c 693 SET_BIT_FIELD(CFG1_ADDR, this->reg->reg_cfg1, this->reg->reg_cfg1.bits.modmode, mode);
Erman Komurcu 0:4040347d719c 694
Erman Komurcu 0:4040347d719c 695 return 0;
Erman Komurcu 0:4040347d719c 696 }
Erman Komurcu 0:4040347d719c 697
Erman Komurcu 0:4040347d719c 698 template <class REG>
Erman Komurcu 0:4040347d719c 699 int MAX4146X<REG>::get_modmode(modmode_t* mode)
Erman Komurcu 0:4040347d719c 700 {
Erman Komurcu 0:4040347d719c 701 int ret;
Erman Komurcu 0:4040347d719c 702
Erman Komurcu 0:4040347d719c 703 ret = read_register(CFG1_ADDR, (uint8_t *) & (this->reg->reg_cfg1), 1);
Erman Komurcu 0:4040347d719c 704 if (ret < 0) {
Erman Komurcu 0:4040347d719c 705 return ret;
Erman Komurcu 0:4040347d719c 706 }
Erman Komurcu 0:4040347d719c 707
Erman Komurcu 0:4040347d719c 708 *mode = (modmode_t)this->reg->reg_cfg1.bits.modmode;
Erman Komurcu 0:4040347d719c 709
Erman Komurcu 0:4040347d719c 710 return 0;
Erman Komurcu 0:4040347d719c 711 }
Erman Komurcu 0:4040347d719c 712
Erman Komurcu 0:4040347d719c 713 template <class REG>
Erman Komurcu 0:4040347d719c 714 int MAX4146X<REG>::set_clkout_delay(clkout_delay_t delay)
Erman Komurcu 0:4040347d719c 715 {
Erman Komurcu 0:4040347d719c 716 SET_BIT_FIELD(CFG2_ADDR, this->reg->reg_cfg2, this->reg->reg_cfg2.bits.clkout_delay, delay);
Erman Komurcu 0:4040347d719c 717
Erman Komurcu 0:4040347d719c 718 return 0;
Erman Komurcu 0:4040347d719c 719 }
Erman Komurcu 0:4040347d719c 720
Erman Komurcu 0:4040347d719c 721 template <class REG>
Erman Komurcu 0:4040347d719c 722 int MAX4146X<REG>::get_clkout_delay(clkout_delay_t* delay)
Erman Komurcu 0:4040347d719c 723 {
Erman Komurcu 0:4040347d719c 724 int ret;
Erman Komurcu 0:4040347d719c 725
Erman Komurcu 0:4040347d719c 726 ret = read_register(CFG2_ADDR, (uint8_t *) & (this->reg->reg_cfg2), 1);
Erman Komurcu 0:4040347d719c 727 if (ret < 0) {
Erman Komurcu 0:4040347d719c 728 return ret;
Erman Komurcu 0:4040347d719c 729 }
Erman Komurcu 0:4040347d719c 730
Erman Komurcu 0:4040347d719c 731 *delay = (clkout_delay_t)this->reg->reg_cfg2.bits.clkout_delay;
Erman Komurcu 0:4040347d719c 732
Erman Komurcu 0:4040347d719c 733 return 0;
Erman Komurcu 0:4040347d719c 734 }
Erman Komurcu 0:4040347d719c 735
Erman Komurcu 0:4040347d719c 736 template <class REG>
Erman Komurcu 0:4040347d719c 737 int MAX4146X<REG>::set_bclk_postdiv(bclk_postdiv_t div)
Erman Komurcu 0:4040347d719c 738 {
Erman Komurcu 0:4040347d719c 739 SET_BIT_FIELD(CFG2_ADDR, this->reg->reg_cfg2, this->reg->reg_cfg2.bits.bclk_postdiv, div);
Erman Komurcu 0:4040347d719c 740
Erman Komurcu 0:4040347d719c 741 return 0;
Erman Komurcu 0:4040347d719c 742 }
Erman Komurcu 0:4040347d719c 743
Erman Komurcu 0:4040347d719c 744 template <class REG>
Erman Komurcu 0:4040347d719c 745 int MAX4146X<REG>::get_bclk_postdiv(bclk_postdiv_t* div)
Erman Komurcu 0:4040347d719c 746 {
Erman Komurcu 0:4040347d719c 747 int ret;
Erman Komurcu 0:4040347d719c 748
Erman Komurcu 0:4040347d719c 749 ret = read_register(CFG2_ADDR, (uint8_t *) & (this->reg->reg_cfg2), 1);
Erman Komurcu 0:4040347d719c 750 if (ret < 0) {
Erman Komurcu 0:4040347d719c 751 return ret;
Erman Komurcu 0:4040347d719c 752 }
Erman Komurcu 0:4040347d719c 753
Erman Komurcu 0:4040347d719c 754 *div = (bclk_postdiv_t)this->reg->reg_cfg2.bits.bclk_postdiv;
Erman Komurcu 0:4040347d719c 755
Erman Komurcu 0:4040347d719c 756 return 0;
Erman Komurcu 0:4040347d719c 757 }
Erman Komurcu 0:4040347d719c 758
Erman Komurcu 0:4040347d719c 759 template <class REG>
Erman Komurcu 0:4040347d719c 760 int MAX4146X<REG>::set_bclk_prediv(uint8_t prediv)
Erman Komurcu 0:4040347d719c 761 {
Erman Komurcu 0:4040347d719c 762 if (prediv < 3) {
Erman Komurcu 0:4040347d719c 763 return -1;
Erman Komurcu 0:4040347d719c 764 }
Erman Komurcu 0:4040347d719c 765
Erman Komurcu 0:4040347d719c 766 SET_BIT_FIELD(CFG3_ADDR, this->reg->reg_cfg3, this->reg->reg_cfg3.bits.bclk_prediv, prediv);
Erman Komurcu 0:4040347d719c 767
Erman Komurcu 0:4040347d719c 768 return 0;
Erman Komurcu 0:4040347d719c 769 }
Erman Komurcu 0:4040347d719c 770
Erman Komurcu 0:4040347d719c 771 template <class REG>
Erman Komurcu 0:4040347d719c 772 int MAX4146X<REG>::get_bclk_prediv(uint8_t* prediv)
Erman Komurcu 0:4040347d719c 773 {
Erman Komurcu 0:4040347d719c 774 int ret;
Erman Komurcu 0:4040347d719c 775
Erman Komurcu 0:4040347d719c 776 ret = read_register(CFG3_ADDR, (uint8_t *) & (this->reg->reg_cfg3), 1);
Erman Komurcu 0:4040347d719c 777 if (ret < 0) {
Erman Komurcu 0:4040347d719c 778 return ret;
Erman Komurcu 0:4040347d719c 779 }
Erman Komurcu 0:4040347d719c 780
Erman Komurcu 0:4040347d719c 781 *prediv = (uint8_t)this->reg->reg_cfg3.bits.bclk_prediv;
Erman Komurcu 0:4040347d719c 782
Erman Komurcu 0:4040347d719c 783 return 0;
Erman Komurcu 0:4040347d719c 784 }
Erman Komurcu 0:4040347d719c 785
Erman Komurcu 0:4040347d719c 786 template <class REG>
Erman Komurcu 0:4040347d719c 787 int MAX4146X<REG>::set_pwdn_mode(pwdn_mode_t pwdn_mode)
Erman Komurcu 0:4040347d719c 788 {
Erman Komurcu 0:4040347d719c 789 SET_BIT_FIELD(CFG4_ADDR, this->reg->reg_cfg4, this->reg->reg_cfg4.bits.pwdn_mode, pwdn_mode);
Erman Komurcu 0:4040347d719c 790
Erman Komurcu 0:4040347d719c 791 return 0;
Erman Komurcu 0:4040347d719c 792 }
Erman Komurcu 0:4040347d719c 793
Erman Komurcu 0:4040347d719c 794 template <class REG>
Erman Komurcu 0:4040347d719c 795 int MAX4146X<REG>::get_pwdn_mode(pwdn_mode_t* pwdn_mode)
Erman Komurcu 0:4040347d719c 796 {
Erman Komurcu 0:4040347d719c 797 int ret;
Erman Komurcu 0:4040347d719c 798
Erman Komurcu 0:4040347d719c 799 ret = read_register(CFG4_ADDR, (uint8_t *) & (this->reg->reg_cfg4), 1);
Erman Komurcu 0:4040347d719c 800 if (ret < 0) {
Erman Komurcu 0:4040347d719c 801 return ret;
Erman Komurcu 0:4040347d719c 802 }
Erman Komurcu 0:4040347d719c 803
Erman Komurcu 0:4040347d719c 804 *pwdn_mode = (pwdn_mode_t)this->reg->reg_cfg4.bits.pwdn_mode;
Erman Komurcu 0:4040347d719c 805
Erman Komurcu 0:4040347d719c 806 return 0;
Erman Komurcu 0:4040347d719c 807 }
Erman Komurcu 0:4040347d719c 808
Erman Komurcu 0:4040347d719c 809 template <class REG>
Erman Komurcu 0:4040347d719c 810 int MAX4146X<REG>::set_tstep(uint8_t tstep)
Erman Komurcu 0:4040347d719c 811 {
Erman Komurcu 0:4040347d719c 812 SET_BIT_FIELD(CFG5_ADDR, this->reg->reg_cfg5, this->reg->reg_cfg5.bits.tstep, tstep);
Erman Komurcu 0:4040347d719c 813
Erman Komurcu 0:4040347d719c 814 return 0;
Erman Komurcu 0:4040347d719c 815 }
Erman Komurcu 0:4040347d719c 816
Erman Komurcu 0:4040347d719c 817 template <class REG>
Erman Komurcu 0:4040347d719c 818 int MAX4146X<REG>::get_tstep(uint8_t* tstep)
Erman Komurcu 0:4040347d719c 819 {
Erman Komurcu 0:4040347d719c 820 int ret;
Erman Komurcu 0:4040347d719c 821
Erman Komurcu 0:4040347d719c 822 ret = read_register(CFG5_ADDR, (uint8_t *) & (this->reg->reg_cfg5), 1);
Erman Komurcu 0:4040347d719c 823 if (ret < 0) {
Erman Komurcu 0:4040347d719c 824 return ret;
Erman Komurcu 0:4040347d719c 825 }
Erman Komurcu 0:4040347d719c 826
Erman Komurcu 0:4040347d719c 827 *tstep = (uint8_t)this->reg->reg_cfg5.bits.tstep;
Erman Komurcu 0:4040347d719c 828
Erman Komurcu 0:4040347d719c 829 return 0;
Erman Komurcu 0:4040347d719c 830 }
Erman Komurcu 0:4040347d719c 831
Erman Komurcu 0:4040347d719c 832 template <class REG>
Erman Komurcu 0:4040347d719c 833 int MAX4146X<REG>::set_pa_boost(pa_boost_t pa_boost)
Erman Komurcu 0:4040347d719c 834 {
Erman Komurcu 0:4040347d719c 835 SET_BIT_FIELD(SHDN_ADDR, this->reg->reg_shdn, this->reg->reg_shdn.bits.pa_boost, pa_boost);
Erman Komurcu 0:4040347d719c 836
Erman Komurcu 0:4040347d719c 837 return 0;
Erman Komurcu 0:4040347d719c 838 }
Erman Komurcu 0:4040347d719c 839
Erman Komurcu 0:4040347d719c 840 template <class REG>
Erman Komurcu 0:4040347d719c 841 int MAX4146X<REG>::get_pa_boost(pa_boost_t* pa_boost)
Erman Komurcu 0:4040347d719c 842 {
Erman Komurcu 0:4040347d719c 843 int ret;
Erman Komurcu 0:4040347d719c 844
Erman Komurcu 0:4040347d719c 845 ret = read_register(CFG5_ADDR, (uint8_t *) & (this->reg->reg_shdn), 1);
Erman Komurcu 0:4040347d719c 846 if (ret < 0) {
Erman Komurcu 0:4040347d719c 847 return ret;
Erman Komurcu 0:4040347d719c 848 }
Erman Komurcu 0:4040347d719c 849
Erman Komurcu 0:4040347d719c 850 *pa_boost = (pa_boost_t)this->reg->reg_shdn.bits.pa_boost;
Erman Komurcu 0:4040347d719c 851
Erman Komurcu 0:4040347d719c 852 return 0;
Erman Komurcu 0:4040347d719c 853 }
Erman Komurcu 0:4040347d719c 854
Erman Komurcu 0:4040347d719c 855 template <class REG>
Erman Komurcu 0:4040347d719c 856 int MAX4146X<REG>::set_papwr(papwr_t papwr)
Erman Komurcu 0:4040347d719c 857 {
Erman Komurcu 0:4040347d719c 858 SET_BIT_FIELD(PA1_ADDR, this->reg->reg_pa1, this->reg->reg_pa1.bits.papwr, papwr);
Erman Komurcu 0:4040347d719c 859
Erman Komurcu 0:4040347d719c 860 return 0;
Erman Komurcu 0:4040347d719c 861 }
Erman Komurcu 0:4040347d719c 862
Erman Komurcu 0:4040347d719c 863 template <class REG>
Erman Komurcu 0:4040347d719c 864 int MAX4146X<REG>::get_papwr(papwr_t* papwr)
Erman Komurcu 0:4040347d719c 865 {
Erman Komurcu 0:4040347d719c 866 int ret;
Erman Komurcu 0:4040347d719c 867
Erman Komurcu 0:4040347d719c 868 ret = read_register(PA1_ADDR, (uint8_t *) & (this->reg->reg_pa1), 1);
Erman Komurcu 0:4040347d719c 869 if (ret < 0) {
Erman Komurcu 0:4040347d719c 870 return ret;
Erman Komurcu 0:4040347d719c 871 }
Erman Komurcu 0:4040347d719c 872
Erman Komurcu 0:4040347d719c 873 *papwr = (papwr_t)this->reg->reg_pa1.bits.papwr;
Erman Komurcu 0:4040347d719c 874
Erman Komurcu 0:4040347d719c 875 return 0;
Erman Komurcu 0:4040347d719c 876 }
Erman Komurcu 0:4040347d719c 877
Erman Komurcu 0:4040347d719c 878 template <class REG>
Erman Komurcu 0:4040347d719c 879 int MAX4146X<REG>::set_pacap(pacap_t pacap)
Erman Komurcu 0:4040347d719c 880 {
Erman Komurcu 0:4040347d719c 881 SET_BIT_FIELD(PA2_ADDR, this->reg->reg_pa2, this->reg->reg_pa2.bits.pacap, pacap);
Erman Komurcu 0:4040347d719c 882
Erman Komurcu 0:4040347d719c 883 return 0;
Erman Komurcu 0:4040347d719c 884 }
Erman Komurcu 0:4040347d719c 885
Erman Komurcu 0:4040347d719c 886 template <class REG>
Erman Komurcu 0:4040347d719c 887 int MAX4146X<REG>::get_pacap(pacap_t* pacap)
Erman Komurcu 0:4040347d719c 888 {
Erman Komurcu 0:4040347d719c 889 int ret;
Erman Komurcu 0:4040347d719c 890
Erman Komurcu 0:4040347d719c 891 ret = read_register(CFG5_ADDR, (uint8_t *) & (this->reg->reg_pa2), 1);
Erman Komurcu 0:4040347d719c 892 if (ret < 0) {
Erman Komurcu 0:4040347d719c 893 return ret;
Erman Komurcu 0:4040347d719c 894 }
Erman Komurcu 0:4040347d719c 895
Erman Komurcu 0:4040347d719c 896 *pacap = (pacap_t)this->reg->reg_pa2.bits.pacap;
Erman Komurcu 0:4040347d719c 897
Erman Komurcu 0:4040347d719c 898 return 0;
Erman Komurcu 0:4040347d719c 899 }
Erman Komurcu 0:4040347d719c 900
Erman Komurcu 0:4040347d719c 901 template <class REG>
Erman Komurcu 0:4040347d719c 902 int MAX4146X<REG>::set_cplin(cplin_t cplin)
Erman Komurcu 0:4040347d719c 903 {
Erman Komurcu 0:4040347d719c 904 SET_BIT_FIELD(PLL1_ADDR, this->reg->reg_pll1, this->reg->reg_pll1.bits.cplin, cplin);
Erman Komurcu 0:4040347d719c 905
Erman Komurcu 0:4040347d719c 906 return 0;
Erman Komurcu 0:4040347d719c 907 }
Erman Komurcu 0:4040347d719c 908
Erman Komurcu 0:4040347d719c 909 template <class REG>
Erman Komurcu 0:4040347d719c 910 int MAX4146X<REG>::get_cplin(cplin_t* cplin)
Erman Komurcu 0:4040347d719c 911 {
Erman Komurcu 0:4040347d719c 912 int ret;
Erman Komurcu 0:4040347d719c 913
Erman Komurcu 0:4040347d719c 914 ret = read_register(PLL1_ADDR, (uint8_t *) & (this->reg->reg_pll1), 1);
Erman Komurcu 0:4040347d719c 915 if (ret < 0) {
Erman Komurcu 0:4040347d719c 916 return ret;
Erman Komurcu 0:4040347d719c 917 }
Erman Komurcu 0:4040347d719c 918
Erman Komurcu 0:4040347d719c 919 *cplin = (cplin_t)this->reg->reg_pll1.bits.cplin;
Erman Komurcu 0:4040347d719c 920
Erman Komurcu 0:4040347d719c 921 return 0;
Erman Komurcu 0:4040347d719c 922 }
Erman Komurcu 0:4040347d719c 923
Erman Komurcu 0:4040347d719c 924 template <class REG>
Erman Komurcu 0:4040347d719c 925 int MAX4146X<REG>::set_fracmode(fracmode_t fracmode)
Erman Komurcu 0:4040347d719c 926 {
Erman Komurcu 0:4040347d719c 927 SET_BIT_FIELD(PLL1_ADDR, this->reg->reg_pll1, this->reg->reg_pll1.bits.fracmode, fracmode);
Erman Komurcu 0:4040347d719c 928
Erman Komurcu 0:4040347d719c 929 return 0;
Erman Komurcu 0:4040347d719c 930 }
Erman Komurcu 0:4040347d719c 931
Erman Komurcu 0:4040347d719c 932 template <class REG>
Erman Komurcu 0:4040347d719c 933 int MAX4146X<REG>::get_fracmode(fracmode_t* fracmode)
Erman Komurcu 0:4040347d719c 934 {
Erman Komurcu 0:4040347d719c 935 int ret;
Erman Komurcu 0:4040347d719c 936
Erman Komurcu 0:4040347d719c 937 ret = read_register(PLL1_ADDR, (uint8_t *) & (this->reg->reg_pll1), 1);
Erman Komurcu 0:4040347d719c 938 if (ret < 0) {
Erman Komurcu 0:4040347d719c 939 return ret;
Erman Komurcu 0:4040347d719c 940 }
Erman Komurcu 0:4040347d719c 941
Erman Komurcu 0:4040347d719c 942 *fracmode = (fracmode_t)this->reg->reg_pll1.bits.fracmode;
Erman Komurcu 0:4040347d719c 943
Erman Komurcu 0:4040347d719c 944 return 0;
Erman Komurcu 0:4040347d719c 945 }
Erman Komurcu 0:4040347d719c 946
Erman Komurcu 0:4040347d719c 947 template <class REG>
Erman Komurcu 0:4040347d719c 948 int MAX4146X<REG>::set_lodiv(lodiv_t lodiv)
Erman Komurcu 0:4040347d719c 949 {
Erman Komurcu 0:4040347d719c 950 SET_BIT_FIELD(PLL1_ADDR, this->reg->reg_pll1, this->reg->reg_pll1.bits.lodiv, lodiv);
Erman Komurcu 0:4040347d719c 951
Erman Komurcu 0:4040347d719c 952 return 0;
Erman Komurcu 0:4040347d719c 953 }
Erman Komurcu 0:4040347d719c 954
Erman Komurcu 0:4040347d719c 955 template <class REG>
Erman Komurcu 0:4040347d719c 956 int MAX4146X<REG>::get_lodiv(lodiv_t* lodiv)
Erman Komurcu 0:4040347d719c 957 {
Erman Komurcu 0:4040347d719c 958 int ret;
Erman Komurcu 0:4040347d719c 959
Erman Komurcu 0:4040347d719c 960 ret = read_register(PLL1_ADDR, (uint8_t *) & (this->reg->reg_pll1), 1);
Erman Komurcu 0:4040347d719c 961 if (ret < 0) {
Erman Komurcu 0:4040347d719c 962 return ret;
Erman Komurcu 0:4040347d719c 963 }
Erman Komurcu 0:4040347d719c 964
Erman Komurcu 0:4040347d719c 965 *lodiv = (lodiv_t)this->reg->reg_pll1.bits.lodiv;
Erman Komurcu 0:4040347d719c 966
Erman Komurcu 0:4040347d719c 967 return 0;
Erman Komurcu 0:4040347d719c 968 }
Erman Komurcu 0:4040347d719c 969
Erman Komurcu 0:4040347d719c 970 template <class REG>
Erman Komurcu 0:4040347d719c 971 int MAX4146X<REG>::set_lomode(lomode_t lomode)
Erman Komurcu 0:4040347d719c 972 {
Erman Komurcu 0:4040347d719c 973 SET_BIT_FIELD(PLL1_ADDR, this->reg->reg_pll1, this->reg->reg_pll1.bits.lomode, lomode);
Erman Komurcu 0:4040347d719c 974
Erman Komurcu 0:4040347d719c 975 return 0;
Erman Komurcu 0:4040347d719c 976 }
Erman Komurcu 0:4040347d719c 977
Erman Komurcu 0:4040347d719c 978 template <class REG>
Erman Komurcu 0:4040347d719c 979 int MAX4146X<REG>::get_lomode(lomode_t* lomode)
Erman Komurcu 0:4040347d719c 980 {
Erman Komurcu 0:4040347d719c 981 int ret;
Erman Komurcu 0:4040347d719c 982
Erman Komurcu 0:4040347d719c 983 ret = read_register(PLL1_ADDR, (uint8_t *) & (this->reg->reg_pll1), 1);
Erman Komurcu 0:4040347d719c 984 if (ret < 0) {
Erman Komurcu 0:4040347d719c 985 return ret;
Erman Komurcu 0:4040347d719c 986 }
Erman Komurcu 0:4040347d719c 987
Erman Komurcu 0:4040347d719c 988 *lomode = (lomode_t)this->reg->reg_pll1.bits.lomode;
Erman Komurcu 0:4040347d719c 989
Erman Komurcu 0:4040347d719c 990 return 0;
Erman Komurcu 0:4040347d719c 991 }
Erman Komurcu 0:4040347d719c 992
Erman Komurcu 0:4040347d719c 993 template <class REG>
Erman Komurcu 0:4040347d719c 994 int MAX4146X<REG>::set_cpval(cpval_t cpval)
Erman Komurcu 0:4040347d719c 995 {
Erman Komurcu 0:4040347d719c 996
Erman Komurcu 0:4040347d719c 997 SET_BIT_FIELD(PLL2_ADDR, this->reg->reg_pll2, this->reg->reg_pll2.bits.cpval, cpval);
Erman Komurcu 0:4040347d719c 998
Erman Komurcu 0:4040347d719c 999 return 0;
Erman Komurcu 0:4040347d719c 1000 }
Erman Komurcu 0:4040347d719c 1001
Erman Komurcu 0:4040347d719c 1002 template <class REG>
Erman Komurcu 0:4040347d719c 1003 int MAX4146X<REG>::get_cpval(cpval_t* cpval)
Erman Komurcu 0:4040347d719c 1004 {
Erman Komurcu 0:4040347d719c 1005 int ret;
Erman Komurcu 0:4040347d719c 1006
Erman Komurcu 0:4040347d719c 1007 ret = read_register(PLL2_ADDR, (uint8_t *) & (this->reg->reg_pll2), 1);
Erman Komurcu 0:4040347d719c 1008 if (ret < 0) {
Erman Komurcu 0:4040347d719c 1009 return ret;
Erman Komurcu 0:4040347d719c 1010 }
Erman Komurcu 0:4040347d719c 1011
Erman Komurcu 0:4040347d719c 1012 *cpval = (cpval_t)this->reg->reg_pll2.bits.cpval;
Erman Komurcu 0:4040347d719c 1013
Erman Komurcu 0:4040347d719c 1014 return 0;
Erman Komurcu 0:4040347d719c 1015 }
Erman Komurcu 0:4040347d719c 1016
Erman Komurcu 0:4040347d719c 1017 template <class REG>
Erman Komurcu 0:4040347d719c 1018 int MAX4146X<REG>::set_frequency(uint32_t freq)
Erman Komurcu 0:4040347d719c 1019 {
Erman Komurcu 0:4040347d719c 1020 uint8_t value[3] = {(uint8_t)(freq >> 16), (uint8_t)(freq >> 8), (uint8_t)freq};
Erman Komurcu 0:4040347d719c 1021
Erman Komurcu 0:4040347d719c 1022 return write_register(PLL3_ADDR, (uint8_t *)&value, 3);
Erman Komurcu 0:4040347d719c 1023
Erman Komurcu 0:4040347d719c 1024 }
Erman Komurcu 0:4040347d719c 1025
Erman Komurcu 0:4040347d719c 1026 template <class REG>
Erman Komurcu 0:4040347d719c 1027 int MAX4146X<REG>::get_frequency(uint32_t* freq)
Erman Komurcu 0:4040347d719c 1028 {
Erman Komurcu 0:4040347d719c 1029 int ret;
Erman Komurcu 0:4040347d719c 1030
Erman Komurcu 0:4040347d719c 1031 uint8_t value[3];
Erman Komurcu 0:4040347d719c 1032
Erman Komurcu 0:4040347d719c 1033 ret = read_register(PLL3_ADDR, (uint8_t *)&value, 3);
Erman Komurcu 0:4040347d719c 1034 if (ret < 0) {
Erman Komurcu 0:4040347d719c 1035 return ret;
Erman Komurcu 0:4040347d719c 1036 }
Erman Komurcu 0:4040347d719c 1037
Erman Komurcu 0:4040347d719c 1038 *freq = (uint32_t)((value[0] << 16) + (value[1] << 8) + value[2]);
Erman Komurcu 0:4040347d719c 1039
Erman Komurcu 0:4040347d719c 1040 return 0;
Erman Komurcu 0:4040347d719c 1041 }
Erman Komurcu 0:4040347d719c 1042
Erman Komurcu 0:4040347d719c 1043 template <class REG>
Erman Komurcu 0:4040347d719c 1044 int MAX4146X<REG>::set_deltaf(uint8_t deltaf)
Erman Komurcu 0:4040347d719c 1045 {
Erman Komurcu 0:4040347d719c 1046 if (deltaf > 127) {
Erman Komurcu 0:4040347d719c 1047 return -1;
Erman Komurcu 0:4040347d719c 1048 }
Erman Komurcu 0:4040347d719c 1049
Erman Komurcu 0:4040347d719c 1050 SET_BIT_FIELD(PLL6_ADDR, this->reg->reg_pll6, this->reg->reg_pll6.bits.deltaf, deltaf);
Erman Komurcu 0:4040347d719c 1051
Erman Komurcu 0:4040347d719c 1052 return 0;
Erman Komurcu 0:4040347d719c 1053 }
Erman Komurcu 0:4040347d719c 1054
Erman Komurcu 0:4040347d719c 1055 template <class REG>
Erman Komurcu 0:4040347d719c 1056 int MAX4146X<REG>::get_deltaf(uint8_t* deltaf)
Erman Komurcu 0:4040347d719c 1057 {
Erman Komurcu 0:4040347d719c 1058 int ret;
Erman Komurcu 0:4040347d719c 1059
Erman Komurcu 0:4040347d719c 1060 ret = read_register(PLL6_ADDR, (uint8_t *) & (this->reg->reg_pll6), 1);
Erman Komurcu 0:4040347d719c 1061 if (ret < 0) {
Erman Komurcu 0:4040347d719c 1062 return ret;
Erman Komurcu 0:4040347d719c 1063 }
Erman Komurcu 0:4040347d719c 1064
Erman Komurcu 0:4040347d719c 1065 *deltaf = (uint8_t)this->reg->reg_pll6.bits.deltaf;
Erman Komurcu 0:4040347d719c 1066
Erman Komurcu 0:4040347d719c 1067 return 0;
Erman Komurcu 0:4040347d719c 1068 }
Erman Komurcu 0:4040347d719c 1069
Erman Komurcu 0:4040347d719c 1070 template <class REG>
Erman Komurcu 0:4040347d719c 1071 int MAX4146X<REG>::set_deltaf_shape(uint8_t deltaf_shape)
Erman Komurcu 0:4040347d719c 1072 {
Erman Komurcu 0:4040347d719c 1073 if (deltaf_shape > 15) {
Erman Komurcu 0:4040347d719c 1074 return -1;
Erman Komurcu 0:4040347d719c 1075 }
Erman Komurcu 0:4040347d719c 1076
Erman Komurcu 0:4040347d719c 1077 SET_BIT_FIELD(PLL7_ADDR, this->reg->reg_pll7, this->reg->reg_pll7.bits.deltaf_shape, deltaf_shape);
Erman Komurcu 0:4040347d719c 1078
Erman Komurcu 0:4040347d719c 1079 return 0;
Erman Komurcu 0:4040347d719c 1080 }
Erman Komurcu 0:4040347d719c 1081
Erman Komurcu 0:4040347d719c 1082 template <class REG>
Erman Komurcu 0:4040347d719c 1083 int MAX4146X<REG>::get_deltaf_shape(uint8_t* deltaf_shape)
Erman Komurcu 0:4040347d719c 1084 {
Erman Komurcu 0:4040347d719c 1085 int ret;
Erman Komurcu 0:4040347d719c 1086
Erman Komurcu 0:4040347d719c 1087 ret = read_register(PLL7_ADDR, (uint8_t *) & (this->reg->reg_pll7), 1);
Erman Komurcu 0:4040347d719c 1088 if (ret < 0) {
Erman Komurcu 0:4040347d719c 1089 return ret;
Erman Komurcu 0:4040347d719c 1090 }
Erman Komurcu 0:4040347d719c 1091
Erman Komurcu 0:4040347d719c 1092 *deltaf_shape = (uint8_t)this->reg->reg_pll7.bits.deltaf_shape;
Erman Komurcu 0:4040347d719c 1093
Erman Komurcu 0:4040347d719c 1094 return 0;
Erman Komurcu 0:4040347d719c 1095 }
Erman Komurcu 0:4040347d719c 1096
Erman Komurcu 0:4040347d719c 1097 template <class REG>
Erman Komurcu 0:4040347d719c 1098 int MAX4146X<REG>::set_pktlen_mode(pktlen_mode_t pktlen_mode)
Erman Komurcu 0:4040347d719c 1099 {
Erman Komurcu 0:4040347d719c 1100 SET_BIT_FIELD(I2C1_ADDR, this->reg->reg_i2c1, this->reg->reg_i2c1.bits.pktlen_mode, pktlen_mode);
Erman Komurcu 0:4040347d719c 1101
Erman Komurcu 0:4040347d719c 1102 return 0;
Erman Komurcu 0:4040347d719c 1103 }
Erman Komurcu 0:4040347d719c 1104
Erman Komurcu 0:4040347d719c 1105 template <class REG>
Erman Komurcu 0:4040347d719c 1106 int MAX4146X<REG>::get_pktlen_mode(pktlen_mode_t* pktlen_mode)
Erman Komurcu 0:4040347d719c 1107 {
Erman Komurcu 0:4040347d719c 1108 int ret;
Erman Komurcu 0:4040347d719c 1109
Erman Komurcu 0:4040347d719c 1110 ret = read_register(I2C1_ADDR, (uint8_t *) & (this->reg->reg_i2c1), 1);
Erman Komurcu 0:4040347d719c 1111 if (ret < 0) {
Erman Komurcu 0:4040347d719c 1112 return ret;
Erman Komurcu 0:4040347d719c 1113 }
Erman Komurcu 0:4040347d719c 1114
Erman Komurcu 0:4040347d719c 1115 *pktlen_mode = (pktlen_mode_t)this->reg->reg_i2c1.bits.pktlen_mode;
Erman Komurcu 0:4040347d719c 1116
Erman Komurcu 0:4040347d719c 1117 return 0;
Erman Komurcu 0:4040347d719c 1118 }
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>::set_i2c_pktlen(uint16_t pktlen)
Erman Komurcu 0:4040347d719c 1123 {
Erman Komurcu 0:4040347d719c 1124 if (pktlen > 0x7FF) {
Erman Komurcu 0:4040347d719c 1125 return -1;
Erman Komurcu 0:4040347d719c 1126 }
Erman Komurcu 0:4040347d719c 1127
Erman Komurcu 0:4040347d719c 1128 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 1129
Erman Komurcu 0:4040347d719c 1130 uint8_t value = (uint8_t)(pktlen & 0xFF);
Erman Komurcu 0:4040347d719c 1131
Erman Komurcu 0:4040347d719c 1132 return write_register(I2C2_ADDR, (uint8_t *)&value, 1);
Erman Komurcu 0:4040347d719c 1133 }
Erman Komurcu 0:4040347d719c 1134
Erman Komurcu 0:4040347d719c 1135 template <class REG>
Erman Komurcu 0:4040347d719c 1136 int MAX4146X<REG>::get_i2c_pktlen(uint16_t* pktlen)
Erman Komurcu 0:4040347d719c 1137 {
Erman Komurcu 0:4040347d719c 1138 int ret;
Erman Komurcu 0:4040347d719c 1139
Erman Komurcu 0:4040347d719c 1140 ret = read_register(I2C1_ADDR, (uint8_t *) & (this->reg->reg_i2c1), 1);
Erman Komurcu 0:4040347d719c 1141 if (ret < 0) {
Erman Komurcu 0:4040347d719c 1142 return ret;
Erman Komurcu 0:4040347d719c 1143 }
Erman Komurcu 0:4040347d719c 1144
Erman Komurcu 0:4040347d719c 1145 ret = read_register(I2C2_ADDR, (uint8_t *) & (this->reg->reg_i2c2), 1);
Erman Komurcu 0:4040347d719c 1146 if (ret < 0) {
Erman Komurcu 0:4040347d719c 1147 return ret;
Erman Komurcu 0:4040347d719c 1148 }
Erman Komurcu 0:4040347d719c 1149
Erman Komurcu 0:4040347d719c 1150 *pktlen = (uint16_t)(((this->reg->reg_i2c1.raw & 0x7F)<<8) + (this->reg->reg_i2c2.raw &0x7F));
Erman Komurcu 0:4040347d719c 1151
Erman Komurcu 0:4040347d719c 1152 return 0;
Erman Komurcu 0:4040347d719c 1153 }
Erman Komurcu 0:4040347d719c 1154
Erman Komurcu 0:4040347d719c 1155 template <class REG>
Erman Komurcu 0:4040347d719c 1156 int MAX4146X<REG>::initial_programming(void)
Erman Komurcu 0:4040347d719c 1157 {
Erman Komurcu 0:4040347d719c 1158 uint8_t value = 0x80;
Erman Komurcu 0:4040347d719c 1159 write_register(ADDL2_ADDR, (uint8_t *)&value, 1);
Erman Komurcu 0:4040347d719c 1160
Erman Komurcu 0:4040347d719c 1161 return write_register(CFG1_ADDR, default_register_value_1, 20);
Erman Komurcu 0:4040347d719c 1162 }
Erman Komurcu 0:4040347d719c 1163
Erman Komurcu 0:4040347d719c 1164 template <>
Erman Komurcu 0:4040347d719c 1165 int MAX4146X<max41460_reg_map_t>::initial_programming(void)
Erman Komurcu 0:4040347d719c 1166 {
Erman Komurcu 0:4040347d719c 1167 if (this->ssel != NULL){
Erman Komurcu 0:4040347d719c 1168 *this->ssel = 0;
Erman Komurcu 0:4040347d719c 1169 wait_us(100);
Erman Komurcu 0:4040347d719c 1170 }
Erman Komurcu 0:4040347d719c 1171
Erman Komurcu 0:4040347d719c 1172 int rtn = write_register(CFG1_ADDR, default_register_value_0, 17);
Erman Komurcu 0:4040347d719c 1173
Erman Komurcu 0:4040347d719c 1174 if (this->ssel != NULL){
Erman Komurcu 0:4040347d719c 1175 wait_us(90);
Erman Komurcu 0:4040347d719c 1176 *this->ssel = 1;
Erman Komurcu 0:4040347d719c 1177 }
Erman Komurcu 0:4040347d719c 1178
Erman Komurcu 0:4040347d719c 1179 return rtn;
Erman Komurcu 0:4040347d719c 1180 }
Erman Komurcu 0:4040347d719c 1181
Erman Komurcu 0:4040347d719c 1182
Erman Komurcu 0:4040347d719c 1183 template class MAX4146X<max41460_reg_map_t>;
Erman Komurcu 0:4040347d719c 1184 template class MAX4146X<max41461_2_reg_map_t>;
Erman Komurcu 0:4040347d719c 1185 template class MAX4146X<max41463_4_reg_map_t>;
Erman Komurcu 0:4040347d719c 1186
Erman Komurcu 0:4040347d719c 1187