![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
max4146x_comp
Diff: max4146x/Max4146x.h
- Revision:
- 0:0061165683ee
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/max4146x/Max4146x.h Sun Oct 25 20:10:02 2020 +0000 @@ -0,0 +1,1232 @@ +/******************************************************************************* +* Copyright (C) 2019 Maxim Integrated Products, Inc., All rights Reserved. +* +* This software is protected by copyright laws of the United States and +* of foreign countries. This material may also be protected by patent laws +* and technology transfer regulations of the United States and of foreign +* countries. This software is furnished under a license agreement and/or a +* nondisclosure agreement and may only be used or reproduced in accordance +* with the terms of those agreements. Dissemination of this information to +* any party or parties not specified in the license agreement and/or +* nondisclosure agreement is expressly prohibited. +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES +* OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +* OTHER DEALINGS IN THE SOFTWARE. +* +* Except as contained in this notice, the name of Maxim Integrated +* Products, Inc. shall not be used except as stated in the Maxim Integrated +* Products, Inc. Branding Policy. +* +* The mere transfer of this software does not imply any licenses +* of trade secrets, proprietary technology, copyrights, patents, +* trademarks, maskwork rights, or any other form of intellectual +* property whatsoever. Maxim Integrated Products, Inc. retains all +* ownership rights. +******************************************************************************* +*/ + +#ifndef MAX4146x_H_ +#define MAX4146x_H_ + +#include "mbed.h" +#include "Max41460_regs.h" +#include "Max41461_2_regs.h" +#include "Max41463_4_regs.h" + +#define I2C_ADDRESS 0xD2 + +/** + * @brief Base Class for All Maxim Max4146x RF Transmitters + * + * @details The MAX4146X is a UHF sub-GHz ISM/SRD transmitter + */ +template <class REG> +class MAX4146X +{ +private: + REG *reg; + I2C *i2c_handler; + SPI *spi_handler; + DigitalOut *ssel; + + //manchester coding variables + unsigned char *manchester_bit_array; + unsigned char *bits_array; + static const unsigned char mask = 1; // Bit mask + char data_rate; + DigitalOut *data_sent; // data sent pin + + uint8_t preset_mode; + float crystal_frequency ; + float center_frequency; + float baud_rate; + + typedef enum { + CFG1_ADDR = 0x00, + CFG2_ADDR = 0x01, + CFG3_ADDR = 0x02, + CFG4_ADDR = 0x03, + CFG5_ADDR = 0x04, + SHDN_ADDR = 0x05, + PA1_ADDR = 0x06, + PA2_ADDR = 0x07, + PLL1_ADDR = 0x08, + PLL2_ADDR = 0x09, + CFG6_ADDR = 0x0A, + PLL3_ADDR = 0x0B, + PLL4_ADDR = 0x0C, + PLL5_ADDR = 0x0D, + PLL6_ADDR = 0x0E, + PLL7_ADDR = 0x0F, + CFG7_ADDR = 0x10, + I2C1_ADDR = 0x11, + I2C2_ADDR = 0x12, + I2C3_ADDR = 0x13, + I2C4_ADDR = 0x14, + I2C5_ADDR = 0x15, + I2C6_ADDR = 0x16, + CFG8_ADDR = 0x17, + CFG9_ADDR = 0x18, + ADDL1_ADDR = 0x19, + ADDL2_ADDR = 0x1A, + } register_address_t; + +//Functions + +protected: + + //Functions + int io_write(uint8_t *data, uint32_t length); + +public: + + //Constructors + MAX4146X(REG *reg, SPI *spi, DigitalOut *cs); + + MAX4146X(REG *reg, SPI *spi); + + MAX4146X(REG *reg, I2C *i2c); + + MAX4146X(DigitalOut *cs); + + + /** + * @brief Register Configuration + * + * @details + * - Register : CFG1(0x00) + * - Bit Fields : [7:6] + * - Default : 0x2 + * - Description : Start delay before enabling XO clock to digital block + */ + typedef enum { + XOCLKDELAY_0_CYCLE, /**< 0x0: No delay. XO clock is immediately enabled to rest of digital block */ + XOCLKDELAY_16_CYCLE, /**< 0x1: XO clock is enabled after 16 cycles to rest of digital block */ + XOCLKDELAY_32_CYCLE, /**< 0x2: XO clock is enabled after 32 cycles to rest of digital block */ + XOCLKDELAY_64_CYCLE, /**< 0x3: XO clock is enabled after 64 cycles to rest of digital block */ + } xoclkdelay_t; + + /** + * @brief Set start delay before enabling XO clock to digital block + * + * @param[in] delay delay cycle + * + * @returns 0 on success, negative error code on failure. + */ + int set_xoclkdelay(xoclkdelay_t delay); + + /** + * @brief Get start delay before enabling XO clock to digital block + * + * @param[in] delay delay cycle + * + * @returns 0 on success, negative error code on failure. + */ + int get_xoclkdelay(xoclkdelay_t *delay); + + /** + * @brief Register Configuration + * + * @details + * -Register : CFG1(0x00) + * - Bit Fields : [5:4] + * - Default : 0x2 + * - Description : XO clock division ratio for digital block + */ + typedef enum { + XOCLKDIV_BY_4, /**< 0x0: Divide XO clock by 4 for digital clock */ + XOCLKDIV_BY_5, /**< 0x1: Divide XO clock by 5 for digital clock. High time is 2 cycles, low time is 3 cycles */ + XOCLKDIV_BY_6, /**< 0x2: Divide XO clock by 6 for digital clock */ + XOCLKDIV_BY_7, /**< 0x3: Divide XO clock by 7 for digital clock. High time is 3 cycles, + and low time is 4 cycles */ + } xoclkdiv_t; + + /** + * @brief Set XO clock division ratio for digital block + * + * @param[in] div division ratio + * + * @returns 0 on success, negative error code on failure. + */ + int set_xoclkdiv(xoclkdiv_t div); + + /** + * @brief Get XO clock division ratio for digital block + * + * @param[in] div division ratio + * + * @returns 0 on success, negative error code on failure. + */ + int get_xoclkdiv(xoclkdiv_t *div); + + /** + * @brief Register Configuration + * + * @details + * - Register : CFG1(0x00) + * - Bit Fields : [2] + * - Default : 0b0 + * - Description : Sets the state of FSK Gaussian Shaping + */ + typedef enum { + FSKSHAPE_DISABLE, /**< 0x0: FSK Shaping disabled */ + FSKSHAPE_ENABLE, /**< 0x1: FSK Shaping enabled */ + } fskshape_t; + + /** + * @brief Sets the state of FSK Gaussian Shaping + * + * @param[in] shape enable/disable fskshaping + * + * @returns 0 on success, negative error code on failure. + */ + int set_fskshape(fskshape_t shape); + + /** + * @brief Gets the state of FSK Gaussian Shaping + * + * @param[in] shape enable/disable fskshaping + * + * @returns 0 on success, negative error code on failure. + */ + int get_fskshape(fskshape_t *shape); + + /** + * @brief Register Configuration + * + * @details + * - Register : CFG1(0x00) + * - Bit Fields : [1] + * - Default : 0b0 + * - Description : Controls if clock output acts as an input. When an input, + * it will sample the DATA pin. + */ + typedef enum { + SYNC_0, /**< 0x0: asynchronous transmission mode */ + SYNC_1, /**< 0x1: synchronous transmission mode */ + } sync_t; + + /** + * @brief Sets the state of clock pin + * + * @param[in] state pin state async/sync + * + * @returns 0 on success, negative error code on failure. + */ + int set_sync(sync_t state); + + /** + * @brief Gets the state of clock pin + * + * @param[in] state pin state async/sync + * + * @returns 0 on success, negative error code on failure. + */ + int get_sync(sync_t *state); + + /** + * @brief Register Configuration + * + * @details + * - Register : CFG1(0x00) + * - Bit Fields : [0] + * - Default : 0b0 + * - Description : Configures modulator mode + */ + typedef enum { + MODMODE_ASK, /**< 0x0: ASK Mode */ + MODMODE_FSK, /**< 0x1: FSK Mode */ + } modmode_t; + + /** + * @brief Sets modulator mode to ASK or FSK + * + * @param[in] mode ASK or FSK + * + * @returns 0 on success, negative error code on failure. + */ + int set_modmode(modmode_t mode); + + /** + * @brief Gets modulator mode + * + * @param[in] mode ASK or FSK + * + * @returns 0 on success, negative error code on failure. + */ + int get_modmode(modmode_t* mode); + + /** + * @brief Register Configuration + * + * @details + * - Register : CFG2(0x01) + * - Bit Fields : [7:6] + * - Default : 0x2 + * - Description : Selects the delay when CLKOUT starts + * toggling upon exiting SHUTDOWN mode, + * in divided XO clock cycles + */ + typedef enum { + CLKOUT_DELAY_64_CYCLE, /**< 0x0: CLKOUT will start toggling after 64 cycles + whenever moving into normal mode from shutdown mode */ + CLKOUT_DELAY_128_CYCLE, /**< 0x1: CLKOUT will start toggling after 128 cycles + whenever moving into normal mode from shutdown mode */ + CLKOUT_DELAY_256_CYCLE, /**< 0x2: CLKOUT will start toggling after 256 cycles + whenever moving into normal mode from shutdown mode */ + CLKOUT_DELAY_512_CYCLE, /**< 0x3: CLKOUT will start toggling after 512 cycles + whenever moving into normal mode from shutdown mode */ + } clkout_delay_t; + + /** + * @brief Sets clkout delay + * + * @param[in] delay delay cycles + * + * @returns 0 on success, negative error code on failure. + */ + int set_clkout_delay(clkout_delay_t delay); + + /** + * @brief Gets clkout delay + * + * @param[in] delay delay cycles + * + * @returns 0 on success, negative error code on failure. + */ + int get_clkout_delay(clkout_delay_t* delay); + + /** + * @brief Register Configuration + * + * @details + * - Register : CFG2(0x01) + * - Bit Fields : [2:0] + * - Default : 0x1 + * - Description : Baud clock post-divider setting. + */ + typedef enum { + BCLK_POSTDIV_RESERVED_0, /**< 0x0: RESERVED */ + BCLK_POSTDIV_BY_1, /**< 0x1: Divide by 1 */ + BCLK_POSTDIV_BY_2, /**< 0x2: Divide by 2 */ + BCLK_POSTDIV_BY_3, /**< 0x3: Divide by 3 */ + BCLK_POSTDIV_BY_4, /**< 0x4: Divide by 4 */ + BCLK_POSTDIV_BY_5, /**< 0x5: Divide by 5 */ + BCLK_POSTDIV_RESERVED_6, /**< 0x6: RESERVED */ + BCLK_POSTDIV_RESERVED_7, /**< 0x7: RESERVED */ + } bclk_postdiv_t; + + /** + * @brief Sets baud clock post-divider + * + * @param[in] div divider value + * + * @returns 0 on success, negative error code on failure. + */ + int set_bclk_postdiv(bclk_postdiv_t div); + + /** + * @brief Gets baud clock post-divider + * + * @param[in] div divider value + * + * @returns 0 on success, negative error code on failure. + */ + int get_bclk_postdiv(bclk_postdiv_t* div); + + /** + * @brief Register Configuration + * + * @details + * - Register : CFG4(0x03) + * - Bit Fields : [1:0] + * - Default : 0x0 + * - Description : Power Down Mode Select. + */ + typedef enum { + PWDN_MODE_SHUTDOWN, /**< 0x0: SHUTDOWN low power state is enabled. While entering + low power state, XO, PLL, and PA are shutdown. */ + PWDN_MODE_STANDBY, /**< 0x1: STANDBY low power state is enabled. While entering + low power state, XO is enabled. PLL and PA are shutdown */ + PWDN_MODE_FAST_WAKEUP, /**< 0x2: FAST WAKEUP low power state is enabled. While entering + low power state, XO and PLL are enabled. PA is shutdown. */ + PWDN_MODE_REVERT_TO_FAST_WAKEUP, /**< 0x3: Will revert to 0x2 */ + } pwdn_mode_t; + + /** + * @brief Sets power down mode + * + * @param[in] pwdn_mode power down mode + * + * @returns 0 on success, negative error code on failure. + */ + int set_pwdn_mode(pwdn_mode_t pwdn_mode); + + /** + * @brief Gets power down mode + * + * @param[in] pwdn_mode power down mode + * + * @returns 0 on success, negative error code on failure. + */ + int get_pwdn_mode(pwdn_mode_t* pwdn_mode); + + /** + * @brief Register Configuration + * + * @details + * - Register : SHDN(0x05) + * - Bit Fields : [0] + * - Default : 0x0 + * - Description : Enables a boost in PA output power for frequencies above 850MHz. + * This requires a different PA match compared to normal operation. + */ + typedef enum { + PA_BOOST_NORMAL_MODE, /**< 0x0: PA Output power in normal operation. */ + PA_BOOST_BOOST_MODE, /**< 0x1: PA Output power in boost mode for more output power. */ + } pa_boost_t; + + /** + * @brief enable/disable boost mode + * + * @param[in] pa_boost power amplifier output mode + * + * @returns 0 on success, negative error code on failure. + */ + int set_pa_boost(pa_boost_t pa_boost); + + /** + * @brief Gets boost mode + * + * @param[in] pa_boost power amplifier output mode + * + * @returns 0 on success, negative error code on failure. + */ + int get_pa_boost(pa_boost_t* pa_boost); + + /** + * @brief Register Configuration + * + * @details + * - Register : PA1(0x06) + * - Bit Fields : [2:0] + * - Default : 0x0 + * - Description : Controls the PA output power by enabling parallel drivers. + */ + typedef enum { + PAPWR_1_DRIVER, /**< 0x0: Minimum, 1 driver */ + PAPWR_2_DRIVER, /**< 0x1: 2 Drivers */ + PAPWR_3_DRIVER, /**< 0x2: 3 Drivers */ + PAPWR_4_DRIVER, /**< 0x3: 4 Drivers */ + PAPWR_5_DRIVER, /**< 0x4: 5 Drivers */ + PAPWR_6_DRIVER, /**< 0x5: 6 Drivers */ + PAPWR_7_DRIVER, /**< 0x6: 7 Drivers */ + PAPWR_8_DRIVER, /**< 0x7: 8 Drivers */ + } papwr_t; + + /** + * @brief set PA output power by enabling parallel drivers + * + * @param[in] papwr number of parallel drivers + * + * @returns 0 on success, negative error code on failure. + */ + int set_papwr(papwr_t papwr); + + /** + * @brief Gets PA output power + * + * @param[in] papwr number of parallel drivers + * + * @returns 0 on success, negative error code on failure. + */ + int get_papwr(papwr_t* papwr); + + + /** + * @brief Register Configuration + * + * @details + * - Register : PA2(0x07) + * - Bit Fields : [4:0] + * - Default : 0x00 + * - Description : Controls shunt capacitance on PA output in fF. + */ + typedef enum { + PACAP_0_fF, + PACAP_175_fF, + PACAP_350_fF, + PACAP_525_fF, + PACAP_700_fF, + PACAP_875_fF, + PACAP_1050_fF, + PACAP_1225_fF, + PACAP_1400_fF, + PACAP_1575_fF, + PACAP_1750_fF, + PACAP_1925_fF, + PACAP_2100_fF, + PACAP_2275_fF, + PACAP_2450_fF, + PACAP_2625_fF, + PACAP_2800_fF, + PACAP_2975_fF, + PACAP_3150_fF, + PACAP_3325_fF, + PACAP_3500_fF, + PACAP_3675_fF, + PACAP_3850_fF, + PACAP_4025_fF, + PACAP_4200_fF, + PACAP_4375_fF, + PACAP_4550_fF, + PACAP_4725_fF, + PACAP_4900_fF, + PACAP_5075_fF, + PACAP_5250_fF, + PACAP_5425_fF, + } pacap_t; + + /** + * @brief set shunt capacitance value + * + * @param[in] pacap shunt capacitance value + * + * @returns 0 on success, negative error code on failure. + */ + int set_pacap(pacap_t pacap); + + /** + * @brief Gets shunt capacitance value + * + * @param[in] pacap shunt capacitance value + * + * @returns 0 on success, negative error code on failure. + */ + int get_pacap(pacap_t* pacap); + + /** + * @brief Register Configuration + * + * @details + * - Register : PLL1(0x08) + * - Bit Fields : [7:6] + * -Default : 0x1 + * - Description : Sets the level of charge pump offset current + * for fractional N mode to improve close in + * phase noise. Set to 'DISABLED' for integer N mode. + */ + typedef enum { + CPLIN_NO_EXTRA_CURRENT, /**< 0x0: No extra current */ + CPLIN_CHARGE_PUMP_CURRENT_5_PERCENT, /**< 0x1: 5% of charge pump current */ + CPLIN_CHARGE_PUMP_CURRENT_10_PERCENT, /**< 0x2: 10% of charge pump current */ + CPLIN_CHARGE_PUMP_CURRENT_15_PERCENT, /**< 0x3: 15% of charge pump current */ + } cplin_t; + + /** + * @brief set level of charge pump offset current + * + * @param[in] cplin percentage of charge pump current + * + * @returns 0 on success, negative error code on failure. + */ + int set_cplin(cplin_t cplin); + + /** + * @brief Gets level of charge pump offset current + * + * @param[in] cplin percentage of charge pump current + * + * @returns 0 on success, negative error code on failure. + */ + int get_cplin(cplin_t* cplin); + + + /** + * @brief Register Configuration + * + * @details + * - Register : PLL1(0x08) + * - Bit Fields : [5] + * - Default : 0b1 + * - Description : Sets PLL between fractional-N and integer-N mode. + * + */ + typedef enum { + FRACMODE_INTEGER_N, /**< 0x0: Integer N Mode */ + RACMODE_FRACTIONAL_N, /**< 0x1: Fractional N Mode */ + } fracmode_t; + + /** + * @brief set PLL mode + * + * @param[in] fracmode Integer N/Fractional N mode + * + * @returns 0 on success, negative error code on failure. + */ + int set_fracmode(fracmode_t fracmode); + + /** + * @brief Gets PLL mode + * + * @param[in] fracmode Integer N/Fractional N mode + * + * @returns 0 on success, negative error code on failure. + */ + int get_fracmode(fracmode_t* fracmode); + + /* Register Configuration + * + * @Register : PLL1(0x08) + * @Bit Fields : [2:1] + * @Default : 0x0 + * @Description : + */ + typedef enum { + LODIV_DISABLED, /**< 0x0: Disabled */ + LODIV_DIVIDE_BY_4, /**< 0x1: LC VCO divided by 4 */ + LODIV_DIVIDE_BY_8, /**< 0x2: LC VCO divided by 8 */ + LODIV_DIVIDE_BY_12, /**< 0x3: LC VCO divided by 12 */ + } lodiv_t; + + /** + * @brief set divider of LC VCO + * + * @param[in] lodiv divider value + * + * @returns 0 on success, negative error code on failure. + */ + int set_lodiv(lodiv_t lodiv); + + /** + * @brief Gets divider of LC VCO + * + * @param[in] lodiv divider value + * + * @returns 0 on success, negative error code on failure. + */ + int get_lodiv(lodiv_t* lodiv); + + /** + * @brief Register Configuration + * + * @details + * - Register : PLL1(0x08) + * - Bit Fields : [0] + * - Default : 0b0 + * - Description : Sets LO generation. For lower power, choose LOWCURRENT. + * For higher performance, choose LOWNOISE + */ + typedef enum { + LOMODE_RING_OSCILLATOR, /**< 0x0: Ring Oscillator Mode */ + LOMODE_LC_VCO, /**< 0x1: LC VCO Mode */ + } lomode_t; + + /** + * @brief set LO generation + * + * @param[in] lomode selection of mode + * + * @returns 0 on success, negative error code on failure. + */ + int set_lomode(lomode_t lomode); + + /** + * @brief Gets LO generation + * + * @param[in] lomode selection of mode + * + * @returns 0 on success, negative error code on failure. + */ + int get_lomode(lomode_t* lomode); + + /** + * @brief Register Configuration + * + * @details + * - Register : PLL2(0x09) + * - Bit Fields : [1:0] + * - Default : 0x0 + * - Description : Sets Charge Pump Current in microAmpere + * + */ + typedef enum { + CPVAL_5_UA, /**< 0x0: 5�A */ + CPVAL_10_UA, /**< 0x1: 10�A */ + CPVAL_15_UA, /**< 0x2: 15�A */ + CPVAL_20_UA, /**< 0x3: 20�A */ + } cpval_t; + + /** + * @brief set charge pump current + * + * @param[in] cpval current value + * + * @returns 0 on success, negative error code on failure. + */ + int set_cpval(cpval_t cpval); + + /** + * @brief Gets charge pump current + * + * @param[in] cpval current value + * + * @returns 0 on success, negative error code on failure. + */ + int get_cpval(cpval_t* cpval); + + /** + * Register Configuration + * + * @details + * - Register : CFG6(0x0A) + * - Bit Fields : [2] + * - Default : 0b0 + * - Description : Enables DATA transmission in I2C mode. Aliased address for I2C_TXEN1. + */ + typedef enum { + I2C_TXEN1_DISABLE, /**< 0x0: Data transmission not enabled in I2C mode. */ + I2C_TXEN1_ENABLE, /**< 0x1: Data transmission enabled in I2C mode. */ + } i2c_txen1_t; + + int set_i2c_txen1(i2c_txen1_t setting); //sdivarci + + /** Register Configuration + * + * @details + * - Register : CFG6(0x0A) + * - Bit Fields : [1] + * - Default : 0b0 + * - Description : Transmission enable. + */ + typedef enum { + SPI_TXEN1_DISABLE, /**< 0x0: Transmission disabled. */ + SPI_TXEN1_ENABLE, /**< 0x1: Transmission enabled. */ + } spi_txen1_t; + + /** + * @brief Register Configuration + * + * @details + * - Register : CFG6(0x0A) + * - Bit Fields : [0] + * - Default : 0b0 + * - Description : Four wire readback on CLKOUT pin mode. + * + */ + typedef enum { + FOURWIRE1_READBACK_DISABLE, /**< 0x0: Four wire readback disabled. */ + FOURWIRE1_READBACK_ENABLE, /**< 0x1: Four wire readback enabled. */ + } fourwire1_t; + + + /** + * @brief Register Configuration + * + * @details + * - Register : CFG7(0x10) + * - Bit Fields : [2] + * - Default : 0b0 + * - Description : Enables DATA transmission in I2C mode. Aliased address for I2C_TXEN1 + */ + typedef enum { + I2C_TXEN2_DISABLE, /**< 0x0: Data transmission not enabled in I2C mode. */ + I2C_TXEN2_ENABLE, /**< 0x1: Data transmission enabled in I2C mode. */ + } i2c_txen2_t; + + int set_i2c_txen2(i2c_txen2_t setting); //sdivarci + /** + * @brief Register Configuration + * + * @details + * - Register : CFG7(0x10) + * - Bit Fields : [1] + * - Default : 0b0 + * - Description : Transmission enable. + */ + typedef enum { + SPI_TXEN2_DISABLE, /**< 0x0: Transmission disabled. */ + SPI_TXEN2_ENABLE, /**< 0x1: Transmission enabled. */ + } spi_txen2_t; + + + /** + * @brief Register Configuration + * + * @details + * - Register : CFG7(0x10) + * - Bit Fields : [0] + * - Default : 0b0 + * - Description : Four wire readback on CLKOUT pin mode. Aliased address for FOURWIRE1 + */ + typedef enum { + FOURWIRE2_READBACK_DISABLE, /**< 0x0: Four wire readback disabled. */ + FOURWIRE2_READBACK_ENABLE, /**< 0x1: Four wire readback enabled. */ + } fourwire2_t; + + + + /** + * @brief Register Configuration + * + * @details + * - Register : I2C1(0x11) + * - Bit Fields : [7] + * - Default : 0b0 + * - Description : Packet Length Mode + * + */ + typedef enum { + PKTLEN_MODE_SET_LENGTH, /**< 0x0: PKTLEN[14:0] need not be programmed. FIFO underflow event will + be treated as end of packet event. For cases where actual packet length + is greater than 32767 bits, it is expected that the �C will pad + such a packet to make it an integral multiple of 8-bits */ + PKTLEN_MODE_NO_SET_LENGTH, /**< 0x1: PKTLEN[14:0] will provide the length of packet. Once FIFO is + read for PKTLEN[14:0] bits, or if FIFO underflow, MAX4146x will consider + that as an end of packet event. */ + } pktlen_mode_t; + + /** + * @brief set packet length + * + * @param[in] pktlen_mode packet length mode + * + * @returns 0 on success, negative error code on failure. + */ + int set_pktlen_mode(pktlen_mode_t pktlen_mode); + + /** + * @brief Gets packet length + * + * @param[in] pktlen_mode packet length mode + * + * @returns 0 on success, negative error code on failure. + */ + int get_pktlen_mode(pktlen_mode_t* pktlen_mode); + + + /** + * @brief Register Configuration + * + * @details + * - Register : CFG8(0x17) + * - Bit Fields : [0] + * - Default : 0b0 + * - Description : Places DUT into software reset. + */ + typedef enum { + SOFTRESET_DEASSERT, /**< 0x0: Deassert the reset */ + SOFTRESET_RESET, /**< 0x1: Resets the entire digital, until this bit is set to 0 */ + } softreset_t; + + /** + * @brief set softreset bit + * + * @param[in] softreset enable/disable + * + * @returns 0 on success, negative error code on failure. + */ + int set_softreset(softreset_t softreset); + + /** + * @brief Operation state of the rf transmitter + * + * @details + * - Default : 0b0 + * - Description : Places DUT into software reset. + */ + typedef enum { + INITIALIZED = 0, + UNINITIALIZED = 1, + UNKNOWN = 2, + } operation_mode_t; + + + // Indicates whether initialization is successful + operation_mode_t operation_mode; + + /** + * @brief get fifo flags (I2C6) Read only + * + * @param[in] fifo_flags 8-bit fifo flags + * + * @returns 0 on success, negative error code on failure. + */ + int get_fifo_flags(uint8_t *fifo_flags); + + /** + * @brief get pktcomplete bit field flags (I2C4) Read only + * + * @param[in] pktcomplete 0x0: Packet transmission is not completed + * 0x1: Packet transmission is completed + * + * @returns 0 on success, negative error code on failure. + */ + int get_pktcomplete(uint8_t *pktcomplete); + + /** + * @brief get packet length of transmitted packet + * + * @param[in] pktlen Provides status information of bits transmitted for the current packet + * + * @returns 0 on success, negative error code on failure. + */ + int get_tx_pktlen(uint16_t *pktlen); + + + /* PUBLIC FUNCTION DECLARATIONS */ + + /** + * @brief Read from a register. + * + * @param[in] reg Address of a register to be read. + * @param[out] value Pointer to save result value. + * @param[in] len Size of result to be read. + * + * @returns 0 on success, negative error code on failure. + */ + int read_register(uint8_t reg, uint8_t *value, uint8_t len); + + /** + * @brief Write to a register. + * + * @param[in] reg Address of a register to be written. + * @param[out] value Pointer of value to be written to register. + * @param[in] len Size of result to be written. + * + * @returns 0 on success, negative error code on failure. + */ + int write_register(uint8_t reg, const uint8_t *value, uint8_t len); + + /** + * @brief Initial programming steps after power on or soft reset. + * + * @returns 0 on success, negative error code on failure. + */ + int initial_programming(void); + + /** + * @brief Set Baud clock predivision ratio + * + * @param[in] prediv values between 3 and 255 + * + * @returns 0 on success, negative error code on failure. + */ + int set_bclk_prediv(uint8_t prediv); + + /** + * @brief Gets Baud clock predivision ratio + * + * @param[in] prediv values between 3 and 255 + * + * @returns 0 on success, negative error code on failure. + */ + int get_bclk_prediv(uint8_t* prediv); + + /** + * @brief Controls GFSK shaping + * + * @param[in] tstep values between 0 and 31 + * + * @returns 0 on success, negative error code on failure. + */ + int set_tstep(uint8_t tstep); + + /** + * @brief Gets tstep + * + * @param[in] tstep values between 0 and 31 + * + * @returns 0 on success, negative error code on failure. + */ + int get_tstep(uint8_t* tstep); + + /** + * @brief Set PLL frequency + * + * @param[in] freq FREQ value to PLL between 0x00 and 0xFFFFFF + * + * @returns 0 on success, negative error code on failure. + * + * @description LO frequency = FREQ<23:0>/2^16*fXTAL + */ + int set_frequency(uint32_t freq); + + /** + * @brief Gets PLL frequency + * + * @param[in] freq FREQ value to PLL between 0x00 and 0xFFFFFF + * + * @returns 0 on success, negative error code on failure. + * + * @description LO frequency = FREQ<23:0>/2^16*fXTAL + */ + int get_frequency(uint32_t* freq); + + /** + * @brief Set frequency deviation from the space frequency for the mark frequency + * + * @param[in] deltaf frequency deviation value + * + * @returns 0 on success, negative error code on failure. + * + * @description fDELTA = DELTAF[6:0]* fXTAL/8192 + */ + int set_deltaf(uint8_t deltaf); + + /** + * @brief Get frequency deviation from the space frequency for the mark frequency + * + * @param[in] deltaf frequency deviation value + * + * @returns 0 on success, negative error code on failure. + * + * @description fDELTA = DELTAF[6:0]* fXTAL/8192 + */ + int get_deltaf(uint8_t* deltaf); + + /** + * @brief Set frequency deviation from the space frequency for the mark frequency + * + * @param[in] deltaf_shape frequency deviation value + * + * @returns 0 on success, negative error code on failure. + * + * @description fDELTA = DELTAF_SHAPE[3:0]* fXTAL/81920 + */ + int set_deltaf_shape(uint8_t deltaf_shape); + + /** + * @brief Gets frequency deviation from the space frequency for the mark frequency + * + * @param[in] deltaf_shape frequency deviation value + * + * @returns 0 on success, negative error code on failure. + * + * @description fDELTA = DELTAF_SHAPE[3:0]* fXTAL/81920 + */ + int get_deltaf_shape(uint8_t* deltaf_shape); + + /** + * @brief Set Packet Length for I2C communication + * + * @param[in] pktlen values between 0x00 and 0x7FF + * + * @returns 0 on success, negative error code on failure. + */ + int set_i2c_pktlen(uint16_t pktlen); + + /** + * @brief Gets Packet Length for I2C communication + * + * @param[in] pktlen values between 0x00 and 0x7FF + * + * @returns 0 on success, negative error code on failure. + */ + int get_i2c_pktlen(uint16_t* pktlen); + + /** + * @brief Adjust baud rate + * + * @param[in] baud_rate preferred baud rate + * + * @returns 0 on success, negative error code on failure. + * + * @description It changes only the values of BCLK_PREDIV and BCLK_POSTDIV + * Baud_rate = f_clk/((1+BCLK_PREDIV)x2^(1+BCLK_POSTDIV)) + * where f_clk = f_xtal/XOCLKDIV_ratio + * Note that to maintain the internal 3.2MHz time base, + * XOCLKDIV[1:0] (register CFG1, 0x00, bit 4) must be programmed, + * based on the crystal frequency + */ + int adjust_baudrate(float rate); + + /** + * @brief Gets baud rate + * + * @returns baud rate. + * + */ + float get_baudrate(); + + /** + * @brief Adjust Manchester Bitrate + * + * @param[in] data_rate preferred data rate in (1-50)kbps + * + * @returns 0 on success, negative error code on failure. + */ + int adjust_manchester_bitrate(char rate); + + /** + * @brief Get Manchester Bitrate + * + * @returns data rate in (1-50)kbps + */ + char get_manchester_bitrate(); + + /** + * @brief Configures the crystal frequency of the chip (Fxtal) + * + * @param[in] freq crystal frequency values between 12.8 MHz and 19.2 MHz + * + * @returns 0 on success, negative error code on failure. + */ + int set_crystal_frequency(float freq); + + /** + * @brief Get the crystal frequency of the chip (Fxtal) + * + * @returns crystal frequency values between 12.8 MHz and 19.2 MHz + */ + float get_crystal_frequency(); + + /** + * @brief Adjust center/carrier frequency of the chip + * + * @param[in] freq center/carrier frequency value between 250 MHz and 950 MHz + * + * @returns 0 on success, negative error code on failure. + */ + int set_center_frequency(float freq); + + /** + * @brief Gets center/carrier frequency of the chip + * + * @returns center/carrier frequency value between 250 MHz and 950 MHz + */ + float get_center_frequency(); + + /** + * @brief set the FSK deviation values (Delta_f) + * + * @param[in] deviation deviation value in in kHz baud rate + * + * @returns 0 on success, negative error code on failure. + * + * @description The mark frequency is defined by the space frequency + * plus a frequency deviation. If frequency shaping is + * disabled by setting FSKSHAPE = 0 (register CFG1, bit 2), + * the frequency deviation is defined by DELTAF[6:0] + * (register PLL6, bits 6:0). + * DELTAF[6 : 0] = (Delta_f * 8192)f_xtal + * If frequency shaping is enabled by setting FSKSHAPE = 1 + * (register CFG1, bit 2), the frequency deviation is defined + * by DETLAF_SHAPE[3:0] (register PLL7, bits 3:0). + * DELTAF_SHAPE[3 : 0] = (Delta_f * 8192)/(f_xtal * 10) + */ + int adjust_frequency_deviation(float deviation); + + /** + * @brief Send data for selected Preset/I2C/SPI mode + * + * @param[in] data data pointer for data to be transferred + * @param[in] length legth of data to be transferred + * + * @returns 0 on success, negative error code on failure. + */ + int send_data(uint8_t *data, uint32_t length); + + int set_i2c_data(uint8_t setting); //sdivarci +}; + + +/** MAX41460 Device Class + * + * Hold configurations for the MAX41460 + */ +class MAX41460 : public MAX4146X <max41460_reg_map_t> +{ + max41460_reg_map_t regmap; +public: + MAX41460(SPI *spi, DigitalOut *cs) : MAX4146X<max41460_reg_map_t>(®map, spi, cs) {} + + MAX41460(SPI *spi) : MAX4146X<max41460_reg_map_t>(®map, spi) {} + + MAX41460(DigitalOut *cs) : MAX4146X(cs) {} + +}; + +/** MAX41461 Device Class + * + * Hold configurations for the MAX41461 + */ +class MAX41461 : public MAX4146X <max41461_2_reg_map_t> +{ + max41461_2_reg_map_t regmap; +public: + MAX41461(I2C *i2c) : MAX4146X<max41461_2_reg_map_t>(®map, i2c) {} + + MAX41461(DigitalOut *cs) : MAX4146X(cs) {} +}; + +/** MAX41462 Device Class + * + * Hold configurations for the MAX41462 + */ +class MAX41462 : public MAX41461 +{ +public: + MAX41462(I2C *i2c) : MAX41461(i2c) {} + + MAX41462(DigitalOut *cs) : MAX41461(cs) {} + +}; + +/** MAX41463 Device Class + * + * Hold configurations for the MAX41463 + */ +class MAX41463 : public MAX4146X <max41463_4_reg_map_t> +{ + max41463_4_reg_map_t regmap; +public: + MAX41463(I2C *i2c) : MAX4146X<max41463_4_reg_map_t>(®map, i2c) {} + + MAX41463(DigitalOut *cs) : MAX4146X(cs) {} + +}; + +/** MAX41464 Device Class + * + * Hold configurations for the MAX41464 + */ +class MAX41464 : public MAX41463 +{ +public: + MAX41464(I2C *i2c) : MAX41463(i2c) {} + + MAX41464(DigitalOut *cs) : MAX41463(cs) {} + +}; + + +#endif /* MAX4146x_H_ */