First version of the MAX2871 shield library. Includes demo program with terminal for setting frequency on channel A.

Committer:
MI
Date:
Mon Jul 31 23:57:09 2017 +0000
Revision:
1:40b397b31d13
Parent:
0:9f09f1b58389
Committed the wrong version the first time.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MI 0:9f09f1b58389 1 /*******************************************************************************
MI 0:9f09f1b58389 2 * Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
MI 0:9f09f1b58389 3 *
MI 0:9f09f1b58389 4 * Permission is hereby granted, free of charge, to any person obtaining a
MI 0:9f09f1b58389 5 * copy of this software and associated documentation files (the "Software"),
MI 0:9f09f1b58389 6 * to deal in the Software without restriction, including without limitation
MI 0:9f09f1b58389 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
MI 0:9f09f1b58389 8 * and/or sell copies of the Software, and to permit persons to whom the
MI 0:9f09f1b58389 9 * Software is furnished to do so, subject to the following conditions:
MI 0:9f09f1b58389 10 *
MI 0:9f09f1b58389 11 * The above copyright notice and this permission notice shall be included
MI 0:9f09f1b58389 12 * in all copies or substantial portions of the Software.
MI 0:9f09f1b58389 13 *
MI 0:9f09f1b58389 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
MI 0:9f09f1b58389 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MI 0:9f09f1b58389 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
MI 0:9f09f1b58389 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
MI 0:9f09f1b58389 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
MI 0:9f09f1b58389 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
MI 0:9f09f1b58389 20 * OTHER DEALINGS IN THE SOFTWARE.
MI 0:9f09f1b58389 21 *
MI 0:9f09f1b58389 22 * Except as contained in this notice, the name of Maxim Integrated
MI 0:9f09f1b58389 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
MI 0:9f09f1b58389 24 * Products, Inc. Branding Policy.
MI 0:9f09f1b58389 25 *
MI 0:9f09f1b58389 26 * The mere transfer of this software does not imply any licenses
MI 0:9f09f1b58389 27 * of trade secrets, proprietary technology, copyrights, patents,
MI 0:9f09f1b58389 28 * trademarks, maskwork rights, or any other form of intellectual
MI 0:9f09f1b58389 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
MI 0:9f09f1b58389 30 * ownership rights.
MI 0:9f09f1b58389 31 *******************************************************************************
MI 0:9f09f1b58389 32 */
MI 0:9f09f1b58389 33
MI 0:9f09f1b58389 34
MI 0:9f09f1b58389 35 #include "MAX2871.h"
MI 0:9f09f1b58389 36 #include <math.h>
MI 0:9f09f1b58389 37 #include <stdio.h>
MI 0:9f09f1b58389 38
MI 0:9f09f1b58389 39 //****************************************************************************
MI 0:9f09f1b58389 40 MAX2871::MAX2871(SPI &spiBus, PinName le):
MI 0:9f09f1b58389 41 m_spiBus(spiBus), m_le(le, 1)
MI 0:9f09f1b58389 42 {
MI 0:9f09f1b58389 43 f_reference = 50.0;
MI 0:9f09f1b58389 44
MI 0:9f09f1b58389 45 reg0.all = 0x007d0000;
MI 0:9f09f1b58389 46 reg1.all = 0x2000fff9;
MI 0:9f09f1b58389 47 reg2.all = 0x00004042;
MI 0:9f09f1b58389 48 reg3.all = 0x0000000b;
MI 0:9f09f1b58389 49 reg4.all = 0x6180b23c;
MI 0:9f09f1b58389 50 reg5.all = 0x00400005;
MI 0:9f09f1b58389 51 reg6.all = 0x00000000;
MI 0:9f09f1b58389 52 update();
MI 0:9f09f1b58389 53 }
MI 0:9f09f1b58389 54
MI 0:9f09f1b58389 55 //****************************************************************************
MI 0:9f09f1b58389 56 MAX2871::~MAX2871()
MI 0:9f09f1b58389 57 {
MI 0:9f09f1b58389 58 //empty block
MI 0:9f09f1b58389 59 }
MI 0:9f09f1b58389 60
MI 0:9f09f1b58389 61 //****************************************************************************
MI 0:9f09f1b58389 62 void MAX2871::writeRegister(const uint32_t data)
MI 0:9f09f1b58389 63 {
MI 0:9f09f1b58389 64 m_le = 0;
MI 0:9f09f1b58389 65 m_spiBus.write((0xFF000000 & data) >> 24);
MI 0:9f09f1b58389 66 m_spiBus.write((0x00FF0000 & data) >> 16);
MI 0:9f09f1b58389 67 m_spiBus.write((0x0000FF00 & data) >> 8);
MI 0:9f09f1b58389 68 m_spiBus.write( 0x000000FF & data);
MI 0:9f09f1b58389 69 m_le = 1;
MI 0:9f09f1b58389 70 }
MI 0:9f09f1b58389 71
MI 0:9f09f1b58389 72 //****************************************************************************
MI 0:9f09f1b58389 73 void MAX2871::readRegister6()
MI 0:9f09f1b58389 74 {
MI 0:9f09f1b58389 75 uint32_t raw, reg6read;
MI 0:9f09f1b58389 76
MI 0:9f09f1b58389 77 reg5.bits.mux = 1;
MI 0:9f09f1b58389 78 reg2.bits.mux = 0x4;
MI 0:9f09f1b58389 79 writeRegister(reg5.all);
MI 0:9f09f1b58389 80 writeRegister(reg2.all);
MI 0:9f09f1b58389 81
MI 0:9f09f1b58389 82 writeRegister(0x00000006);
MI 0:9f09f1b58389 83
MI 0:9f09f1b58389 84 m_spiBus.format(8,1);
MI 0:9f09f1b58389 85
MI 0:9f09f1b58389 86 raw = m_spiBus.write(0x00);
MI 0:9f09f1b58389 87 reg6read = (reg6read & 0x01FFFFF) + (raw << 25);
MI 0:9f09f1b58389 88 raw = m_spiBus.write(0x00);
MI 0:9f09f1b58389 89 reg6read = (reg6read & 0xFE01FFFF) + (raw << 17);
MI 0:9f09f1b58389 90 raw = m_spiBus.write(0x00);
MI 0:9f09f1b58389 91 reg6read = (reg6read & 0xFFFE01FF) + (raw << 9);
MI 0:9f09f1b58389 92 raw = m_spiBus.write(0x00);
MI 0:9f09f1b58389 93 reg6read = (reg6read & 0xFFFFFE01) + (raw << 1);
MI 0:9f09f1b58389 94 raw = m_spiBus.write(0x00);
MI 0:9f09f1b58389 95 reg6read = (reg6read & 0xFFFFFFFE) + (raw >> 7);
MI 0:9f09f1b58389 96 reg6.all = reg6read;
MI 0:9f09f1b58389 97
MI 0:9f09f1b58389 98 m_spiBus.format(8,0);
MI 0:9f09f1b58389 99 }
MI 0:9f09f1b58389 100
MI 0:9f09f1b58389 101 //****************************************************************************
MI 0:9f09f1b58389 102 void MAX2871::update()
MI 0:9f09f1b58389 103 {
MI 0:9f09f1b58389 104 writeRegister(reg5.all);
MI 0:9f09f1b58389 105 writeRegister(reg4.all);
MI 0:9f09f1b58389 106 writeRegister(reg3.all);
MI 0:9f09f1b58389 107 writeRegister(reg2.all);
MI 0:9f09f1b58389 108 writeRegister(reg1.all);
MI 0:9f09f1b58389 109 writeRegister(reg0.all);
MI 0:9f09f1b58389 110 }
MI 0:9f09f1b58389 111
MI 0:9f09f1b58389 112 //****************************************************************************
MI 0:9f09f1b58389 113 void MAX2871::frequency(const float freq)
MI 0:9f09f1b58389 114 {
MI 0:9f09f1b58389 115 uint32_t n,frac,m = 0;
MI 0:9f09f1b58389 116 float pll_coefficient;
MI 0:9f09f1b58389 117
MI 0:9f09f1b58389 118 float f_pfd = f_reference*(1+reg2.bits.dbr)/(reg2.bits.r*(1+reg2.bits.rdiv2));
MI 0:9f09f1b58389 119
MI 0:9f09f1b58389 120 reg4.bits.diva = 0;
MI 0:9f09f1b58389 121 while(freq*powf(2,reg4.bits.diva) < 3000.0)
MI 0:9f09f1b58389 122 {
MI 0:9f09f1b58389 123 reg4.bits.diva = reg4.bits.diva + 1;
MI 0:9f09f1b58389 124 }
MI 0:9f09f1b58389 125 pll_coefficient = freq*powf(2,reg4.bits.diva)/f_pfd;
MI 0:9f09f1b58389 126
MI 0:9f09f1b58389 127 n = floor(pll_coefficient);
MI 0:9f09f1b58389 128 pll_coefficient = pll_coefficient - n;
MI 0:9f09f1b58389 129
MI 1:40b397b31d13 130 m = 4000;
MI 1:40b397b31d13 131 frac = floor(m*pll_coefficient);
MI 0:9f09f1b58389 132
MI 0:9f09f1b58389 133 reg0.bits.frac = frac;
MI 0:9f09f1b58389 134 reg0.bits.n = n;
MI 0:9f09f1b58389 135 reg1.bits.m = m;
MI 0:9f09f1b58389 136 update();
MI 0:9f09f1b58389 137 }